[KBDCLASS/MOUCLASS]

- Better fix for the race condition

svn path=/trunk/; revision=54042
This commit is contained in:
Cameron Gutman 2011-10-07 05:52:52 +00:00
parent 8b969e61ec
commit 89107a6e11
2 changed files with 14 additions and 8 deletions

View file

@ -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;
}

View file

@ -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;
}