Reverting to 13775. Sorry for the mess. This is dedicated to Jane! 19934415.
[reactos.git] / reactos / ntoskrnl / ke / error.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/ke/error.c
6 * PURPOSE: Error reason setting/getting
7 *
8 * PROGRAMMERS: David Welch
9 */
10
11 /* INCLUDE *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #include <internal/debug.h>
15
16 /* FUNCTIONS ***************************************************************/
17
18 BOOLEAN ExReadyForErrors = FALSE;
19 PEPORT ExpDefaultErrorPort = NULL;
20 PEPROCESS ExpDefaultErrorPortProcess = NULL;
21
22 /*
23 * @unimplemented
24 */
25 VOID
26 STDCALL
27 KiCoprocessorError(
28 VOID
29 )
30 {
31 UNIMPLEMENTED;
32 }
33
34 /*
35 * @unimplemented
36 */
37 VOID
38 STDCALL
39 KiUnexpectedInterrupt(
40 VOID
41 )
42 {
43 UNIMPLEMENTED;
44 }
45
46 NTSTATUS STDCALL
47 NtRaiseHardError(IN NTSTATUS ErrorStatus,
48 IN ULONG NumberOfParameters,
49 IN PUNICODE_STRING UnicodeStringParameterMask OPTIONAL,
50 IN PVOID *Parameters,
51 IN HARDERROR_RESPONSE_OPTION ResponseOption,
52 OUT PHARDERROR_RESPONSE Response)
53 {
54 DPRINT1("Hard error %x\n", ErrorStatus);
55 return(STATUS_SUCCESS);
56 }
57
58 NTSTATUS STDCALL
59 NtSetDefaultHardErrorPort(IN HANDLE PortHandle)
60 {
61 KPROCESSOR_MODE PreviousMode;
62 NTSTATUS Status;
63
64 PreviousMode = ExGetPreviousMode();
65
66 if(!SeSinglePrivilegeCheck(SeTcbPrivilege,
67 PreviousMode))
68 {
69 DPRINT1("NtSetDefaultHardErrorPort: Caller requires the SeTcbPrivilege privilege!\n");
70 return STATUS_PRIVILEGE_NOT_HELD;
71 }
72
73 /* serialization shouldn't be required here as it usually is just called once
74 during startup */
75
76 if(!ExReadyForErrors)
77 {
78 Status = ObReferenceObjectByHandle(PortHandle,
79 0,
80 LpcPortObjectType,
81 PreviousMode,
82 (PVOID*)&ExpDefaultErrorPort,
83 NULL);
84 if(NT_SUCCESS(Status))
85 {
86 ExpDefaultErrorPortProcess = PsGetCurrentProcess();
87 ExReadyForErrors = TRUE;
88 }
89 }
90 else
91 {
92 Status = STATUS_UNSUCCESSFUL;
93 }
94
95 return Status;
96 }
97
98 /* EOF */