Implement RegNotifyChangeKeyValue on top of NtNotifyChangeKey.

This commit is contained in:
Robert Shearman 2005-05-16 14:08:11 +00:00 committed by Alexandre Julliard
parent bac5f4603d
commit efbea2e2bc
2 changed files with 53 additions and 30 deletions

View File

@ -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;
}
/******************************************************************************

View File

@ -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;
}
/******************************************************************************