From 89107a6e119822e2e9afd713970a8b3dadae6a41 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 7 Oct 2011 05:52:52 +0000 Subject: [PATCH] [KBDCLASS/MOUCLASS] - Better fix for the race condition svn path=/trunk/; revision=54042 --- reactos/drivers/input/kbdclass/kbdclass.c | 11 +++++++---- reactos/drivers/input/mouclass/mouclass.c | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/reactos/drivers/input/kbdclass/kbdclass.c b/reactos/drivers/input/kbdclass/kbdclass.c index 38da20ccb88..606927d7e03 100644 --- a/reactos/drivers/input/kbdclass/kbdclass.c +++ b/reactos/drivers/input/kbdclass/kbdclass.c @@ -761,6 +761,7 @@ HandleReadIrp( { PCLASS_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; NTSTATUS Status; + KIRQL OldIrql; TRACE_(CLASS_NAME, "HandleReadIrp(DeviceObject %p, Irp %p)\n", DeviceObject, Irp); @@ -804,18 +805,20 @@ HandleReadIrp( } else { - IoMarkIrpPending(Irp); - DeviceExtension->PendingIrp = Irp; - (VOID)IoSetCancelRoutine(Irp, ClassCancelRoutine); - if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL)) + IoAcquireCancelSpinLock(&OldIrql); + if (Irp->Cancel) { DeviceExtension->PendingIrp = NULL; Status = STATUS_CANCELLED; } else { + IoMarkIrpPending(Irp); + DeviceExtension->PendingIrp = Irp; + (VOID)IoSetCancelRoutine(Irp, ClassCancelRoutine); Status = STATUS_PENDING; } + IoReleaseCancelSpinLock(OldIrql); } return Status; } diff --git a/reactos/drivers/input/mouclass/mouclass.c b/reactos/drivers/input/mouclass/mouclass.c index 775931b9701..99818bb6b5e 100644 --- a/reactos/drivers/input/mouclass/mouclass.c +++ b/reactos/drivers/input/mouclass/mouclass.c @@ -738,6 +738,7 @@ HandleReadIrp( { PCLASS_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; NTSTATUS Status; + KIRQL OldIrql; TRACE_(CLASS_NAME, "HandleReadIrp(DeviceObject %p, Irp %p)\n", DeviceObject, Irp); @@ -781,18 +782,20 @@ HandleReadIrp( } else { - IoMarkIrpPending(Irp); - DeviceExtension->PendingIrp = Irp; - (VOID)IoSetCancelRoutine(Irp, ClassCancelRoutine); - if (Irp->Cancel && IoSetCancelRoutine(Irp, NULL)) + IoAcquireCancelSpinLock(&OldIrql); + if (Irp->Cancel) { DeviceExtension->PendingIrp = NULL; Status = STATUS_CANCELLED; } else { + IoMarkIrpPending(Irp); + DeviceExtension->PendingIrp = Irp; + (VOID)IoSetCancelRoutine(Irp, ClassCancelRoutine); Status = STATUS_PENDING; } + IoReleaseCancelSpinLock(OldIrql); } return Status; }