Module: wine Branch: master Commit: 7bd852c6ce0299f14fa585c124bae029f0d6d214 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7bd852c6ce0299f14fa585c124...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Nov 9 13:07:10 2015 +0100
ntdll: Added NtNotifyChangeMultipleKeys implementation.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@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); }