Module: wine Branch: master Commit: 72540c93014c0e3b83799e51b351b969d1205953 URL: https://source.winehq.org/git/wine.git/?a=commit;h=72540c93014c0e3b83799e51b...
Author: Derek Lesho dlesho@codeweavers.com Date: Thu Jul 16 10:17:09 2020 -0500
ntoskrnl.exe: Implement KeReadStateEvent.
Signed-off-by: Derek Lesho dlesho@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/sync.c | 22 ++++++++++++++++++++++ dlls/ntoskrnl.exe/tests/driver.c | 11 +++++++++++ include/ddk/wdm.h | 1 + 4 files changed, 35 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 030bdbcedf..584a8283ea 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -599,7 +599,7 @@ @ stdcall KeQueryTickCount(ptr) @ stdcall KeQueryTimeIncrement() @ stub KeRaiseUserException -@ stub KeReadStateEvent +@ stdcall KeReadStateEvent(ptr) @ stub KeReadStateMutant @ stub KeReadStateMutex @ stub KeReadStateQueue diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c index 5e06ab2f2b..7f19ce7571 100644 --- a/dlls/ntoskrnl.exe/sync.c +++ b/dlls/ntoskrnl.exe/sync.c @@ -311,6 +311,28 @@ void WINAPI KeClearEvent( PRKEVENT event ) KeResetEvent( event ); }
+/*********************************************************************** + * KeReadStateEvent (NTOSKRNL.EXE.@) + */ +LONG WINAPI KeReadStateEvent( PRKEVENT event ) +{ + HANDLE handle; + + TRACE("event %p.\n", event); + + if (event->Header.WaitListHead.Blink == INVALID_HANDLE_VALUE) + { + if (!(ObOpenObjectByPointer( event, OBJ_KERNEL_HANDLE, NULL, EVENT_QUERY_STATE, NULL, KernelMode, &handle ))) + { + EVENT_BASIC_INFORMATION event_info; + if (!(NtQueryEvent( handle, EventBasicInformation, &event_info, sizeof(event_info), NULL))) + event->Header.SignalState = event_info.EventState; + NtClose( handle ); + } + } + return event->Header.SignalState; +} + /*********************************************************************** * KeInitializeSemaphore (NTOSKRNL.EXE.@) */ diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 7a325753d4..dfc742eec3 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -467,8 +467,14 @@ static void test_sync(void) ret = wait_single(&manual_event, 0); ok(ret == STATUS_TIMEOUT, "got %#x\n", ret);
+ ret = KeReadStateEvent(&manual_event); + ok(ret == 0, "got %d\n", ret); + KeSetEvent(&manual_event, 0, FALSE);
+ ret = KeReadStateEvent(&manual_event); + ok(ret == 1, "got %d\n", ret); + ret = wait_single(&manual_event, 0); ok(ret == 0, "got %#x\n", ret);
@@ -561,9 +567,14 @@ static void test_sync(void) ret = ObReferenceObjectByHandle(handle, SYNCHRONIZE, *pExEventObjectType, KernelMode, (void **)&event, NULL); ok(!ret, "ObReferenceObjectByHandle failed: %#x\n", ret);
+ ret = wait_single(event, 0); ok(ret == 0, "got %#x\n", ret); + ret = KeReadStateEvent(event); + ok(ret == 1, "got %d\n", ret); KeResetEvent(event); + ret = KeReadStateEvent(event); + ok(ret == 0, "got %d\n", ret); ret = wait_single(event, 0); ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); ret = wait_single_handle(handle, 0); diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 59af860708..176b432644 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1759,6 +1759,7 @@ KAFFINITY WINAPI KeQueryActiveProcessors(void); void WINAPI KeQuerySystemTime(LARGE_INTEGER*); void WINAPI KeQueryTickCount(LARGE_INTEGER*); ULONG WINAPI KeQueryTimeIncrement(void); +LONG WINAPI KeReadStateEvent(PRKEVENT); void FASTCALL KeReleaseInStackQueuedSpinLockFromDpcLevel(KLOCK_QUEUE_HANDLE*); LONG WINAPI KeReleaseMutex(PRKMUTEX,BOOLEAN); LONG WINAPI KeReleaseSemaphore(PRKSEMAPHORE,KPRIORITY,LONG,BOOLEAN);