Jacek Caban : ntdll: Store async callback in async_fileio struct.

Alexandre Julliard julliard at winehq.org
Tue Apr 11 15:31:04 CDT 2017


Module: wine
Branch: master
Commit: b82782a9c1a6413512d0fa3016cdcc236f92a0ea
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b82782a9c1a6413512d0fa3016cdcc236f92a0ea

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Apr 10 13:20:38 2017 +0200

ntdll: Store async callback in async_fileio struct.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/file.c | 25 +++++++++++++++----------
 1 file changed, 15 insertions(+), 10 deletions(-)

diff --git a/dlls/ntdll/file.c b/dlls/ntdll/file.c
index c153e7b..d97c4dd 100644
--- a/dlls/ntdll/file.c
+++ b/dlls/ntdll/file.c
@@ -346,8 +346,11 @@ NTSTATUS WINAPI NtCreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATTRIB
  *                  Asynchronous file I/O                              *
  */
 
+typedef NTSTATUS async_callback_t( void *user, IO_STATUS_BLOCK *io, NTSTATUS status, void **apc, void **arg );
+
 struct async_fileio
 {
+    async_callback_t    *callback; /* must be the first field */
     struct async_fileio *next;
     HANDLE               handle;
     PIO_APC_ROUTINE      apc;
@@ -391,7 +394,8 @@ static void release_fileio( struct async_fileio *io )
     }
 }
 
-static struct async_fileio *alloc_fileio( DWORD size, HANDLE handle, PIO_APC_ROUTINE apc, void *arg )
+static struct async_fileio *alloc_fileio( DWORD size, async_callback_t callback, HANDLE handle,
+                                          PIO_APC_ROUTINE apc, void *arg )
 {
     /* first free remaining previous fileinfos */
 
@@ -406,9 +410,10 @@ static struct async_fileio *alloc_fileio( DWORD size, HANDLE handle, PIO_APC_ROU
 
     if ((io = RtlAllocateHeap( GetProcessHeap(), 0, size )))
     {
-        io->handle  = handle;
-        io->apc     = apc;
-        io->apc_arg = arg;
+        io->callback = callback;
+        io->handle   = handle;
+        io->apc      = apc;
+        io->apc_arg  = arg;
     }
     return io;
 }
@@ -558,7 +563,7 @@ static NTSTATUS server_read_file( HANDLE handle, HANDLE event, PIO_APC_ROUTINE a
     ULONG options;
     ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
 
-    if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), handle, apc, apc_context )))
+    if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
         return STATUS_NO_MEMORY;
 
     async->event   = event;
@@ -605,7 +610,7 @@ static NTSTATUS server_write_file( HANDLE handle, HANDLE event, PIO_APC_ROUTINE
     ULONG options;
     ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
 
-    if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), handle, apc, apc_context )))
+    if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
         return STATUS_NO_MEMORY;
 
     async->event   = event;
@@ -783,7 +788,7 @@ static NTSTATUS register_async_file_read( HANDLE handle, HANDLE event,
     struct async_fileio_read *fileio;
     NTSTATUS status;
 
-    if (!(fileio = (struct async_fileio_read *)alloc_fileio( sizeof(*fileio), handle, apc, apc_user )))
+    if (!(fileio = (struct async_fileio_read *)alloc_fileio( sizeof(*fileio), FILE_AsyncReadService, handle, apc, apc_user )))
         return STATUS_NO_MEMORY;
 
     fileio->already = already;
@@ -1345,7 +1350,7 @@ NTSTATUS WINAPI NtWriteFile(HANDLE hFile, HANDLE hEvent,
         {
             struct async_fileio_write *fileio;
 
-            fileio = (struct async_fileio_write *)alloc_fileio( sizeof(*fileio), hFile, apc, apc_user );
+            fileio = (struct async_fileio_write *)alloc_fileio( sizeof(*fileio), FILE_AsyncWriteService, hFile, apc, apc_user );
             if (!fileio)
             {
                 status = STATUS_NO_MEMORY;
@@ -1539,7 +1544,7 @@ static NTSTATUS server_ioctl_file( HANDLE handle, HANDLE event,
     ULONG options;
     ULONG_PTR cvalue = apc ? 0 : (ULONG_PTR)apc_context;
 
-    if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), handle, apc, apc_context )))
+    if (!(async = (struct async_irp *)alloc_fileio( sizeof(*async), irp_completion, handle, apc, apc_context )))
         return STATUS_NO_MEMORY;
     async->event   = event;
     async->buffer  = out_buffer;
@@ -1961,7 +1966,7 @@ NTSTATUS WINAPI NtNotifyChangeDirectoryFile( HANDLE handle, HANDLE event, PIO_AP
     if (filter == 0 || (filter & ~FILE_NOTIFY_ALL)) return STATUS_INVALID_PARAMETER;
 
     fileio = (struct read_changes_fileio *)alloc_fileio( offsetof(struct read_changes_fileio, data[size]),
-                                                         handle, apc, apc_context );
+                                                         read_changes_apc, handle, apc, apc_context );
     if (!fileio) return STATUS_NO_MEMORY;
 
     fileio->buffer      = buffer;




More information about the wine-cvs mailing list