mirror of
https://github.com/reactos/wine.git
synced 2024-11-29 06:30:37 +00:00
Implement RegNotifyChangeKeyValue on top of NtNotifyChangeKey.
This commit is contained in:
parent
bac5f4603d
commit
efbea2e2bc
@ -35,11 +35,11 @@
|
|||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "ntstatus.h"
|
#include "ntstatus.h"
|
||||||
#include "wine/unicode.h"
|
|
||||||
#include "wine/server.h"
|
|
||||||
#include "wine/debug.h"
|
|
||||||
#include "winternl.h"
|
#include "winternl.h"
|
||||||
|
|
||||||
|
#include "wine/unicode.h"
|
||||||
|
#include "wine/debug.h"
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(reg);
|
WINE_DEFAULT_DEBUG_CHANNEL(reg);
|
||||||
|
|
||||||
/* allowed bits for access mask */
|
/* allowed bits for access mask */
|
||||||
@ -2032,32 +2032,23 @@ LONG WINAPI RegNotifyChangeKeyValue( HKEY hkey, BOOL fWatchSubTree,
|
|||||||
DWORD fdwNotifyFilter, HANDLE hEvent,
|
DWORD fdwNotifyFilter, HANDLE hEvent,
|
||||||
BOOL fAsync )
|
BOOL fAsync )
|
||||||
{
|
{
|
||||||
LONG ret;
|
NTSTATUS status;
|
||||||
|
IO_STATUS_BLOCK iosb;
|
||||||
|
|
||||||
|
hkey = get_special_root_hkey( hkey );
|
||||||
|
if (!hkey) return ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
TRACE("(%p,%i,%ld,%p,%i)\n", hkey, fWatchSubTree, fdwNotifyFilter,
|
TRACE("(%p,%i,%ld,%p,%i)\n", hkey, fWatchSubTree, fdwNotifyFilter,
|
||||||
hEvent, fAsync);
|
hEvent, fAsync);
|
||||||
|
|
||||||
if( !fAsync )
|
status = NtNotifyChangeKey( hkey, hEvent, NULL, NULL, &iosb,
|
||||||
hEvent = CreateEventW(NULL, 0, 0, NULL);
|
fdwNotifyFilter, fWatchSubTree, NULL, 0,
|
||||||
|
fAsync );
|
||||||
|
|
||||||
SERVER_START_REQ( set_registry_notification )
|
if (status && status != STATUS_TIMEOUT)
|
||||||
{
|
return RtlNtStatusToDosError( status );
|
||||||
req->hkey = hkey;
|
|
||||||
req->event = hEvent;
|
|
||||||
req->subtree = fWatchSubTree;
|
|
||||||
req->filter = fdwNotifyFilter;
|
|
||||||
ret = RtlNtStatusToDosError( wine_server_call(req) );
|
|
||||||
}
|
|
||||||
SERVER_END_REQ;
|
|
||||||
|
|
||||||
if( !fAsync )
|
return ERROR_SUCCESS;
|
||||||
{
|
|
||||||
if( ret == ERROR_SUCCESS )
|
|
||||||
WaitForSingleObject( hEvent, INFINITE );
|
|
||||||
CloseHandle( hEvent );
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -595,14 +595,46 @@ NTSTATUS WINAPI NtNotifyChangeKey(
|
|||||||
IN PVOID ApcContext OPTIONAL,
|
IN PVOID ApcContext OPTIONAL,
|
||||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||||
IN ULONG CompletionFilter,
|
IN ULONG CompletionFilter,
|
||||||
IN BOOLEAN Asynchroneous,
|
IN BOOLEAN Asynchronous,
|
||||||
OUT PVOID ChangeBuffer,
|
OUT PVOID ChangeBuffer,
|
||||||
IN ULONG Length,
|
IN ULONG Length,
|
||||||
IN BOOLEAN WatchSubtree)
|
IN BOOLEAN WatchSubtree)
|
||||||
{
|
{
|
||||||
FIXME("(%p,%p,%p,%p,%p,0x%08lx, 0x%08x,%p,0x%08lx,0x%08x) stub!\n",
|
NTSTATUS ret;
|
||||||
|
|
||||||
|
TRACE("(%p,%p,%p,%p,%p,0x%08lx, 0x%08x,%p,0x%08lx,0x%08x)\n",
|
||||||
KeyHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter,
|
KeyHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter,
|
||||||
Asynchroneous, ChangeBuffer, Length, WatchSubtree);
|
Asynchronous, ChangeBuffer, Length, WatchSubtree);
|
||||||
|
|
||||||
|
if (ApcRoutine || ApcContext || ChangeBuffer || Length)
|
||||||
|
FIXME("Unimplemented optional parameter\n");
|
||||||
|
|
||||||
|
if (!Asynchronous)
|
||||||
|
{
|
||||||
|
OBJECT_ATTRIBUTES attr;
|
||||||
|
InitializeObjectAttributes( &attr, NULL, 0, NULL, NULL );
|
||||||
|
ret = NtCreateEvent( &Event, EVENT_ALL_ACCESS, &attr, FALSE, FALSE );
|
||||||
|
if (ret != STATUS_SUCCESS)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
SERVER_START_REQ( set_registry_notification )
|
||||||
|
{
|
||||||
|
req->hkey = KeyHandle;
|
||||||
|
req->event = Event;
|
||||||
|
req->subtree = WatchSubtree;
|
||||||
|
req->filter = CompletionFilter;
|
||||||
|
ret = wine_server_call( req );
|
||||||
|
}
|
||||||
|
SERVER_END_REQ;
|
||||||
|
|
||||||
|
if (!Asynchronous)
|
||||||
|
{
|
||||||
|
if (ret == STATUS_SUCCESS)
|
||||||
|
NtWaitForSingleObject( Event, FALSE, NULL );
|
||||||
|
NtClose( Event );
|
||||||
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user