Module: wine Branch: refs/heads/master Commit: 700575955782bed874734610476aab6c8826f775 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=700575955782bed874734610...
Author: Mike McCormack mike@codeweavers.com Date: Fri Jan 27 19:19:46 2006 +0100
kernel: Partially implement ReadDirectoryChangesW using NtNotifyChangeDirectoryFile.
---
dlls/kernel/change.c | 29 +++++++++++++++++++++++++---- 1 files changed, 25 insertions(+), 4 deletions(-)
diff --git a/dlls/kernel/change.c b/dlls/kernel/change.c index 1f1b162..b2fed36 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( HANDL 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; }