[ros-diffs] [pschweitzer] 56009: [RAMDISK] Implement RamdiskFlushBuffers, RamdiskUnload

pschweitzer at svn.reactos.org pschweitzer at svn.reactos.org
Sun Mar 4 19:48:09 UTC 2012


Author: pschweitzer
Date: Sun Mar  4 19:48:09 2012
New Revision: 56009

URL: http://svn.reactos.org/svn/reactos?rev=56009&view=rev
Log:
[RAMDISK]
Implement RamdiskFlushBuffers, RamdiskUnload

Modified:
    trunk/reactos/drivers/storage/class/ramdisk/ramdisk.c

Modified: trunk/reactos/drivers/storage/class/ramdisk/ramdisk.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/storage/class/ramdisk/ramdisk.c?rev=56009&r1=56008&r2=56009&view=diff
==============================================================================
--- trunk/reactos/drivers/storage/class/ramdisk/ramdisk.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/storage/class/ramdisk/ramdisk.c [iso-8859-1] Sun Mar  4 19:48:09 2012
@@ -2221,17 +2221,54 @@
 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




More information about the Ros-diffs mailing list