fixed registry querying code in Ki386SetProcessorFeatures
[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 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
99 NTSTATUS Status = STATUS_UNSUCCESSFUL;
100
101 /* Check if we have the Privilege */
102 if(!SeSinglePrivilegeCheck(SeTcbPrivilege, PreviousMode)) {
103
104 DPRINT1("NtSetDefaultHardErrorPort: Caller requires the SeTcbPrivilege privilege!\n");
105 return STATUS_PRIVILEGE_NOT_HELD;
106 }
107
108 /* Only called once during bootup, make sure we weren't called yet */
109 if(!ExReadyForErrors) {
110
111 Status = ObReferenceObjectByHandle(PortHandle,
112 0,
113 LpcPortObjectType,
114 PreviousMode,
115 (PVOID*)&ExpDefaultErrorPort,
116 NULL);
117
118 /* Check for Success */
119 if(NT_SUCCESS(Status)) {
120
121 /* Save the data */
122 ExpDefaultErrorPortProcess = PsGetCurrentProcess();
123 ExReadyForErrors = TRUE;
124 }
125 }
126
127 return Status;
128 }
129
130 VOID
131 __cdecl
132 _purecall(VOID)
133 {
134 /* Not supported in Kernel Mode */
135 RtlRaiseStatus(STATUS_NOT_IMPLEMENTED);
136 }
137
138 /* EOF */