Module: wine Branch: master Commit: 7d66a01fc2f4153f74a1b19cb6d796cb0e573539 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d66a01fc2f4153f74a1b19cb6...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Nov 9 12:42:16 2015 +0100
ntdll: Return STATUS_PENDING in NtNotifyChangeKey if async notify is performed.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/reg.c | 6 +++--- dlls/ntdll/tests/reg.c | 26 ++++++++++++++++++++++++-- server/registry.c | 2 ++ 3 files changed, 29 insertions(+), 5 deletions(-)
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 4dff186..1bcd8fd 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -678,12 +678,12 @@ NTSTATUS WINAPI NtNotifyChangeKey(
if (!Asynchronous) { - if (ret == STATUS_SUCCESS) - NtWaitForSingleObject( Event, FALSE, NULL ); + if (ret == STATUS_PENDING) + ret = NtWaitForSingleObject( Event, FALSE, NULL ); NtClose( Event ); }
- return STATUS_SUCCESS; + return ret; }
/****************************************************************************** diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c index 1fe9ef3..7b4ae25 100644 --- a/dlls/ntdll/tests/reg.c +++ b/dlls/ntdll/tests/reg.c @@ -147,6 +147,7 @@ static LPVOID (WINAPI * pRtlAllocateHeap)(PVOID,ULONG,ULONG); static NTSTATUS (WINAPI * pRtlZeroMemory)(PVOID, ULONG); static NTSTATUS (WINAPI * pRtlpNtQueryValueKey)(HANDLE,ULONG*,PBYTE,DWORD*,void *); static NTSTATUS (WINAPI * pNtNotifyChangeKey)(HANDLE,HANDLE,PIO_APC_ROUTINE,PVOID,PIO_STATUS_BLOCK,ULONG,BOOLEAN,PVOID,ULONG,BOOLEAN); +static NTSTATUS (WINAPI * pNtWaitForSingleObject)(HANDLE,BOOLEAN,const LARGE_INTEGER*);
static HMODULE hntdll = 0; static int CurrentTest = 0; @@ -195,6 +196,7 @@ static BOOL InitFunctionPtrs(void) NTDLL_GET_PROC(RtlZeroMemory) NTDLL_GET_PROC(RtlpNtQueryValueKey) NTDLL_GET_PROC(RtlOpenCurrentUser) + NTDLL_GET_PROC(NtWaitForSingleObject)
/* optional functions */ pNtQueryLicenseValue = (void *)GetProcAddress(hntdll, "NtQueryLicenseValue"); @@ -1507,9 +1509,11 @@ static void test_NtQueryKey(void) static void test_notify(void) { OBJECT_ATTRIBUTES attr; + LARGE_INTEGER timeout; IO_STATUS_BLOCK iosb; + UNICODE_STRING str; + HANDLE key, event, subkey; NTSTATUS status; - HANDLE key, event;
InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
@@ -1520,7 +1524,25 @@ static void test_notify(void) ok(event != NULL, "CreateEvent failed: %u\n", GetLastError());
status = pNtNotifyChangeKey(key, event, NULL, NULL, &iosb, REG_NOTIFY_CHANGE_NAME, FALSE, NULL, 0, TRUE); - todo_wine ok(status == STATUS_PENDING, "NtNotifyChangeKey returned %x\n", status); + ok(status == STATUS_PENDING, "NtNotifyChangeKey returned %x\n", status); + + timeout.QuadPart = 0; + status = pNtWaitForSingleObject(event, FALSE, &timeout); + ok(status == STATUS_TIMEOUT, "NtWaitForSingleObject returned %x\n", status); + + attr.RootDirectory = key; + attr.ObjectName = &str; + + pRtlCreateUnicodeStringFromAsciiz(&str, "test_subkey"); + status = pNtCreateKey(&subkey, GENERIC_ALL, &attr, 0, 0, 0, 0); + ok(status == STATUS_SUCCESS, "NtCreateKey failed: 0x%08x\n", status); + + status = pNtWaitForSingleObject(event, FALSE, &timeout); + todo_wine ok(status == STATUS_SUCCESS, "NtWaitForSingleObject returned %x\n", status); + + status = pNtDeleteKey(subkey); + ok(status == STATUS_SUCCESS, "NtDeleteSubkey failed: %x\n", status); + pNtClose(subkey);
pNtClose(key); pNtClose(event); diff --git a/server/registry.c b/server/registry.c index 7f7a7b1..5b4250b 100644 --- a/server/registry.c +++ b/server/registry.c @@ -2289,6 +2289,8 @@ DECL_HANDLER(set_registry_notification) list_add_head( &key->notify_list, ¬ify->entry ); } } + if (notify) + set_error( STATUS_PENDING ); release_object( event ); } release_object( key );