reactos/dll/ntdll/dispatch/dispatch.c

88 lines
2.3 KiB
C

/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS NT Library
* FILE: dll/ntdll/dispatch/dispatch.c
* PURPOSE: User-Mode NT Dispatchers
* PROGRAMERS: Alex Ionescu (alex@relsoft.net)
* David Welch <welch@cwcom.net>
*/
/* INCLUDES *****************************************************************/
#include <ntdll.h>
#define NDEBUG
#include <debug.h>
typedef NTSTATUS (NTAPI *USER_CALL)(PVOID Argument, ULONG ArgumentLength);
/* FUNCTIONS ****************************************************************/
/*
* @implemented
*/
VOID
NTAPI
KiUserExceptionDispatcher(PEXCEPTION_RECORD ExceptionRecord,
PCONTEXT Context)
{
EXCEPTION_RECORD NestedExceptionRecord;
NTSTATUS Status;
/* Dispatch the exception and check the result */
if (RtlDispatchException(ExceptionRecord, Context))
{
/* Continue executing */
Status = NtContinue(Context, FALSE);
}
else
{
/* Raise an exception */
Status = NtRaiseException(ExceptionRecord, Context, FALSE);
}
/* Setup the Exception record */
NestedExceptionRecord.ExceptionCode = Status;
NestedExceptionRecord.ExceptionFlags = EXCEPTION_NONCONTINUABLE;
NestedExceptionRecord.ExceptionRecord = ExceptionRecord;
NestedExceptionRecord.NumberParameters = Status;
/* Raise the exception */
RtlRaiseException(&NestedExceptionRecord);
}
/*
* @implemented
*/
VOID
NTAPI
KiRaiseUserExceptionDispatcher(VOID)
{
EXCEPTION_RECORD ExceptionRecord;
/* Setup the exception record */
ExceptionRecord.ExceptionCode = ((PTEB)NtCurrentTeb())->ExceptionCode;
ExceptionRecord.ExceptionFlags = 0;
ExceptionRecord.ExceptionRecord = NULL;
ExceptionRecord.NumberParameters = 0;
/* Raise the exception */
RtlRaiseException(&ExceptionRecord);
}
/*
* @implemented
*/
VOID
NTAPI
KiUserCallbackDispatcher(ULONG Index,
PVOID Argument,
ULONG ArgumentLength)
{
/* Return with the result of the callback function */
USER_CALL *KernelCallbackTable = NtCurrentPeb()->KernelCallbackTable;
ZwCallbackReturn(NULL,
0,
KernelCallbackTable[Index](Argument, ArgumentLength));
}