From 781dd9a145d0ef8e4465f78b8916ea0861b5e161 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 3 May 2019 15:40:18 +0200 Subject: [PATCH] server: Store currently executed IRP call on server side. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- server/device.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/server/device.c b/server/device.c index 0fa23cae2ef..61831b41cf0 100644 --- a/server/device.c +++ b/server/device.c @@ -89,6 +89,7 @@ struct device_manager struct object obj; /* object header */ struct list devices; /* list of devices */ struct list requests; /* list of pending irps across all devices */ + struct irp_call *current_call; /* call currently executed on client side */ struct wine_rb_tree kernel_objects; /* map of objects that have client side pointer associated */ }; @@ -710,6 +711,12 @@ static void device_manager_destroy( struct object *obj ) struct kernel_object *kernel_object; struct list *ptr; + if (manager->current_call) + { + release_object( manager->current_call ); + manager->current_call = NULL; + } + while (manager->kernel_objects.root) { kernel_object = WINE_RB_ENTRY_VALUE( manager->kernel_objects.root, struct kernel_object, rb_entry ); @@ -740,6 +747,7 @@ static struct device_manager *create_device_manager(void) if ((manager = alloc_object( &device_manager_ops ))) { + manager->current_call = NULL; list_init( &manager->devices ); list_init( &manager->requests ); wine_rb_init( &manager->kernel_objects, compare_kernel_object ); @@ -870,6 +878,12 @@ DECL_HANDLER(get_next_device_request) clear_error(); } + if (manager->current_call) + { + release_object( manager->current_call ); + manager->current_call = NULL; + } + if ((ptr = list_head( &manager->requests ))) { irp = LIST_ENTRY( ptr, struct irp_call, mgr_entry ); @@ -889,7 +903,8 @@ DECL_HANDLER(get_next_device_request) iosb->in_size = 0; list_remove( &irp->mgr_entry ); list_init( &irp->mgr_entry ); - if (!irp->file) release_object( irp ); /* no longer on manager queue */ + if (irp->file) grab_object( irp ); /* we already own the object if it's only on manager queue */ + manager->current_call = irp; } } else set_error( STATUS_PENDING );