Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788/* * 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 */VOIDNTAPIKiUserExceptionDispatcher(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 */VOIDNTAPIKiRaiseUserExceptionDispatcher(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 */VOIDNTAPIKiUserCallbackDispatcher(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));}