From: Rémi Bernon rbernon@codeweavers.com
--- dlls/hidclass.sys/device.c | 19 ++++++++++--------- dlls/hidclass.sys/hid.h | 5 +---- dlls/hidclass.sys/pnp.c | 11 ++++------- 3 files changed, 15 insertions(+), 20 deletions(-)
diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c index 9b817876ae7..86f2e3907e6 100644 --- a/dlls/hidclass.sys/device.c +++ b/dlls/hidclass.sys/device.c @@ -264,8 +264,9 @@ static void hid_device_queue_input( DEVICE_OBJECT *device, HID_XFER_PACKET *pack
InitializeListHead( &completed );
- KeAcquireSpinLock( &ext->u.pdo.queues_lock, &irql ); - LIST_FOR_EACH_ENTRY( queue, &ext->u.pdo.queues, struct hid_queue, entry ) + KeAcquireSpinLock( &ext->u.pdo.lock, &irql ); + if (ext->u.pdo.removed) WARN( "Device has been removed, dropping report\n" ); + else LIST_FOR_EACH_ENTRY( queue, &ext->u.pdo.queues, struct hid_queue, entry ) { if (!polled) hid_queue_push_report( queue, last_report );
@@ -283,7 +284,7 @@ static void hid_device_queue_input( DEVICE_OBJECT *device, HID_XFER_PACKET *pack } while (polled); } - KeReleaseSpinLock( &ext->u.pdo.queues_lock, irql ); + KeReleaseSpinLock( &ext->u.pdo.lock, irql );
while ((entry = RemoveHeadList( &completed )) != &completed) { @@ -356,9 +357,9 @@ static DWORD CALLBACK hid_device_thread(void *args) { if (!report_id) io.Information++; if (!(report = find_report_with_type_and_id( ext, HidP_Input, buffer[0], FALSE ))) - WARN( "dropping unknown input id %u\n", buffer[0] ); + ERR( "dropping unknown input id %u\n", buffer[0] ); else if (!ext->u.pdo.poll_interval && io.Information < report->InputLength) - WARN( "dropping short report, len %Iu expected %u\n", io.Information, report->InputLength ); + ERR( "dropping short report, len %Iu expected %u\n", io.Information, report->InputLength ); else { packet->reportId = buffer[0]; @@ -775,9 +776,9 @@ NTSTATUS WINAPI pdo_create(DEVICE_OBJECT *device, IRP *irp) if (!(queue = hid_queue_create())) irp->IoStatus.Status = STATUS_NO_MEMORY; else { - KeAcquireSpinLock( &ext->u.pdo.queues_lock, &irql ); + KeAcquireSpinLock( &ext->u.pdo.lock, &irql ); list_add_tail( &ext->u.pdo.queues, &queue->entry ); - KeReleaseSpinLock( &ext->u.pdo.queues_lock, irql ); + KeReleaseSpinLock( &ext->u.pdo.lock, irql );
irp->Tail.Overlay.OriginalFileObject->FsContext = queue; irp->IoStatus.Status = STATUS_SUCCESS; @@ -809,9 +810,9 @@ NTSTATUS WINAPI pdo_close(DEVICE_OBJECT *device, IRP *irp)
if (queue) { - KeAcquireSpinLock( &ext->u.pdo.queues_lock, &irql ); + KeAcquireSpinLock( &ext->u.pdo.lock, &irql ); list_remove( &queue->entry ); - KeReleaseSpinLock( &ext->u.pdo.queues_lock, irql ); + KeReleaseSpinLock( &ext->u.pdo.lock, irql ); hid_queue_destroy( queue ); }
diff --git a/dlls/hidclass.sys/hid.h b/dlls/hidclass.sys/hid.h index 0ceddbf7751..89f9bb54c4b 100644 --- a/dlls/hidclass.sys/hid.h +++ b/dlls/hidclass.sys/hid.h @@ -67,13 +67,10 @@ typedef struct _BASE_DEVICE_EXTENSION HANDLE halt_event; HANDLE thread; UINT32 rawinput_handle; - - KSPIN_LOCK queues_lock; - struct list queues; - UNICODE_STRING link_name;
KSPIN_LOCK lock; + struct list queues; BOOL removed;
BOOL is_mouse; diff --git a/dlls/hidclass.sys/pnp.c b/dlls/hidclass.sys/pnp.c index 483a0746b95..f866f011dc8 100644 --- a/dlls/hidclass.sys/pnp.c +++ b/dlls/hidclass.sys/pnp.c @@ -285,7 +285,7 @@ static NTSTATUS create_child_pdos( minidriver *minidriver, DEVICE_OBJECT *device pdo_ext = child_pdo->DeviceExtension; pdo_ext->u.pdo.parent_fdo = device; list_init( &pdo_ext->u.pdo.queues ); - KeInitializeSpinLock( &pdo_ext->u.pdo.queues_lock ); + KeInitializeSpinLock( &pdo_ext->u.pdo.lock );
pdo_ext->u.pdo.collection_desc = fdo_ext->u.fdo.device_desc.CollectionDesc + i;
@@ -569,10 +569,10 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp) } CloseHandle(ext->u.pdo.halt_event);
- KeAcquireSpinLock( &ext->u.pdo.queues_lock, &irql ); + KeAcquireSpinLock( &ext->u.pdo.lock, &irql ); LIST_FOR_EACH_ENTRY_SAFE( queue, next, &ext->u.pdo.queues, struct hid_queue, entry ) hid_queue_destroy( queue ); - KeReleaseSpinLock( &ext->u.pdo.queues_lock, irql ); + KeReleaseSpinLock( &ext->u.pdo.lock, irql );
RtlFreeUnicodeString(&ext->u.pdo.link_name);
@@ -584,12 +584,9 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device, IRP *irp) case IRP_MN_SURPRISE_REMOVAL: KeAcquireSpinLock(&ext->u.pdo.lock, &irql); ext->u.pdo.removed = TRUE; - KeReleaseSpinLock(&ext->u.pdo.lock, irql); - - KeAcquireSpinLock( &ext->u.pdo.queues_lock, &irql ); LIST_FOR_EACH_ENTRY_SAFE( queue, next, &ext->u.pdo.queues, struct hid_queue, entry ) hid_queue_remove_pending_irps( queue ); - KeReleaseSpinLock( &ext->u.pdo.queues_lock, irql ); + KeReleaseSpinLock( &ext->u.pdo.lock, irql );
SetEvent(ext->u.pdo.halt_event); status = STATUS_SUCCESS;