server: Pass Information field from async I/O APCs.
diff --git a/server/async.c b/server/async.c
index 98d6075..acf61d8 100644
--- a/server/async.c
+++ b/server/async.c
@@ -231,7 +231,7 @@
 }
 
 /* store the result of the client-side async callback */
-void async_set_result( struct object *obj, unsigned int status )
+void async_set_result( struct object *obj, unsigned int status, unsigned long total )
 {
     struct async *async = (struct async *)obj;
 
@@ -256,7 +256,7 @@
         async->timeout = NULL;
         async->status = status;
         if (async->data.cvalue && async->queue && async->queue->fd)
-            fd_add_completion( async->queue->fd, async->data.cvalue, status, 0 ); /* TODO pass Information field */
+            fd_add_completion( async->queue->fd, async->data.cvalue, status, total );
         if (async->data.apc)
         {
             apc_call_t data;
diff --git a/server/file.h b/server/file.h
index dbf0930..1c659be 100644
--- a/server/file.h
+++ b/server/file.h
@@ -136,7 +136,7 @@
 extern struct async *create_async( struct thread *thread, struct async_queue *queue,
                                    const async_data_t *data );
 extern void async_set_timeout( struct async *async, timeout_t timeout, unsigned int status );
-extern void async_set_result( struct object *obj, unsigned int status );
+extern void async_set_result( struct object *obj, unsigned int status, unsigned long total );
 extern int async_waiting( struct async_queue *queue );
 extern void async_terminate( struct async *async, unsigned int status );
 extern void async_wake_up( struct async_queue *queue, unsigned int status );
diff --git a/server/protocol.def b/server/protocol.def
index cf3ffa1..dfb5d48 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -287,7 +287,7 @@
     struct
     {
         enum apc_type    type;     /* APC_ASYNC_IO */
-        unsigned int   (*func)(void*, void*, unsigned int);
+        unsigned int   (*func)(void*, void*, unsigned int, unsigned long *);
         void            *user;     /* user pointer */
         void            *sb;       /* status block */
         unsigned int     status;   /* I/O status */
@@ -372,6 +372,7 @@
     {
         enum apc_type    type;      /* APC_ASYNC_IO */
         unsigned int     status;    /* new status of async operation */
+        unsigned long    total;     /* bytes transferred */
     } async_io;
     struct
     {
diff --git a/server/thread.c b/server/thread.c
index 99cf896..6eb43ee 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1199,7 +1199,7 @@
         }
         else if (apc->result.type == APC_ASYNC_IO)
         {
-            if (apc->owner) async_set_result( apc->owner, apc->result.async_io.status );
+            if (apc->owner) async_set_result( apc->owner, apc->result.async_io.status, apc->result.async_io.total );
         }
         wake_up( &apc->obj, 0 );
         close_handle( current->process, req->prev_apc );