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