[ros-diffs] [cgutman] 47722: [NTOSKRNL] - Implement IRP_MN_REMOVE_DEVICE handling for PnP root PDOs

cgutman at svn.reactos.org cgutman at svn.reactos.org
Wed Jun 9 21:04:44 CET 2010


Author: cgutman
Date: Wed Jun  9 20:04:39 2010
New Revision: 47722

URL: http://svn.reactos.org/svn/reactos?rev=47722&view=rev
Log:
[NTOSKRNL]
- Implement IRP_MN_REMOVE_DEVICE handling for PnP root PDOs

Modified:
    trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c

Modified: trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c?rev=47722&r1=47721&r2=47722&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/io/pnpmgr/pnproot.c [iso-8859-1] Wed Jun  9 20:04:39 2010
@@ -1027,10 +1027,12 @@
   IN PIRP Irp)
 {
   PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension;
+  PPNPROOT_FDO_DEVICE_EXTENSION FdoDeviceExtension;
   PIO_STACK_LOCATION IrpSp;
   NTSTATUS Status;
 
   DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+  FdoDeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)PnpRootDeviceObject->DeviceExtension;
   Status = Irp->IoStatus.Status;
   IrpSp = IoGetCurrentIrpStackLocation(Irp);
 
@@ -1070,7 +1072,32 @@
         break;
 
     case IRP_MN_REMOVE_DEVICE:
-        DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n");
+        /* Remove the device from the device list and decrement the device count*/
+        KeAcquireGuardedMutex(&FdoDeviceExtension->DeviceListLock);
+        RemoveEntryList(&DeviceExtension->DeviceInfo->ListEntry);
+        FdoDeviceExtension->DeviceListCount--;
+        KeReleaseGuardedMutex(&FdoDeviceExtension->DeviceListLock);
+
+        /* Free some strings we created */
+        RtlFreeUnicodeString(&DeviceExtension->DeviceInfo->DeviceDescription);
+        RtlFreeUnicodeString(&DeviceExtension->DeviceInfo->DeviceID);
+        RtlFreeUnicodeString(&DeviceExtension->DeviceInfo->InstanceID);
+
+        /* Free the resource requirements list */
+        if (DeviceExtension->DeviceInfo->ResourceRequirementsList != NULL)
+            ExFreePool(DeviceExtension->DeviceInfo->ResourceRequirementsList);
+
+        /* Free the boot resources list */
+        if (DeviceExtension->DeviceInfo->ResourceList != NULL)
+            ExFreePool(DeviceExtension->DeviceInfo->ResourceList);
+
+        /* Free the device info */
+        ExFreePool(DeviceExtension->DeviceInfo);
+
+        /* Finally, delete the device object */
+        IoDeleteDevice(DeviceObject);
+
+        /* Return success */
         Status = STATUS_SUCCESS;
         break;
 




More information about the Ros-diffs mailing list