mirror of
https://github.com/reactos/reactos.git
synced 2024-10-15 05:37:44 +00:00
[RAMDISK]
Implement RamdiskRemoveBusDevice. Stubplement RamdiskDeleteDiskDevice. Use them in RamdiskPnp. svn path=/trunk/; revision=56021
This commit is contained in:
parent
c257a48ec6
commit
3f0a38fdc9
|
@ -1974,6 +1974,120 @@ PassToNext:
|
||||||
return IoCallDriver(DeviceExtension->AttachedDevice, Irp);
|
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
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
@ -2069,9 +2183,32 @@ RamdiskPnp(IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
case IRP_MN_REMOVE_DEVICE:
|
case IRP_MN_REMOVE_DEVICE:
|
||||||
|
|
||||||
DPRINT1("PnP IRP: %lx\n", Minor);
|
//
|
||||||
while (TRUE);
|
// Remove the proper device
|
||||||
break;
|
//
|
||||||
|
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:
|
case IRP_MN_SURPRISE_REMOVAL:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue