Jacek Caban : ntdll: Added NtNotifyChangeMultipleKeys implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 9 08:34:18 CST 2015


Module: wine
Branch: master
Commit: 7bd852c6ce0299f14fa585c124bae029f0d6d214
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7bd852c6ce0299f14fa585c124bae029f0d6d214

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov  9 13:07:10 2015 +0100

ntdll: Added NtNotifyChangeMultipleKeys implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/ntdll.spec  |  4 ++--
 dlls/ntdll/reg.c       | 55 +++++++++++++++++++++++++++++++++++---------------
 dlls/ntdll/tests/reg.c | 38 ++++++++++++++++++++++++++++++++--
 3 files changed, 77 insertions(+), 20 deletions(-)

diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec
index 464b233..23261ed 100644
--- a/dlls/ntdll/ntdll.spec
+++ b/dlls/ntdll/ntdll.spec
@@ -205,7 +205,7 @@
 # @ stub NtModifyBootEntry
 @ stdcall NtNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long)
 @ stdcall NtNotifyChangeKey(long long ptr ptr ptr long long ptr long long)
-# @ stub NtNotifyChangeMultipleKeys
+@ stdcall NtNotifyChangeMultipleKeys(long long ptr long ptr ptr ptr long long ptr long long)
 @ stdcall NtOpenDirectoryObject(long long long)
 @ stdcall NtOpenEvent(long long long)
 @ stub NtOpenEventPair
@@ -1121,7 +1121,7 @@
 # @ stub ZwModifyBootEntry
 @ stdcall ZwNotifyChangeDirectoryFile(long long ptr ptr ptr ptr long long long) NtNotifyChangeDirectoryFile
 @ stdcall ZwNotifyChangeKey(long long ptr ptr ptr long long ptr long long) NtNotifyChangeKey
-# @ stub ZwNotifyChangeMultipleKeys
+@ stdcall ZwNotifyChangeMultipleKeys(long long ptr long ptr ptr ptr long long ptr long long) NtNotifyChangeMultipleKeys
 @ stdcall ZwOpenDirectoryObject(long long long) NtOpenDirectoryObject
 @ stdcall ZwOpenEvent(long long long) NtOpenEvent
 @ stub ZwOpenEventPair
diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c
index 1bcd8fd..5248595 100644
--- a/dlls/ntdll/reg.c
+++ b/dlls/ntdll/reg.c
@@ -633,28 +633,30 @@ NTSTATUS WINAPI NtLoadKey( const OBJECT_ATTRIBUTES *attr, OBJECT_ATTRIBUTES *fil
 }
 
 /******************************************************************************
- *  NtNotifyChangeKey	[NTDLL.@]
- *  ZwNotifyChangeKey   [NTDLL.@]
+ *  NtNotifyChangeMultipleKeys  [NTDLL.@]
+ *  ZwNotifyChangeMultipleKeys  [NTDLL.@]
  */
