c428499cacf063115d3786d9fec1074961067b40
[reactos.git] / reactos / ntoskrnl / ex / error.c
1 /*
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
6 *
7 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) - Created File
8 */
9
10 /* INCLUDES *****************************************************************/
11
12 #include <ntoskrnl.h>
13 #define NDEBUG
14 #include <internal/debug.h>
15
16 /* GLOBALS ****************************************************************/
17
18 BOOLEAN ExReadyForErrors = FALSE;
19 PEPORT ExpDefaultErrorPort = NULL;
20 PEPROCESS ExpDefaultErrorPortProcess = NULL;
21
22 /* FUNCTIONS ****************************************************************/
23
24 /*
25 * @implemented
26 */
27 VOID
28 STDCALL
29 ExRaiseAccessViolation(VOID)
30 {
31 /* Raise the Right Status */
32 RtlRaiseStatus(STATUS_ACCESS_VIOLATION);
33 }
34
35 /*
36 * @implemented
37 */
38 VOID
39 STDCALL
40 ExRaiseDatatypeMisalignment (VOID)
41 {
42 /* Raise the Right Status */
43 RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
44 }
45
46 /*
47 * @implemented
48 */
49 LONG
50 STDCALL
51 ExSystemExceptionFilter(VOID)
52 {
53 return KeGetPreviousMode() != KernelMode ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
54 }
55
56 /*
57 * @unimplemented
58 */
59 VOID
60 STDCALL
61 ExRaiseHardError(IN NTSTATUS ErrorStatus,
62 IN ULONG NumberOfParameters,
63 IN ULONG UnicodeStringParameterMask,
64 IN PULONG_PTR Parameters,
65 IN ULONG ValidResponseOptions,
66 OUT PULONG Response)
67 {
68 UNIMPLEMENTED;
69 }
70
71 NTSTATUS
72 STDCALL
73 NtRaiseHardError(IN NTSTATUS ErrorStatus,
74 IN ULONG NumberOfParameters,
75 IN ULONG UnicodeStringParameterMask,
76 IN PULONG_PTR Parameters,
77 IN ULONG ValidResponseOptions,
78 OUT PULONG Response)
79 {
80 DPRINT1("Hard error %x\n", ErrorStatus);
81
82 /* Call the Executive Function (WE SHOULD PUT SEH HERE/CAPTURE!) */
83 ExRaiseHardError(ErrorStatus,
84 NumberOfParameters,
85 UnicodeStringParameterMask,
86 Parameters,
87 ValidResponseOptions,
88 Response);
89
90 /* Return Success */
91 return STATUS_SUCCESS;
92 }
93
94 NTSTATUS
95 STDCALL
96 NtSetDefaultHardErrorPort(IN HANDLE PortHandle)
97 {
98
99 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
100 NTSTATUS Status = STATUS_UNSUCCESSFUL;
101
102 /* Check if we have the Privilege */
103 if(!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode)) {
104
105 DPRINT1("NtSetDefaultHardErrorPort: Caller requires the SeTcbPrivilege privilege!\n");
106 return STATUS_PRIVILEGE_NOT_HELD;
107 }
108
109 /* Only called once during bootup, make sure we weren't called yet */
110 if(!ExReadyForErrors) {
111
112 Status = ObReferenceObjectByHandle(PortHandle,
113 0,
114 LpcPortObjectType,
115 PreviousMode,
116 (PVOID*)&ExpDefaultErrorPort,
117 NULL);
118
119 /* Check for Success */
120 if(NT_SUCCESS(Status)) {
121
122 /* Save the data */
123 ExpDefaultErrorPortProcess = PsGetCurrentProcess();
124 ExReadyForErrors = TRUE;
125 }
126 }
127
128 return Status;
129 }
130
131 /* EOF */