mirror of
https://github.com/reactos/reactos.git
synced 2025-05-21 18:16:07 +00:00
- Fix some formatting.
svn path=/trunk/; revision=20428
This commit is contained in:
parent
e642f64e26
commit
ba6ca2fce0
2 changed files with 270 additions and 255 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue