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 "winerror.h"
|
||||
#include "ntstatus.h"
|
||||
#include "wine/unicode.h"
|
||||
#include "wine/server.h"
|
||||
#include "wine/debug.h"
|
||||
#include "winternl.h"
|
||||
|
||||
#include "wine/unicode.h"
|
||||
#include "wine/debug.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(reg);
|
||||
|
||||
/* allowed bits for access mask */
|
||||
@ -2032,32 +2032,23 @@ LONG WINAPI RegNotifyChangeKeyValue( HKEY hkey, BOOL fWatchSubTree,
|
||||
DWORD fdwNotifyFilter, HANDLE hEvent,
|
||||
BOOL fAsync )
|
||||
{
|
||||
LONG ret;
|
||||
NTSTATUS status;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
|
||||
TRACE("(%p,%i,%ld,%p,%i)\n",hkey,fWatchSubTree,fdwNotifyFilter,
|
||||
hEvent,fAsync);
|
||||
hkey = get_special_root_hkey( hkey );
|
||||
if (!hkey) return ERROR_INVALID_HANDLE;
|
||||
|
||||
if( !fAsync )
|
||||
hEvent = CreateEventW(NULL, 0, 0, NULL);
|
||||
TRACE("(%p,%i,%ld,%p,%i)\n", hkey, fWatchSubTree, fdwNotifyFilter,
|
||||
hEvent, fAsync);
|
||||
|
||||
SERVER_START_REQ( set_registry_notification )
|
||||
{
|
||||
req->hkey = hkey;
|
||||
req->event = hEvent;
|
||||
req->subtree = fWatchSubTree;
|
||||
req->filter = fdwNotifyFilter;
|
||||
ret = RtlNtStatusToDosError( wine_server_call(req) );
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
|
||||
if( !fAsync )
|
||||
{
|
||||
if( ret == ERROR_SUCCESS )
|
||||
WaitForSingleObject( hEvent, INFINITE );
|
||||
CloseHandle( hEvent );
|
||||
}
|
||||
status = NtNotifyChangeKey( hkey, hEvent, NULL, NULL, &iosb,
|
||||
fdwNotifyFilter, fWatchSubTree, NULL, 0,
|
||||
fAsync );
|
||||
|
||||
return ret;
|
||||
if (status && status != STATUS_TIMEOUT)
|
||||
return RtlNtStatusToDosError( status );
|
||||
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
@ -595,15 +595,47 @@ NTSTATUS WINAPI NtNotifyChangeKey(
|
||||
IN PVOID ApcContext OPTIONAL,
|
||||
OUT PIO_STATUS_BLOCK IoStatusBlock,
|
||||
IN ULONG CompletionFilter,
|
||||
IN BOOLEAN Asynchroneous,
|
||||
IN BOOLEAN Asynchronous,
|
||||
OUT PVOID ChangeBuffer,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN WatchSubtree)
|
||||
{
|
||||
FIXME("(%p,%p,%p,%p,%p,0x%08lx, 0x%08x,%p,0x%08lx,0x%08x) stub!\n",
|
||||
KeyHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter,
|
||||
Asynchroneous, ChangeBuffer, Length, WatchSubtree);
|
||||
return STATUS_SUCCESS;
|
||||
NTSTATUS ret;
|
||||
|
||||
TRACE("(%p,%p,%p,%p,%p,0x%08lx, 0x%08x,%p,0x%08lx,0x%08x)\n",
|
||||
KeyHandle, Event, ApcRoutine, ApcContext, IoStatusBlock, CompletionFilter,
|
||||
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;
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user