Jacek Caban : server: Use generic kernel object list to store client device file pointer.

Alexandre Julliard julliard at winehq.org
Thu Apr 25 16:39:26 CDT 2019


Module: wine
Branch: master
Commit: 52ff9bd3acb2fa42b63d6a079d3c128d588639e3
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=52ff9bd3acb2fa42b63d6a079d3c128d588639e3

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Apr 25 14:55:10 2019 +0200

server: Use generic kernel object list to store client device file pointer.

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

---

 dlls/ntoskrnl.exe/ntoskrnl.c |  3 +--
 server/device.c              | 30 +++++++++++++++++++-----------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index c1e6a9c..b353839 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -518,8 +518,7 @@ static const WCHAR file_type_name[] = {'F','i','l','e',0};
 
 static struct _OBJECT_TYPE file_type = {
     file_type_name,
-    create_file_object,
-    free_kernel_object
+    create_file_object
 };
 
 POBJECT_TYPE IoFileObjectType = &file_type;
diff --git a/server/device.c b/server/device.c
index 7037a2c..1d864e0 100644
--- a/server/device.c
+++ b/server/device.c
@@ -170,7 +170,7 @@ struct device_file
     struct object          obj;           /* object header */
     struct device         *device;        /* device for this file */
     struct fd             *fd;            /* file descriptor for irp */
-    client_ptr_t           user_ptr;      /* opaque ptr for client side */
+    struct list            kernel_object; /* list of kernel object pointers */
     int                    closed;        /* closed file flag */
     struct list            entry;         /* entry in device list */
     struct list            requests;      /* list of pending irp requests */
@@ -178,6 +178,7 @@ struct device_file
 
 static void device_file_dump( struct object *obj, int verbose );
 static struct fd *device_file_get_fd( struct object *obj );
+static struct list *device_file_get_kernel_obj_list( struct object *obj );
 static int device_file_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
 static void device_file_destroy( struct object *obj );
 static enum server_fd_type device_file_get_fd_type( struct fd *fd );
@@ -204,7 +205,7 @@ static const struct object_ops device_file_ops =
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
     no_open_file,                     /* open_file */
-    no_kernel_obj_list,               /* get_kernel_obj_list */
+    device_file_get_kernel_obj_list,  /* get_kernel_obj_list */
     device_file_close_handle,         /* close_handle */
     device_file_destroy               /* destroy */
 };
@@ -432,7 +433,7 @@ static struct object *device_open_file( struct object *obj, unsigned int access,
 
     file->device = (struct device *)grab_object( device );
     file->closed = 0;
-    file->user_ptr = 0;
+    list_init( &file->kernel_object );
     list_init( &file->requests );
     list_add_tail( &device->files, &file->entry );
     if (device->unix_path)
@@ -494,6 +495,12 @@ static struct fd *device_file_get_fd( struct object *obj )
     return (struct fd *)grab_object( file->fd );
 }
 
+static struct list *device_file_get_kernel_obj_list( struct object *obj )
+{
+    struct device_file *file = (struct device_file *)obj;
+    return &file->kernel_object;
+}
+
 static int device_file_close_handle( struct object *obj, struct process *process, obj_handle_t handle )
 {
     struct device_file *file = (struct device_file *)obj;
@@ -531,26 +538,26 @@ static void device_file_destroy( struct object *obj )
     release_object( file->device );
 }
 
-static void fill_irp_params( struct irp_call *irp, irp_params_t *params )
+static void fill_irp_params( struct device_manager *manager, struct irp_call *irp, irp_params_t *params )
 {
     *params = irp->params;
 
     switch (params->major)
     {
     case IRP_MJ_CLOSE:
-        params->close.file = irp->file->user_ptr;
+        params->close.file = get_kernel_object_ptr( manager, &irp->file->obj );
         break;
     case IRP_MJ_READ:
-        params->read.file  = irp->file->user_ptr;
+        params->read.file  = get_kernel_object_ptr( manager, &irp->file->obj );
         break;
     case IRP_MJ_WRITE:
-        params->write.file = irp->file->user_ptr;
+        params->write.file = get_kernel_object_ptr( manager, &irp->file->obj );
         break;
     case IRP_MJ_FLUSH_BUFFERS:
-        params->flush.file = irp->file->user_ptr;
+        params->flush.file = get_kernel_object_ptr( manager, &irp->file->obj );
         break;
     case IRP_MJ_DEVICE_CONTROL:
-        params->ioctl.file = irp->file->user_ptr;
+        params->ioctl.file = get_kernel_object_ptr( manager, &irp->file->obj );
         break;
     }
 }
@@ -873,7 +880,7 @@ DECL_HANDLER(get_next_device_request)
         if (iosb->in_size > get_reply_max_size()) set_error( STATUS_BUFFER_OVERFLOW );
         else if (!irp->file || (reply->next = alloc_handle( current->process, irp, 0, 0 )))
         {
-            fill_irp_params( irp, &reply->params );
+            fill_irp_params( manager, irp, &reply->params );
             set_reply_data_ptr( iosb->in_data, iosb->in_size );
             iosb->in_data = NULL;
             iosb->in_size = 0;
@@ -895,7 +902,8 @@ DECL_HANDLER(set_irp_result)
 
     if ((irp = (struct irp_call *)get_handle_obj( current->process, req->handle, 0, &irp_call_ops )))
     {
-        if (irp->file) irp->file->user_ptr = req->file_ptr;
+        if (irp->file && irp->file->device->manager)
+            set_kernel_object( irp->file->device->manager, &irp->file->obj, req->file_ptr );
         set_irp_result( irp, req->status, get_req_data(), get_req_data_size(), req->size );
         close_handle( current->process, req->handle );  /* avoid an extra round-trip for close */
         release_object( irp );




More information about the wine-cvs mailing list