Derek Lesho : ntoskrnl.exe: Implement KeReadStateEvent.
Alexandre Julliard
julliard at winehq.org
Tue Aug 4 15:26:36 CDT 2020
Module: wine
Branch: master
Commit: 72540c93014c0e3b83799e51b351b969d1205953
URL: https://source.winehq.org/git/wine.git/?a=commit;h=72540c93014c0e3b83799e51b351b969d1205953
Author: Derek Lesho <dlesho at codeweavers.com>
Date: Thu Jul 16 10:17:09 2020 -0500
ntoskrnl.exe: Implement KeReadStateEvent.
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list