kernel32: Add support for completion routine invocation in ReadDirectoryChangesW.
authorPiotr Caban <piotr@codeweavers.com>
Thu, 16 Dec 2010 00:02:31 +0000 (01:02 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 16 Dec 2010 10:50:09 +0000 (11:50 +0100)
dlls/kernel32/change.c

index 0505ca91ace31637ef8b008a1b28158adcf289bb..ab9432fac3dd1f10be876acc66ce9d42ee2e32a6 100644 (file)
@@ -134,6 +134,12 @@ BOOL WINAPI FindCloseChangeNotification( HANDLE handle )
     return CloseHandle( handle );
 }
 
+static void WINAPI invoke_completion(LPVOID ctx, IO_STATUS_BLOCK *ios, ULONG res)
+{
+    LPOVERLAPPED_COMPLETION_ROUTINE completion = ctx;
+    completion(ios->u.Status, ios->Information, (LPOVERLAPPED)ios);
+}
+
 /****************************************************************************
  *             ReadDirectoryChangesW (KERNEL32.@)
  *
@@ -169,14 +175,16 @@ BOOL WINAPI ReadDirectoryChangesW( HANDLE handle, LPVOID buffer, DWORD len, BOOL
     else
     {
         pov = overlapped;
-        if (!completion && ((ULONG_PTR)overlapped->hEvent & 1) == 0) cvalue = overlapped;
+        if(completion) cvalue = completion;
+        else if (((ULONG_PTR)overlapped->hEvent & 1) == 0) cvalue = overlapped;
     }
 
     ios = (PIO_STATUS_BLOCK) pov;
     ios->u.Status = STATUS_PENDING;
 
-    status = NtNotifyChangeDirectoryFile( handle, pov->hEvent, NULL, cvalue,
-                                          ios, buffer, len, filter, subtree );
+    status = NtNotifyChangeDirectoryFile( handle, completion && overlapped ? NULL : pov->hEvent,
+            completion && overlapped ? invoke_completion : NULL,
+            cvalue, ios, buffer, len, filter, subtree );
     if (status == STATUS_PENDING)
     {
         if (overlapped)