- Fix some formatting.

svn path=/trunk/; revision=20428
This commit is contained in:
Alex Ionescu 2005-12-29 18:03:24 +00:00
parent e642f64e26
commit ba6ca2fce0
2 changed files with 270 additions and 255 deletions

View file

@ -1,11 +1,10 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS Kernel
* FILE: ntoskrnl/nt/event.c * FILE: ntoskrnl/ex/event.c
* PURPOSE: Named event support * PURPOSE: Event support
* * PROGRAMMERS: Alex Ionescu(alex@relsoft.net)
* PROGRAMMERS: Alex Ionescu(alex@relsoft.net) - Fixed bugs/commented * Thomas Weidenmueller
* Philip Susi and David Welch
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -22,14 +21,15 @@
POBJECT_TYPE ExEventObjectType = NULL; POBJECT_TYPE ExEventObjectType = NULL;
static GENERIC_MAPPING ExpEventMapping = { GENERIC_MAPPING ExpEventMapping =
{
STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE, STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE,
STANDARD_RIGHTS_WRITE | SYNCHRONIZE | EVENT_MODIFY_STATE, STANDARD_RIGHTS_WRITE | SYNCHRONIZE | EVENT_MODIFY_STATE,
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE, STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE,
EVENT_ALL_ACCESS}; EVENT_ALL_ACCESS};
static const INFORMATION_CLASS_INFO ExEventInfoClass[] = { static const INFORMATION_CLASS_INFO ExEventInfoClass[] =
{
/* EventBasicInformation */ /* EventBasicInformation */
ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION), sizeof(ULONG), ICIF_QUERY), ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION), sizeof(ULONG), ICIF_QUERY),
}; };
@ -38,35 +38,33 @@ static const INFORMATION_CLASS_INFO ExEventInfoClass[] = {
VOID VOID
INIT_FUNCTION INIT_FUNCTION
STDCALL NTAPI
ExpInitializeEventImplementation(VOID) ExpInitializeEventImplementation(VOID)
{ {
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
UNICODE_STRING Name; UNICODE_STRING Name;
DPRINT("Creating Event Object Type\n");
DPRINT("Creating Event Object Type\n"); /* Create the Event Object Type */
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
/* Create the Event Object Type */ RtlInitUnicodeString(&Name, L"Event");
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
RtlInitUnicodeString(&Name, L"Event"); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT);
ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); ObjectTypeInitializer.GenericMapping = ExpEventMapping;
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT); ObjectTypeInitializer.PoolType = NonPagedPool;
ObjectTypeInitializer.GenericMapping = ExpEventMapping; ObjectTypeInitializer.ValidAccessMask = EVENT_ALL_ACCESS;
ObjectTypeInitializer.PoolType = NonPagedPool; ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ExEventObjectType);
ObjectTypeInitializer.ValidAccessMask = EVENT_ALL_ACCESS;
ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ExEventObjectType);
} }
/* /*
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtClearEvent(IN HANDLE EventHandle) NtClearEvent(IN HANDLE EventHandle)
{ {
PKEVENT Event; PKEVENT Event;
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
/* Reference the Object */ /* Reference the Object */
@ -78,8 +76,8 @@ NtClearEvent(IN HANDLE EventHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Clear the Event and Dereference */ /* Clear the Event and Dereference */
KeClearEvent(Event); KeClearEvent(Event);
ObDereferenceObject(Event); ObDereferenceObject(Event);
@ -89,12 +87,11 @@ NtClearEvent(IN HANDLE EventHandle)
return Status; return Status;
} }
/* /*
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtCreateEvent(OUT PHANDLE EventHandle, NtCreateEvent(OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
@ -105,22 +102,26 @@ NtCreateEvent(OUT PHANDLE EventHandle,
PKEVENT Event; PKEVENT Event;
HANDLE hEvent; HANDLE hEvent;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtCreateEvent(0x%p, 0x%x, 0x%p)\n", EventHandle, DesiredAccess, ObjectAttributes); DPRINT("NtCreateEvent(0x%p, 0x%x, 0x%p)\n",
EventHandle, DesiredAccess, ObjectAttributes);
/* Check Output Safety */
if(PreviousMode != KernelMode) {
_SEH_TRY {
/* Check if we were called from user-mode */
if(PreviousMode != KernelMode)
{
/* Enter SEH Block */
_SEH_TRY
{
/* Check handle pointer */
ProbeForWriteHandle(EventHandle); ProbeForWriteHandle(EventHandle);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -136,8 +137,8 @@ NtCreateEvent(OUT PHANDLE EventHandle,
(PVOID*)&Event); (PVOID*)&Event);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Initalize the Event */ /* Initalize the Event */
KeInitializeEvent(Event, KeInitializeEvent(Event,
EventType, EventType,
@ -153,17 +154,17 @@ NtCreateEvent(OUT PHANDLE EventHandle,
ObDereferenceObject(Event); ObDereferenceObject(Event);
/* Check for success and return handle */ /* Check for success and return handle */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
_SEH_TRY { _SEH_TRY
{
*EventHandle = hEvent; *EventHandle = hEvent;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
} }
@ -175,7 +176,7 @@ NtCreateEvent(OUT PHANDLE EventHandle,
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtOpenEvent(OUT PHANDLE EventHandle, NtOpenEvent(OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes) IN POBJECT_ATTRIBUTES ObjectAttributes)
@ -183,22 +184,26 @@ NtOpenEvent(OUT PHANDLE EventHandle,
HANDLE hEvent; HANDLE hEvent;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtOpenEvent(0x%p, 0x%x, 0x%p)\n", EventHandle, DesiredAccess, ObjectAttributes); DPRINT("NtOpenEvent(0x%p, 0x%x, 0x%p)\n",
EventHandle, DesiredAccess, ObjectAttributes);
/* Check Output Safety */
if(PreviousMode != KernelMode) {
_SEH_TRY {
/* Check if we were called from user-mode */
if(PreviousMode != KernelMode)
{
/* Enter SEH Block */
_SEH_TRY
{
/* Check handle pointer */
ProbeForWriteHandle(EventHandle); ProbeForWriteHandle(EventHandle);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -211,18 +216,20 @@ NtOpenEvent(OUT PHANDLE EventHandle,
NULL, NULL,
&hEvent); &hEvent);
/* Check for success and return handle */ /* Check for success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
_SEH_TRY { /* Enter SEH for return */
_SEH_TRY
{
/* Return the handle to the caller */
*EventHandle = hEvent; *EventHandle = hEvent;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
/* Return status */ /* Return status */
@ -233,30 +240,33 @@ NtOpenEvent(OUT PHANDLE EventHandle,
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtPulseEvent(IN HANDLE EventHandle, NtPulseEvent(IN HANDLE EventHandle,
OUT PLONG PreviousState OPTIONAL) OUT PLONG PreviousState OPTIONAL)
{ {
PKEVENT Event; PKEVENT Event;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n", DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
EventHandle, PreviousState); EventHandle, PreviousState);
/* Check buffer validity */ /* Check if we were called from user-mode */
if(PreviousState && PreviousMode != KernelMode) { if((PreviousState) && (PreviousMode != KernelMode))
{
_SEH_TRY { /* Entry SEH Block */
_SEH_TRY
{
/* Make sure the state pointer is valid */
ProbeForWriteLong(PreviousState); ProbeForWriteLong(PreviousState);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -269,24 +279,26 @@ NtPulseEvent(IN HANDLE EventHandle,
NULL); NULL);
/* Check for success */ /* Check for success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Pulse the Event */ /* Pulse the Event */
LONG Prev = KePulseEvent(Event, EVENT_INCREMENT, FALSE); LONG Prev = KePulseEvent(Event, EVENT_INCREMENT, FALSE);
ObDereferenceObject(Event); ObDereferenceObject(Event);
/* Return it */ /* Check if caller wants the old state back */
if(PreviousState) { if(PreviousState)
{
_SEH_TRY { /* Entry SEH Block for return */
_SEH_TRY
{
/* Return previous state */
*PreviousState = Prev; *PreviousState = Prev;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
} }
@ -294,12 +306,11 @@ NtPulseEvent(IN HANDLE EventHandle,
return Status; return Status;
} }
/* /*
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtQueryEvent(IN HANDLE EventHandle, NtQueryEvent(IN HANDLE EventHandle,
IN EVENT_INFORMATION_CLASS EventInformationClass, IN EVENT_INFORMATION_CLASS EventInformationClass,
OUT PVOID EventInformation, OUT PVOID EventInformation,
@ -310,7 +321,6 @@ NtQueryEvent(IN HANDLE EventHandle,
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PEVENT_BASIC_INFORMATION BasicInfo = (PEVENT_BASIC_INFORMATION)EventInformation; PEVENT_BASIC_INFORMATION BasicInfo = (PEVENT_BASIC_INFORMATION)EventInformation;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtQueryEvent(0x%p, 0x%x)\n", EventHandle, EventInformationClass); DPRINT("NtQueryEvent(0x%p, 0x%x)\n", EventHandle, EventInformationClass);
@ -322,8 +332,8 @@ NtQueryEvent(IN HANDLE EventHandle,
EventInformationLength, EventInformationLength,
ReturnLength, ReturnLength,
PreviousMode); PreviousMode);
if(!NT_SUCCESS(Status)) { if(!NT_SUCCESS(Status))
{
/* Invalid buffers */ /* Invalid buffers */
DPRINT("NtQuerySemaphore() failed, Status: 0x%x\n", Status); DPRINT("NtQuerySemaphore() failed, Status: 0x%x\n", Status);
return Status; return Status;
@ -338,22 +348,23 @@ NtQueryEvent(IN HANDLE EventHandle,
NULL); NULL);
/* Check for success */ /* Check for success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
_SEH_TRY { /* Entry SEH Block */
_SEH_TRY
{
/* Return Event Type and State */ /* Return Event Type and State */
BasicInfo->EventType = Event->Header.Type; BasicInfo->EventType = Event->Header.Type;
BasicInfo->EventState = KeReadStateEvent(Event); BasicInfo->EventState = KeReadStateEvent(Event);
/* Return length */ /* Return length */
if(ReturnLength) *ReturnLength = sizeof(EVENT_BASIC_INFORMATION); if(ReturnLength) *ReturnLength = sizeof(EVENT_BASIC_INFORMATION);
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
/* Dereference the Object */ /* Dereference the Object */
ObDereferenceObject(Event); ObDereferenceObject(Event);
@ -367,30 +378,33 @@ NtQueryEvent(IN HANDLE EventHandle,
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtResetEvent(IN HANDLE EventHandle, NtResetEvent(IN HANDLE EventHandle,
OUT PLONG PreviousState OPTIONAL) OUT PLONG PreviousState OPTIONAL)
{ {
PKEVENT Event; PKEVENT Event;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n", DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
EventHandle, PreviousState); EventHandle, PreviousState);
/* Check buffer validity */ /* Check if we were called from user-mode */
if(PreviousState && PreviousMode != KernelMode) { if((PreviousState) && (PreviousMode != KernelMode))
{
_SEH_TRY { /* Entry SEH Block */
_SEH_TRY
{
/* Make sure the state pointer is valid */
ProbeForWriteLong(PreviousState); ProbeForWriteLong(PreviousState);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -403,24 +417,26 @@ NtResetEvent(IN HANDLE EventHandle,
NULL); NULL);
/* Check for success */ /* Check for success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Reset the Event */ /* Reset the Event */
LONG Prev = KeResetEvent(Event); LONG Prev = KeResetEvent(Event);
ObDereferenceObject(Event); ObDereferenceObject(Event);
/* Return it */ /* Check if caller wants the old state back */
if(PreviousState) { if(PreviousState)
{
_SEH_TRY { /* Entry SEH Block for return */
_SEH_TRY
{
/* Return previous state */
*PreviousState = Prev; *PreviousState = Prev;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
} }
@ -432,30 +448,33 @@ NtResetEvent(IN HANDLE EventHandle,
* @implemented * @implemented
*/ */
NTSTATUS NTSTATUS
STDCALL NTAPI
NtSetEvent(IN HANDLE EventHandle, NtSetEvent(IN HANDLE EventHandle,
OUT PLONG PreviousState OPTIONAL) OUT PLONG PreviousState OPTIONAL)
{ {
PKEVENT Event; PKEVENT Event;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n", DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
EventHandle, PreviousState); EventHandle, PreviousState);
/* Check buffer validity */ /* Check if we were called from user-mode */
if(PreviousState != NULL && PreviousMode != KernelMode) { if((PreviousState) && (PreviousMode != KernelMode))
{
_SEH_TRY { /* Entry SEH Block */
_SEH_TRY
{
/* Make sure the state pointer is valid */
ProbeForWriteLong(PreviousState); ProbeForWriteLong(PreviousState);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -468,24 +487,26 @@ NtSetEvent(IN HANDLE EventHandle,
NULL); NULL);
/* Check for success */ /* Check for success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Set the Event */ /* Set the Event */
LONG Prev = KeSetEvent(Event, EVENT_INCREMENT, FALSE); LONG Prev = KeSetEvent(Event, EVENT_INCREMENT, FALSE);
ObDereferenceObject(Event); ObDereferenceObject(Event);
/* Return it */ /* Check if caller wants the old state back */
if(PreviousState) { if(PreviousState)
{
_SEH_TRY { /* Entry SEH Block for return */
_SEH_TRY
{
/* Return previous state */
*PreviousState = Prev; *PreviousState = Prev;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
} }

View file

@ -1,13 +1,10 @@
/* /*
* COPYRIGHT: See COPYING in the top level directory * COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel * PROJECT: ReactOS Kernel
* FILE: ntoskrnl/ex/evtpair.c * FILE: ntoskrnl/ex/evtpair.c
* PURPOSE: Support for event pairs * PURPOSE: Support for event pairs
* * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
* PROGRAMMERS: Alex Ionescu (Commented, reorganized, removed Thread Pair, used * Thomas Weidenmueller
* KeInitializeEventPair, added SEH)
* David Welch (welch@mcmail.com)
* Skywing (skywing@valhallalegends.com)
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -24,39 +21,39 @@
POBJECT_TYPE ExEventPairObjectType = NULL; POBJECT_TYPE ExEventPairObjectType = NULL;
static GENERIC_MAPPING ExEventPairMapping = { GENERIC_MAPPING ExEventPairMapping =
{
STANDARD_RIGHTS_READ, STANDARD_RIGHTS_READ,
STANDARD_RIGHTS_WRITE, STANDARD_RIGHTS_WRITE,
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
EVENT_PAIR_ALL_ACCESS}; EVENT_PAIR_ALL_ACCESS
};
/* FUNCTIONS *****************************************************************/ /* FUNCTIONS *****************************************************************/
VOID VOID
INIT_FUNCTION INIT_FUNCTION
STDCALL NTAPI
ExpInitializeEventPairImplementation(VOID) ExpInitializeEventPairImplementation(VOID)
{ {
OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
UNICODE_STRING Name; UNICODE_STRING Name;
DPRINT("Creating Event Pair Object Type\n");
DPRINT("Creating Event Pair Object Type\n"); /* Create the Event Pair Object Type */
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
/* Create the Event Pair Object Type */ RtlInitUnicodeString(&Name, L"EventPair");
RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
RtlInitUnicodeString(&Name, L"EventPair"); ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT_PAIR);
ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); ObjectTypeInitializer.GenericMapping = ExEventPairMapping;
ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT_PAIR); ObjectTypeInitializer.PoolType = NonPagedPool;
ObjectTypeInitializer.GenericMapping = ExEventPairMapping; ObjectTypeInitializer.ValidAccessMask = EVENT_PAIR_ALL_ACCESS;
ObjectTypeInitializer.PoolType = NonPagedPool; ObjectTypeInitializer.UseDefaultObject = TRUE;
ObjectTypeInitializer.ValidAccessMask = EVENT_PAIR_ALL_ACCESS; ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ExEventPairObjectType);
ObjectTypeInitializer.UseDefaultObject = TRUE;
ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ExEventPairObjectType);
} }
NTSTATUS NTSTATUS
STDCALL NTAPI
NtCreateEventPair(OUT PHANDLE EventPairHandle, NtCreateEventPair(OUT PHANDLE EventPairHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes) IN POBJECT_ATTRIBUTES ObjectAttributes)
@ -65,22 +62,25 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
HANDLE hEventPair; HANDLE hEventPair;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle); DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle);
/* Check Output Safety */ /* Check if we were called from user-mode */
if(PreviousMode != KernelMode) { if(PreviousMode != KernelMode)
{
_SEH_TRY { /* Enter SEH Block */
_SEH_TRY
{
/* Check handle pointer */
ProbeForWriteHandle(EventPairHandle); ProbeForWriteHandle(EventPairHandle);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -97,8 +97,8 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
(PVOID*)&EventPair); (PVOID*)&EventPair);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Initalize the Event */ /* Initalize the Event */
DPRINT("Initializing EventPair\n"); DPRINT("Initializing EventPair\n");
KeInitializeEventPair(EventPair); KeInitializeEventPair(EventPair);
@ -113,17 +113,17 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
ObDereferenceObject(EventPair); ObDereferenceObject(EventPair);
/* Check for success and return handle */ /* Check for success and return handle */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
_SEH_TRY { _SEH_TRY
{
*EventPairHandle = hEventPair; *EventPairHandle = hEventPair;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
} }
@ -132,7 +132,7 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
} }
NTSTATUS NTSTATUS
STDCALL NTAPI
NtOpenEventPair(OUT PHANDLE EventPairHandle, NtOpenEventPair(OUT PHANDLE EventPairHandle,
IN ACCESS_MASK DesiredAccess, IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes) IN POBJECT_ATTRIBUTES ObjectAttributes)
@ -140,21 +140,24 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
HANDLE hEventPair; HANDLE hEventPair;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE(); PAGED_CODE();
/* Check Output Safety */ /* Check if we were called from user-mode */
if(PreviousMode != KernelMode) { if(PreviousMode != KernelMode)
{
_SEH_TRY { /* Enter SEH Block */
_SEH_TRY
{
/* Check handle pointer */
ProbeForWriteHandle(EventPairHandle); ProbeForWriteHandle(EventPairHandle);
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { }
_SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
_SEH_END;
} _SEH_END; /* Bail out if pointer was invalid */
if(!NT_SUCCESS(Status)) return Status; if(!NT_SUCCESS(Status)) return Status;
} }
@ -168,32 +171,30 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
&hEventPair); &hEventPair);
/* Check for success and return handle */ /* Check for success and return handle */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
_SEH_TRY { _SEH_TRY
{
*EventPairHandle = hEventPair; *EventPairHandle = hEventPair;
}
} _SEH_EXCEPT(_SEH_ExSystemExceptionFilter) { _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
{
Status = _SEH_GetExceptionCode(); Status = _SEH_GetExceptionCode();
}
} _SEH_END; _SEH_END;
} }
/* Return status */ /* Return status */
return Status; return Status;
} }
NTSTATUS NTSTATUS
STDCALL NTAPI
NtSetHighEventPair(IN HANDLE EventPairHandle) NtSetHighEventPair(IN HANDLE EventPairHandle)
{ {
PKEVENT_PAIR EventPair; PKEVENT_PAIR EventPair;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle); DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle);
@ -206,8 +207,8 @@ NtSetHighEventPair(IN HANDLE EventPairHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Set the Event */ /* Set the Event */
KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE); KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE);
@ -220,15 +221,14 @@ NtSetHighEventPair(IN HANDLE EventPairHandle)
} }
NTSTATUS NTSTATUS
STDCALL NTAPI
NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle) NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
{ {
PKEVENT_PAIR EventPair; PKEVENT_PAIR EventPair;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle); DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
/* Open the Object */ /* Open the Object */
Status = ObReferenceObjectByHandle(EventPairHandle, Status = ObReferenceObjectByHandle(EventPairHandle,
@ -239,8 +239,8 @@ NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Set the Event */ /* Set the Event */
KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE); KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE);
@ -260,17 +260,13 @@ NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
} }
NTSTATUS NTSTATUS
STDCALL NTAPI
NtSetLowEventPair(IN HANDLE EventPairHandle) NtSetLowEventPair(IN HANDLE EventPairHandle)
{ {
PKEVENT_PAIR EventPair; PKEVENT_PAIR EventPair;
KPROCESSOR_MODE PreviousMode; KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
PreviousMode = ExGetPreviousMode();
DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle); DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle);
/* Open the Object */ /* Open the Object */
@ -282,8 +278,8 @@ NtSetLowEventPair(IN HANDLE EventPairHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Set the Event */ /* Set the Event */
KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE); KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE);
@ -295,16 +291,15 @@ NtSetLowEventPair(IN HANDLE EventPairHandle)
return Status; return Status;
} }
NTSTATUS
NTSTATUS STDCALL NTAPI
NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle) NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
{ {
PKEVENT_PAIR EventPair; PKEVENT_PAIR EventPair;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle); DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
/* Open the Object */ /* Open the Object */
Status = ObReferenceObjectByHandle(EventPairHandle, Status = ObReferenceObjectByHandle(EventPairHandle,
@ -315,8 +310,8 @@ NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Set the Event */ /* Set the Event */
KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE); KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE);
@ -337,15 +332,14 @@ NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
NTSTATUS NTSTATUS
STDCALL NTAPI
NtWaitLowEventPair(IN HANDLE EventPairHandle) NtWaitLowEventPair(IN HANDLE EventPairHandle)
{ {
PKEVENT_PAIR EventPair; PKEVENT_PAIR EventPair;
KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle); DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
/* Open the Object */ /* Open the Object */
Status = ObReferenceObjectByHandle(EventPairHandle, Status = ObReferenceObjectByHandle(EventPairHandle,
@ -356,8 +350,8 @@ NtWaitLowEventPair(IN HANDLE EventPairHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Wait for the Event */ /* Wait for the Event */
KeWaitForSingleObject(&EventPair->LowEvent, KeWaitForSingleObject(&EventPair->LowEvent,
WrEventPair, WrEventPair,
@ -374,7 +368,7 @@ NtWaitLowEventPair(IN HANDLE EventPairHandle)
} }
NTSTATUS NTSTATUS
STDCALL NTAPI
NtWaitHighEventPair(IN HANDLE EventPairHandle) NtWaitHighEventPair(IN HANDLE EventPairHandle)
{ {
PKEVENT_PAIR EventPair; PKEVENT_PAIR EventPair;
@ -382,7 +376,7 @@ NtWaitHighEventPair(IN HANDLE EventPairHandle)
NTSTATUS Status; NTSTATUS Status;
PAGED_CODE(); PAGED_CODE();
DPRINT("NtSetHighWaitLowEventPair(EventPairHandle 0x%p)\n", EventPairHandle); DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
/* Open the Object */ /* Open the Object */
Status = ObReferenceObjectByHandle(EventPairHandle, Status = ObReferenceObjectByHandle(EventPairHandle,
@ -393,8 +387,8 @@ NtWaitHighEventPair(IN HANDLE EventPairHandle)
NULL); NULL);
/* Check for Success */ /* Check for Success */
if(NT_SUCCESS(Status)) { if(NT_SUCCESS(Status))
{
/* Wait for the Event */ /* Wait for the Event */
KeWaitForSingleObject(&EventPair->HighEvent, KeWaitForSingleObject(&EventPair->HighEvent,
WrEventPair, WrEventPair,