From 4f16fa360c2aa3e4b9080de8f62972e3d748753f Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Sun, 4 Mar 2012 19:48:09 +0000 Subject: [PATCH] [RAMDISK] Implement RamdiskFlushBuffers, RamdiskUnload svn path=/trunk/; revision=56009 --- .../drivers/storage/class/ramdisk/ramdisk.c | 47 +++++++++++++++++-- 1 file changed, 42 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/storage/class/ramdisk/ramdisk.c b/reactos/drivers/storage/class/ramdisk/ramdisk.c index ae848a035f2..77951d97e96 100644 --- a/reactos/drivers/storage/class/ramdisk/ramdisk.c +++ b/reactos/drivers/storage/class/ramdisk/ramdisk.c @@ -2221,17 +2221,54 @@ NTAPI RamdiskFlushBuffers(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { - UNIMPLEMENTED; - while (TRUE); - return STATUS_SUCCESS; + NTSTATUS Status; + PRAMDISK_DRIVE_EXTENSION DeviceExtension; + + DeviceExtension = DeviceObject->DeviceExtension; + + // + // Ensure we have drive extension + // Only perform flush on disks that have been created + // from registry entries + // + if (DeviceExtension->Type != RamdiskDrive || + DeviceExtension->DiskType > RAMDISK_MEMORY_MAPPED_DISK) + { + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return STATUS_SUCCESS; + } + + // + // Queue the IRP from worker + // + Status = SendIrpToThread(DeviceObject, Irp); + if (Status != STATUS_PENDING) + { + // + // Queueing failed - complete the IRP + // and return failure + // + Irp->IoStatus.Information = 0; + Irp->IoStatus.Status = Status; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + } + + return Status; } VOID NTAPI RamdiskUnload(IN PDRIVER_OBJECT DriverObject) { - UNIMPLEMENTED; - while (TRUE); + // + // Just release registry path if previously allocated + // + if (DriverRegistryPath.Buffer) + { + ExFreePoolWithTag(DriverRegistryPath.Buffer, 'dmaR'); + } } NTSTATUS