xref: /reactos/dll/ntdll/dispatch/dispatch.c (revision 4019caae)
1 /*
2  * COPYRIGHT:       See COPYING in the top level directory
3  * PROJECT:         ReactOS NT Library
4  * FILE:            dll/ntdll/dispatch/dispatch.c
5  * PURPOSE:         User-Mode NT Dispatchers
6  * PROGRAMERS:      Alex Ionescu (alex@relsoft.net)
7  *                  David Welch <welch@cwcom.net>
8  */
9 
10 /* INCLUDES *****************************************************************/
11 
12 #include <ntdll.h>
13 #define NDEBUG
14 #include <debug.h>
15 
16 typedef NTSTATUS (NTAPI *USER_CALL)(PVOID Argument, ULONG ArgumentLength);
17 
18 /* FUNCTIONS ****************************************************************/
19 
20 /*
21  * @implemented
22  */
23 VOID
24 NTAPI
25 KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord,
26                           PCONTEXT Context)
27 {
28     EXCEPTION_RECORD NestedExceptionRecord;
29     NTSTATUS Status;
30 
31     /* Dispatch the exception and check the result */
32     if (RtlDispatchException(ExceptionRecord, Context))
33     {
34         /* Continue executing */
35         Status = NtContinue(Context, FALSE);
36     }
37     else
38     {
39         /* Raise an exception */
40         Status = NtRaiseException(ExceptionRecord, Context, FALSE);
41     }
42 
43     /* Setup the Exception record */
44     NestedExceptionRecord.ExceptionCode = Status;
45     NestedExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
46     NestedExceptionRecord.ExceptionRecord = ExceptionRecord;
47     NestedExceptionRecord.NumberParameters = Status;
48 
49     /* Raise the exception */
50     RtlRaiseException(&NestedExceptionRecord);
51 }
52 
53 /*
54  * @implemented
55  */
56 VOID
57 NTAPI
58 KiRaiseUserExceptionDispatcher(VOID)
59 {
60     EXCEPTION_RECORD ExceptionRecord;
61 
62     /* Setup the exception record */
63     ExceptionRecord.ExceptionCode = ((PTEB)NtCurrentTeb())->ExceptionCode;
64     ExceptionRecord.ExceptionFlags = 0;
65     ExceptionRecord.ExceptionRecord = NULL;
66     ExceptionRecord.NumberParameters = 0;
67 
68     /* Raise the exception */
69     RtlRaiseException(&ExceptionRecord);
70 }
71 
72 /*
73  * @implemented
74  */
75 VOID
76 NTAPI
77 KiUserCallbackDispatcher(ULONG Index,
78                          PVOID Argument,
79                          ULONG ArgumentLength)
80 {
81     /* Return with the result of the callback function */
82     USER_CALL *KernelCallbackTable = NtCurrentPeb()->KernelCallbackTable;
83     ZwCallbackReturn(NULL,
84                      0,
85                      KernelCallbackTable[Index](Argument, ArgumentLength));
86 }
87