From 3f0a38fdc9c818f3c70242e210bf599a96ae8b7b Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 4 Mar 2012 23:08:33 +0000 Subject: [PATCH] [RAMDISK] Implement RamdiskRemoveBusDevice. Stubplement RamdiskDeleteDiskDevice. Use them in RamdiskPnp. svn path=/trunk/; revision=56021 --- .../drivers/storage/class/ramdisk/ramdisk.c | 145 +++++++++++++++++- 1 file changed, 141 insertions(+), 4 deletions(-) diff --git a/reactos/drivers/storage/class/ramdisk/ramdisk.c b/reactos/drivers/storage/class/ramdisk/ramdisk.c index 2c209443081..42b94c9b0a0 100644 --- a/reactos/drivers/storage/class/ramdisk/ramdisk.c +++ b/reactos/drivers/storage/class/ramdisk/ramdisk.c @@ -1974,6 +1974,120 @@ PassToNext: return IoCallDriver(DeviceExtension->AttachedDevice, Irp); } +NTSTATUS +NTAPI +RamdiskDeleteDiskDevice(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; + while (TRUE); + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +RamdiskRemoveBusDevice(IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + NTSTATUS Status; + PLIST_ENTRY ListHead, NextEntry; + PRAMDISK_BUS_EXTENSION DeviceExtension; + PRAMDISK_DRIVE_EXTENSION DriveExtension; + + DeviceExtension = DeviceObject->DeviceExtension; + + // + // Acquire disks list lock + // + KeEnterCriticalRegion(); + ExAcquireFastMutex(&DeviceExtension->DiskListLock); + + // + // Loop over drives + // + ListHead = &DeviceExtension->DiskList; + NextEntry = ListHead->Flink; + while (NextEntry != ListHead) + { + DriveExtension = CONTAINING_RECORD(NextEntry, + RAMDISK_DRIVE_EXTENSION, + DiskList); + + // + // Delete the disk + // + IoAcquireRemoveLock(&DriveExtension->RemoveLock, NULL); + RamdiskDeleteDiskDevice(DriveExtension->PhysicalDeviceObject, NULL); + + // + // RamdiskDeleteDiskDevice releases list lock, so reacquire it + // + KeEnterCriticalRegion(); + ExAcquireFastMutex(&DeviceExtension->DiskListLock); + } + + // + // Release disks list lock + // + ExReleaseFastMutex(&DeviceExtension->DiskListLock); + KeLeaveCriticalRegion(); + + // + // Prepare to pass to the lower driver + // + IoSkipCurrentIrpStackLocation(Irp); + // + // Here everything went fine + // + Irp->IoStatus.Status = STATUS_SUCCESS; + + // + // Call lower driver + // + Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp); + + // + // Update state + // + DeviceExtension->State = RamdiskStateBusRemoved; + + // + // Release the lock, and ensure that everyone + // has finished its job before we continue + // The lock has been acquired by the dispatcher + // + IoReleaseRemoveLockAndWait(&DeviceExtension->RemoveLock, Irp); + + // + // If there's a drive name + // + if (DeviceExtension->DriveDeviceName.Buffer) + { + // + // Inform it's going to be disabled + // and free the drive name + // + IoSetDeviceInterfaceState(&DeviceExtension->DriveDeviceName, FALSE); + RtlFreeUnicodeString(&DeviceExtension->DriveDeviceName); + } + + // + // Part from the stack, detach from lower device + // + IoDetachDevice(DeviceExtension->AttachedDevice); + + // + // Finally, delete device + // + RamdiskBusFdo = NULL; + IoDeleteDevice(DeviceObject); + + // + // Return status from lower driver + // + return Status; +} + NTSTATUS NTAPI RamdiskPnp(IN PDEVICE_OBJECT DeviceObject, @@ -2068,10 +2182,33 @@ RamdiskPnp(IN PDEVICE_OBJECT DeviceObject, break; case IRP_MN_REMOVE_DEVICE: - - DPRINT1("PnP IRP: %lx\n", Minor); - while (TRUE); - break; + + // + // Remove the proper device + // + if (DeviceExtension->Type == RamdiskBus) + { + Status = RamdiskRemoveBusDevice(DeviceObject, Irp); + + // + // Return here, lower device has already been called + // And remove lock released. This is needed by the function. + // + return Status; + } + else + { + Status = RamdiskDeleteDiskDevice(DeviceObject, Irp); + + // + // Complete the IRP here and return + // Here again we don't have to release remove lock + // This has already been done by the function. + // + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return Status; + } case IRP_MN_SURPRISE_REMOVAL: