[dummy] Handle PnP device removal
[people/sha0/winvblock.git] / src / winvblock / dummy.c
index 0053420..caa694a 100644 (file)
@@ -49,11 +49,20 @@ static NTSTATUS STDCALL WvDummyPnp(
     IN PIRP irp,
     IN UCHAR code
   ) {
     IN PIRP irp,
     IN UCHAR code
   ) {
-    if (code != IRP_MN_QUERY_ID)
-      return WvlIrpComplete(irp, 0, STATUS_NOT_SUPPORTED);
+    switch (code) {
+        case IRP_MN_QUERY_ID:
+          /* The WV_S_DEV_T extension points to the dummy IDs. */
+          return WvDummyIds(irp, dev->ext);
 
 
-    /* The WV_S_DEV_T extension points to the dummy IDs. */
-    return WvDummyIds(irp, dev->ext);
+        case IRP_MN_QUERY_REMOVE_DEVICE:
+          return WvlIrpComplete(irp, 0, STATUS_SUCCESS);
+
+        case IRP_MN_REMOVE_DEVICE:
+          return WvlIrpComplete(irp, 0, WvlBusRemoveNode(&dev->BusNode));
+
+        default:
+          return WvlIrpComplete(irp, 0, STATUS_NOT_SUPPORTED);
+      }
   }
 
 typedef struct WV_ADD_DUMMY {
   }
 
 typedef struct WV_ADD_DUMMY {
@@ -216,6 +225,18 @@ WVL_M_LIB NTSTATUS STDCALL WvDummyAdd(
     return context.Status;
   }
 
     return context.Status;
   }
 
+/**
+ * Remove a dummy PDO node on the WinVBlock bus.
+ *
+ * @v Pdo               The PDO to remove.
+ * @ret NTSTATUS        The status of the operation.
+ *
+ * It might actually be better to handle a PnP remove IOCTL.
+ */
+WVL_M_LIB NTSTATUS STDCALL WvDummyRemove(IN PDEVICE_OBJECT Pdo) {
+    return WvlBusRemoveNode(&WvDevFromDevObj(Pdo)->BusNode);
+  }
+
 /**
  * Handle a PnP ID query with a WV_S_DUMMY_IDS object.
  *
 /**
  * Handle a PnP ID query with a WV_S_DUMMY_IDS object.
  *