Piotr Caban : kernel32: Add support for completion routine invocation in ReadDirectoryChangesW.
Alexandre Julliard
julliard at winehq.org
Fri Dec 17 11:30:41 CST 2010
Module: wine
Branch: master
Commit: 45b65d0fb69142fb55f08fd6674f322bc69cf5e4
URL: http://source.winehq.org/git/wine.git/?a=commit;h=45b65d0fb69142fb55f08fd6674f322bc69cf5e4
Author: Piotr Caban <piotr at codeweavers.com>
Date: Thu Dec 16 01:02:31 2010 +0100
kernel32: Add support for completion routine invocation in ReadDirectoryChangesW.
---
dlls/kernel32/change.c | 14 +++++++++++---
1 files changed, 11 insertions(+), 3 deletions(-)
diff --git a/dlls/kernel32/change.c b/dlls/kernel32/change.c
index 0505ca9..ab9432f 100644
--- a/dlls/kernel32/change.c
+++ b/dlls/kernel32/change.c
@@ -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)
More information about the wine-cvs
mailing list