2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: ntoskrnl/ex/error.c
5 * PURPOSE: Error Functions and Status/Exception Dispatching/Raising
7 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) - Created File
10 /* INCLUDES *****************************************************************/
14 #include <internal/debug.h>
16 /* GLOBALS ****************************************************************/
18 BOOLEAN ExReadyForErrors
= FALSE
;
19 PEPORT ExpDefaultErrorPort
= NULL
;
20 PEPROCESS ExpDefaultErrorPortProcess
= NULL
;
22 /* FUNCTIONS ****************************************************************/
29 ExRaiseAccessViolation(VOID
)
31 /* Raise the Right Status */
32 RtlRaiseStatus(STATUS_ACCESS_VIOLATION
);
40 ExRaiseDatatypeMisalignment (VOID
)
42 /* Raise the Right Status */
43 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT
);
51 ExSystemExceptionFilter(VOID
)
53 return KeGetPreviousMode() != KernelMode
? EXCEPTION_EXECUTE_HANDLER
: EXCEPTION_CONTINUE_SEARCH
;
61 ExRaiseHardError(IN NTSTATUS ErrorStatus
,
62 IN ULONG NumberOfParameters
,
63 IN ULONG UnicodeStringParameterMask
,
64 IN PULONG_PTR Parameters
,
65 IN ULONG ValidResponseOptions
,
73 NtRaiseHardError(IN NTSTATUS ErrorStatus
,
74 IN ULONG NumberOfParameters
,
75 IN ULONG UnicodeStringParameterMask
,
76 IN PULONG_PTR Parameters
,
77 IN ULONG ValidResponseOptions
,
80 DPRINT1("Hard error %x\n", ErrorStatus
);
82 /* Call the Executive Function (WE SHOULD PUT SEH HERE/CAPTURE!) */
83 ExRaiseHardError(ErrorStatus
,
85 UnicodeStringParameterMask
,
91 return STATUS_SUCCESS
;
96 NtSetDefaultHardErrorPort(IN HANDLE PortHandle
)
98 KPROCESSOR_MODE PreviousMode
= ExGetPreviousMode();
99 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
101 /* Check if we have the Privilege */
102 if(!SeSinglePrivilegeCheck(SeTcbPrivilege
, PreviousMode
)) {
104 DPRINT1("NtSetDefaultHardErrorPort: Caller requires the SeTcbPrivilege privilege!\n");
105 return STATUS_PRIVILEGE_NOT_HELD
;
108 /* Only called once during bootup, make sure we weren't called yet */
109 if(!ExReadyForErrors
) {
111 Status
= ObReferenceObjectByHandle(PortHandle
,
115 (PVOID
*)&ExpDefaultErrorPort
,
118 /* Check for Success */
119 if(NT_SUCCESS(Status
)) {
122 ExpDefaultErrorPortProcess
= PsGetCurrentProcess();
123 ExReadyForErrors
= TRUE
;
134 /* Not supported in Kernel Mode */
135 RtlRaiseStatus(STATUS_NOT_IMPLEMENTED
);