Module: wine Branch: master Commit: fd8bc0c16dcfab29007b4e3af32531aa23145007 URL: https://source.winehq.org/git/wine.git/?a=commit;h=fd8bc0c16dcfab29007b4e3af...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Mar 27 17:43:39 2019 +0100
ntoskrnl.exe: Implement IoCreateSynchronizationEvent.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46804 Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 11 +---------- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/ntoskrnl_private.h | 1 + dlls/ntoskrnl.exe/sync.c | 26 ++++++++++++++++++++++++++ dlls/ntoskrnl.exe/tests/driver.c | 27 +++++++++++++++++++++++++++ include/ddk/wdm.h | 1 + 6 files changed, 57 insertions(+), 11 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 0e9415f..c1a74f1 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -402,7 +402,7 @@ static CRITICAL_SECTION_DEBUG handle_map_critsect_debug = }; static CRITICAL_SECTION handle_map_cs = { &handle_map_critsect_debug, -1, 0, 0, 0, 0 };
-static NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret ) +NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret ) { struct object_header *header; void *obj; @@ -3291,15 +3291,6 @@ BOOLEAN WINAPI Ke386SetIoAccessMap(ULONG flag, PVOID buffer) }
/***************************************************** - * IoCreateSynchronizationEvent (NTOSKRNL.EXE.@) - */ -PKEVENT WINAPI IoCreateSynchronizationEvent(PUNICODE_STRING name, PHANDLE handle) -{ - FIXME("(%p %p) stub\n", name, handle); - return (KEVENT *)0xdeadbeaf; -} - -/***************************************************** * IoStartNextPacket (NTOSKRNL.EXE.@) */ VOID WINAPI IoStartNextPacket(PDEVICE_OBJECT deviceobject, BOOLEAN cancelable) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 43f4747..508f9e6 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -1395,7 +1395,7 @@ @ stdcall -private ZwSetDefaultLocale(long long) NtSetDefaultLocale @ stdcall -private ZwSetDefaultUILanguage(long) NtSetDefaultUILanguage @ stdcall -private ZwSetEaFile(long ptr ptr long) NtSetEaFile -@ stdcall -private ZwSetEvent(long ptr) NtSetEvent +@ stdcall ZwSetEvent(long ptr) NtSetEvent @ stdcall -private ZwSetInformationFile(long ptr ptr long long) NtSetInformationFile @ stdcall -private ZwSetInformationJobObject(long long ptr long) NtSetInformationJobObject @ stdcall -private ZwSetInformationObject(long long ptr long) NtSetInformationObject diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h index 82ee18e..5215b43 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl_private.h +++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h @@ -29,6 +29,7 @@ struct _OBJECT_TYPE {
void *alloc_kernel_object( POBJECT_TYPE type, HANDLE handle, SIZE_T size, LONG ref ) DECLSPEC_HIDDEN; HANDLE kernel_object_handle( void *obj, unsigned int access ) DECLSPEC_HIDDEN; +NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret ) DECLSPEC_HIDDEN;
extern POBJECT_TYPE ExEventObjectType; extern POBJECT_TYPE ExSemaphoreObjectType; diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c index 3085543..12dacae 100644 --- a/dlls/ntoskrnl.exe/sync.c +++ b/dlls/ntoskrnl.exe/sync.c @@ -219,6 +219,32 @@ static struct _OBJECT_TYPE event_type = { POBJECT_TYPE ExEventObjectType = &event_type;
/*********************************************************************** + * IoCreateSynchronizationEvent (NTOSKRNL.EXE.@) + */ +PKEVENT WINAPI IoCreateSynchronizationEvent( UNICODE_STRING *name, HANDLE *ret_handle ) +{ + OBJECT_ATTRIBUTES attr; + HANDLE handle; + KEVENT *event; + NTSTATUS ret; + + TRACE( "(%p %p)\n", name, ret_handle ); + + InitializeObjectAttributes( &attr, name, 0, 0, NULL ); + ret = NtCreateEvent( &handle, EVENT_ALL_ACCESS, &attr, SynchronizationEvent, TRUE ); + if (ret) return NULL; + + if (kernel_object_from_handle( handle, ExEventObjectType, (void**)&event )) + { + NtClose( handle); + return NULL; + } + + *ret_handle = handle; + return event; +} + +/*********************************************************************** * KeSetEvent (NTOSKRNL.EXE.@) */ LONG WINAPI KeSetEvent( PRKEVENT event, KPRIORITY increment, BOOLEAN wait ) diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 8823746..4a564ef 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -474,6 +474,33 @@ static void test_sync(void) ZwClose(handle); ObDereferenceObject(event);
+ event = IoCreateSynchronizationEvent(NULL, &handle); + ok(event != NULL, "IoCreateSynchronizationEvent failed\n"); + + ret = wait_single(event, 0); + ok(ret == 0, "got %#x\n", ret); + KeResetEvent(event); + ret = wait_single(event, 0); + ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); + ret = wait_single_handle(handle, 0); + ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); + + ret = ZwSetEvent(handle, NULL); + ok(!ret, "NtSetEvent returned %#x\n", ret); + ret = wait_single(event, 0); + ok(ret == 0, "got %#x\n", ret); + ret = wait_single_handle(handle, 0); + ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); + + KeSetEvent(event, 0, FALSE); + ret = wait_single_handle(handle, 0); + ok(!ret, "got %#x\n", ret); + ret = wait_single(event, 0); + ok(ret == STATUS_TIMEOUT, "got %#x\n", ret); + + ret = ZwClose(handle); + ok(!ret, "ZwClose returned %#x\n", ret); + /* test semaphores */ KeInitializeSemaphore(&semaphore, 0, 5);
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 02c1bf3..e5804c0 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1488,6 +1488,7 @@ VOID WINAPI IoCompleteRequest(IRP*,UCHAR); NTSTATUS WINAPI IoCreateDevice(DRIVER_OBJECT*,ULONG,UNICODE_STRING*,DEVICE_TYPE,ULONG,BOOLEAN,DEVICE_OBJECT**); NTSTATUS WINAPI IoCreateDriver(UNICODE_STRING*,PDRIVER_INITIALIZE); NTSTATUS WINAPI IoCreateSymbolicLink(UNICODE_STRING*,UNICODE_STRING*); +PKEVENT WINAPI IoCreateSynchronizationEvent(UNICODE_STRING*,HANDLE*); void WINAPI IoDeleteDevice(DEVICE_OBJECT*); void WINAPI IoDeleteDriver(DRIVER_OBJECT*); NTSTATUS WINAPI IoDeleteSymbolicLink(UNICODE_STRING*);