[HIDCLASS]
authorCameron Gutman <aicommander@gmail.com>
Thu, 26 Jan 2012 03:27:22 +0000 (03:27 +0000)
committerCameron Gutman <aicommander@gmail.com>
Thu, 26 Jan 2012 03:27:22 +0000 (03:27 +0000)
- Implement IRP_MN_REMOVE_DEVICE for FDOs and PDOs
- USB mice will now work after being disconnected then reconnected

svn path=/branches/usb-bringup-trunk/; revision=55194

drivers/hid/hidclass/fdo.c
drivers/hid/hidclass/pdo.c

index d684431..7604d51 100644 (file)
@@ -384,9 +384,18 @@ HidClassFDO_RemoveDevice(
     IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp)
 {
-    UNIMPLEMENTED
-    ASSERT(FALSE);
-    return STATUS_NOT_IMPLEMENTED;
+    PHIDCLASS_FDO_EXTENSION FDODeviceExtension = DeviceObject->DeviceExtension;
+    NTSTATUS Status;
+
+    /* Pass the IRP down */
+    IoSkipCurrentIrpStackLocation(Irp);
+    Status = IoCallDriver(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject, Irp);
+
+    /* Now teardown our portion of the device stack */
+    IoDetachDevice(FDODeviceExtension->Common.HidDeviceExtension.NextDeviceObject);
+    IoDeleteDevice(DeviceObject);
+
+    return Status;
 }
 
 NTSTATUS
index 492b72b..e0dc735 100644 (file)
@@ -514,14 +514,18 @@ HidClassPDO_PnP(
         }
         case IRP_MN_REMOVE_DEVICE:
         {
-            DPRINT1("[HIDCLASS] PDO IRP_MN_REMOVE_DEVICE not implemented\n");
-            ASSERT(FALSE);
+            /* Disable the device interface */
+            if (PDODeviceExtension->DeviceInterface.Length != 0)
+                IoSetDeviceInterfaceState(&PDODeviceExtension->DeviceInterface, FALSE);
 
-            //
-            // do nothing
-            //
-            Status = STATUS_SUCCESS; //Irp->IoStatus.Status;
-            break;
+            /* Complete the IRP */
+            Irp->IoStatus.Status = STATUS_SUCCESS;
+            IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+            /* Delete our device object*/
+            IoDeleteDevice(DeviceObject);
+
+            return STATUS_SUCCESS;
         }
         case IRP_MN_QUERY_INTERFACE:
         {