From 700575955782bed874734610476aab6c8826f775 Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Fri, 27 Jan 2006 19:19:46 +0100 Subject: [PATCH] kernel: Partially implement ReadDirectoryChangesW using NtNotifyChangeDirectoryFile. --- dlls/kernel/change.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/dlls/kernel/change.c b/dlls/kernel/change.c index 1f1b16257ab..b2fed36a4ac 100644 --- a/dlls/kernel/change.c +++ b/dlls/kernel/change.c @@ -31,7 +31,6 @@ #include "winerror.h" #include "winternl.h" #include "kernel_private.h" -#include "wine/server.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(file); @@ -129,9 +128,31 @@ BOOL WINAPI ReadDirectoryChangesW( HANDLE handle, LPVOID buffer, DWORD len, BOOL DWORD filter, LPDWORD returned, LPOVERLAPPED overlapped, LPOVERLAPPED_COMPLETION_ROUTINE completion ) { - FIXME( "%p %p 0x%08lx %d 0x%08lx %p %p %p\n", handle, buffer, len, subtree, filter, + IO_STATUS_BLOCK io; + NTSTATUS status; + BOOL ret = TRUE; + HANDLE event; + + TRACE("%p %p %08lx %d %08lx %p %p %p\n", handle, buffer, len, subtree, filter, returned, overlapped, completion ); - SetLastError( ERROR_INVALID_FUNCTION ); - return FALSE; + if (overlapped) + event = overlapped->hEvent; + else + event = CreateEventW( NULL, 0, 0, NULL ); + + status = NtNotifyChangeDirectoryFile( handle, event, NULL, NULL, + &io, buffer, len, filter, subtree ); + if (status != STATUS_PENDING) + { + SetLastError( RtlNtStatusToDosError(status) ); + ret = FALSE; + } + else if (!overlapped) + WaitForSingleObject( event, INFINITE ); + + if (!overlapped) + CloseHandle( event ); + + return ret; }