]> xenbits.xensource.com Git - pvdrivers/win/xenvkbd.git/commitdiff
Correct return codes during racy destruction.
authorMartin Harvey <martin.harvey@citrix.com>
Mon, 5 Dec 2022 09:01:59 +0000 (09:01 +0000)
committerPaul Durrant <pdurrant@amazon.com>
Mon, 5 Dec 2022 09:09:33 +0000 (09:09 +0000)
Errors in PnP retun codes found when testing under driver
verifier with mixed VM lifecycle operations. Under some
rare cases, it is possible to get more than one PnP
"remove-like" operation. This results in a PnP remove
operation being processed whilst the device is already
in the deleted state.

This patch fixes the immediate cause of the bugfixes,
by fixing the return code. Device destruction is
unchanged. Investigation into the root cause is still
ongoing.

Signed-off-by: Martin Harvey <martin.harvey@citrix.com>
Extrapolated this patch from other drivers.
Cosmetic fixes.

Signed-off-by: Paul Durrant <paul@xen.org>
src/xenvkbd/driver.c

index 5e98af052c2dd38e6abff7605c9da2aadd102ccb..26f6cb2a821832f8e4ff3b094cf1fb81ddf814d5 100644 (file)
@@ -287,8 +287,20 @@ Dispatch(
     ASSERT3P(Dx->DeviceObject, ==, DeviceObject);
 
     if (Dx->DevicePnpState == Deleted) {
+        PIO_STACK_LOCATION  StackLocation = IoGetCurrentIrpStackLocation(Irp);
+        UCHAR               MajorFunction = StackLocation->MajorFunction;
+        UCHAR               MinorFunction = StackLocation->MinorFunction;
+
         status = STATUS_NO_SUCH_DEVICE;
 
+        if (MajorFunction == IRP_MJ_PNP) {
+            /* FDO and PDO deletions can block after being marked deleted, but before IoDeleteDevice */
+            if (MinorFunction == IRP_MN_SURPRISE_REMOVAL || MinorFunction == IRP_MN_REMOVE_DEVICE)
+                status = STATUS_SUCCESS;
+
+            ASSERT((MinorFunction != IRP_MN_CANCEL_REMOVE_DEVICE) && (MinorFunction != IRP_MN_CANCEL_STOP_DEVICE));
+        }
+
         Irp->IoStatus.Status = status;
         IoCompleteRequest(Irp, IO_NO_INCREMENT);
         goto done;