-NTSTATUS WINAPI NtNotifyChangeKey(
-	IN HANDLE KeyHandle,
-	IN HANDLE Event,
-	IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
-	IN PVOID ApcContext OPTIONAL,
-	OUT PIO_STATUS_BLOCK IoStatusBlock,
-	IN ULONG CompletionFilter,
-	IN BOOLEAN WatchSubtree,
-	OUT PVOID ChangeBuffer,
-	IN ULONG Length,
-	IN BOOLEAN Asynchronous)
+NTSTATUS WINAPI NtNotifyChangeMultipleKeys(
+        HANDLE KeyHandle,
+        ULONG Count,
+        OBJECT_ATTRIBUTES *SubordinateObjects,
+        HANDLE Event,
+        PIO_APC_ROUTINE ApcRoutine,
+        PVOID ApcContext,
+        PIO_STATUS_BLOCK IoStatusBlock,
+        ULONG CompletionFilter,
+        BOOLEAN WatchSubtree,
+        PVOID ChangeBuffer,
+        ULONG Length,
+        BOOLEAN Asynchronous)
 {
     NTSTATUS ret;
 
-    TRACE("(%p,%p,%p,%p,%p,0x%08x, 0x%08x,%p,0x%08x,0x%08x)\n",
-        KeyHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter,
+    TRACE("(%p,%u,%p,%p,%p,%p,%p,0x%08x, 0x%08x,%p,0x%08x,0x%08x)\n",
+        KeyHandle, Count, SubordinateObjects, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter,
         Asynchronous, ChangeBuffer, Length, WatchSubtree);
 
-    if (ApcRoutine || ApcContext || ChangeBuffer || Length)
+    if (Count || SubordinateObjects || ApcRoutine || ApcContext || ChangeBuffer || Length)
         FIXME("Unimplemented optional parameter\n");
 
     if (!Asynchronous)
@@ -687,6 +689,27 @@ NTSTATUS WINAPI NtNotifyChangeKey(
 }
 
 /******************************************************************************
+ *  NtNotifyChangeKey	[NTDLL.@]
+ *  ZwNotifyChangeKey   [NTDLL.@]
+ */
+NTSTATUS WINAPI NtNotifyChangeKey(
+	IN HANDLE KeyHandle,
+	IN HANDLE Event,
+	IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+	IN PVOID ApcContext OPTIONAL,
+	OUT PIO_STATUS_BLOCK IoStatusBlock,
+	IN ULONG CompletionFilter,
+	IN BOOLEAN WatchSubtree,
+	OUT PVOID ChangeBuffer,
+	IN ULONG Length,
+	IN BOOLEAN Asynchronous)
+{
+    return NtNotifyChangeMultipleKeys(KeyHandle, 0, NULL, Event, ApcRoutine, ApcContext,
+                                      IoStatusBlock, CompletionFilter, WatchSubtree,
+                                      ChangeBuffer, Length, Asynchronous);
+}
+
+/******************************************************************************
  * NtQueryMultipleValueKey [NTDLL]
  * ZwQueryMultipleValueKey
  */
diff --git a/dlls/ntdll/tests/reg.c b/dlls/ntdll/tests/reg.c
index b6ff53e..9ab2f35 100644
--- a/dlls/ntdll/tests/reg.c
+++ b/dlls/ntdll/tests/reg.c
@@ -147,6 +147,8 @@ 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 * pNtNotifyChangeMultipleKeys)(HANDLE,ULONG,OBJECT_ATTRIBUTES*,HANDLE,PIO_APC_ROUTINE,
+                                                       void*,IO_STATUS_BLOCK*,ULONG,BOOLEAN,void*,ULONG,BOOLEAN);
 static NTSTATUS (WINAPI * pNtWaitForSingleObject)(HANDLE,BOOLEAN,const LARGE_INTEGER*);
 
 static HMODULE hntdll = 0;
@@ -201,6 +203,7 @@ static BOOL InitFunctionPtrs(void)
     /* optional functions */
     pNtQueryLicenseValue = (void *)GetProcAddress(hntdll, "NtQueryLicenseValue");
     pNtOpenKeyEx = (void *)GetProcAddress(hntdll, "NtOpenKeyEx");
+    pNtNotifyChangeMultipleKeys = (void *)GetProcAddress(hntdll, "NtNotifyChangeMultipleKeys");
 
     return TRUE;
 }
@@ -1516,7 +1519,6 @@ static void test_notify(void)
     NTSTATUS status;
 
     InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
-
     status = pNtOpenKey(&key, KEY_ALL_ACCESS, &attr);
     ok(status == STATUS_SUCCESS, "NtOpenKey Failed: 0x%08x\n", status);
 
@@ -1543,8 +1545,40 @@ static void test_notify(void)
     status = pNtDeleteKey(subkey);
     ok(status == STATUS_SUCCESS, "NtDeleteSubkey failed: %x\n", status);
     pNtClose(subkey);
-
     pNtClose(key);
+
+    if (pNtNotifyChangeMultipleKeys)
+    {
+        InitializeObjectAttributes(&attr, &winetestpath, 0, 0, 0);
+        status = pNtOpenKey(&key, KEY_ALL_ACCESS, &attr);
+        ok(status == STATUS_SUCCESS, "NtOpenKey Failed: 0x%08x\n", status);
+
+        status = pNtNotifyChangeMultipleKeys(key, 0, NULL, event, NULL, NULL, &iosb, REG_NOTIFY_CHANGE_NAME, FALSE, NULL, 0, TRUE);
+        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);
+        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);
+    }
+    else
+    {
+        win_skip("NtNotifyChangeMultipleKeys not available\n");
+    }
+
     pNtClose(event);
 }
 




More information about the wine-cvs mailing list