Jacek Caban : ntdll: Return STATUS_PENDING in NtNotifyChangeKey if async notify is performed.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Nov 9 08:34:18 CST 2015
Module: wine
Branch: master
Commit: 7d66a01fc2f4153f74a1b19cb6d796cb0e573539
URL: http://source.winehq.org/git/wine.git/?a=commit;h=7d66a01fc2f4153f74a1b19cb6d796cb0e573539
Author: Jacek Caban <jacek at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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 );
More information about the wine-cvs
mailing list