Mike McCormack : kernel: Partially implement ReadDirectoryChangesW using NtNotifyChangeDirectoryFile.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jan 27 12:27:38 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 700575955782bed874734610476aab6c8826f775
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=700575955782bed874734610476aab6c8826f775

Author: Mike McCormack <mike at 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;
 }




More information about the wine-cvs mailing list