[ramdisk] Use RAM disk PDO creation function
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 9 Jan 2011 03:07:02 +0000 (22:07 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sun, 9 Jan 2011 03:10:12 +0000 (22:10 -0500)
ramdisk__create() replaced by WvRamdiskCreatePdo().

src/include/ramdisk.h
src/winvblock/ramdisk/grub4dos.c
src/winvblock/ramdisk/memdisk.c
src/winvblock/ramdisk/ramdisk.c

index 702d2ec..01bc930 100644 (file)
  */
 
 typedef struct WV_RAMDISK_T {
-    WV_SP_DISK_T disk;
+    WV_S_DEV_EXT DevExt;
+    WV_S_DISK_T disk[1];
     UINT32 DiskBuf;
     UINT32 DiskSize;
     WV_FP_DEV_FREE prev_free;
     LIST_ENTRY tracking;
   } WV_S_RAMDISK_T, * WV_SP_RAMDISK_T;
 
-extern WV_SP_RAMDISK_T ramdisk__create(void);
+extern WV_SP_RAMDISK_T WvRamdiskCreatePdo(IN WVL_E_DISK_MEDIA_TYPE);
 
 #endif  /* WV_M_RAMDISK_H_ */
index f27b94b..1a2481c 100644 (file)
@@ -129,7 +129,7 @@ VOID WvRamdiskG4dFind(void) {
                   WvlDiskMediaTypeFloppy;
                 sector_size = 512;
               }
-            ramdisk = ramdisk__create();
+            ramdisk = WvRamdiskCreatePdo(media_type);
             if (ramdisk == NULL) {
                 DBG("Could not create GRUB4DOS disk!\n");
                 return;
index fe7538f..c746799 100644 (file)
@@ -88,7 +88,7 @@ static BOOLEAN STDCALL WvMemdiskCheckMbft_(
                media_type = WvlDiskMediaTypeFloppy;
         sector_size = 512;
       }
-    ramdisk = ramdisk__create();
+    ramdisk = WvRamdiskCreatePdo(media_type);
     if (ramdisk == NULL) {
         DBG("Could not create MEMDISK disk!\n");
         return FALSE;
index eebb095..fe6fc74 100644 (file)
@@ -144,47 +144,69 @@ static UINT32 STDCALL WvRamdiskQueryId_(
   }
 
 /**
- * Create a new RAM disk.
+ * Create a RAM disk PDO of the given media type.
  *
- * @ret ramdisk         The address of a new RAM disk, or NULL for failure.
+ * @v MediaType                 The media type for the RAM disk.
+ * @ret WV_SP_RAMDISK_T         Points to the new RAM disk, or NULL.
  *
- * This function should not be confused with a PDO creation routine, which is
- * actually implemented for each device type.  This routine will allocate a
- * WV_S_RAMDISK_T, track it in a global list, as well as populate the disk
- * with default values.
+ * Returns NULL if the PDO cannot be created.
  */
-WV_SP_RAMDISK_T ramdisk__create(void) {
-    WV_SP_DISK_T disk;
+WV_SP_RAMDISK_T STDCALL WvRamdiskCreatePdo(
+    IN WVL_E_DISK_MEDIA_TYPE MediaType
+  ) {
+    static WV_S_DEV_IRP_MJ irp_mj = {
+        WvDiskIrpPower,
+        WvDiskIrpSysCtl,
+        disk_dev_ctl__dispatch,
+        disk_scsi__dispatch,
+        disk_pnp__dispatch,
+      };
+    NTSTATUS status;
     WV_SP_RAMDISK_T ramdisk;
+    PDEVICE_OBJECT pdo;
+  
+    DBG("Creating RAM disk PDO...\n");
+
+    /* Create the disk PDO. */
+    status = WvlDiskCreatePdo(
+        WvDriverObj,
+        sizeof *ramdisk,
+        MediaType,
+        &pdo
+      );
+    if (!NT_SUCCESS(status)) {
+        WvlError("WvlDiskCreatePdo", status);
+        return NULL;
+      }
 
-    /* Try to create a disk. */
-    disk = disk__create();
-    if (disk == NULL)
-      goto err_nodisk;
-    /*
-     * RAM disk devices might be used for booting and should
-     * not be allocated from a paged memory pool.
-     */
-    ramdisk = wv_mallocz(sizeof *ramdisk);
-    if (ramdisk == NULL)
-      goto err_noramdisk;
-    /* Populate non-zero device defaults. */
-    ramdisk->disk = disk;
-    ramdisk->prev_free = disk->Dev->Ops.Free;
-    disk->Dev->Ops.Free = WvRamdiskFree_;
-    disk->Dev->Ops.PnpId = WvRamdiskQueryId_;
-    disk->disk_ops.Io = WvRamdiskIo_;
-    disk->ext = ramdisk;
-    disk->DriverObj = WvDriverObj;
-
-    return ramdisk;
-
-    err_noramdisk:
+    ramdisk = pdo->DeviceExtension;
+    RtlZeroMemory(ramdisk, sizeof *ramdisk);
+    WvDiskInit(ramdisk->disk);
+    WvDevInit(ramdisk->disk->Dev);
+    ramdisk->disk->Dev->Ops.Free = WvRamdiskFree_;
+    ramdisk->disk->Dev->Ops.PnpId = WvRamdiskQueryId_;
+    ramdisk->disk->Dev->ext = ramdisk->disk;
+    ramdisk->disk->Dev->IrpMj = &irp_mj;
+    ramdisk->disk->disk_ops.Io = WvRamdiskIo_;
+    ramdisk->disk->ext = ramdisk;
+    ramdisk->disk->DriverObj = WvDriverObj;
+
+    /* Set associations for the PDO, device, disk. */
+    WvDevForDevObj(pdo, ramdisk->disk->Dev);
+    KeInitializeEvent(
+        &ramdisk->disk->SearchEvent,
+        SynchronizationEvent,
+        FALSE
+      );
+    KeInitializeSpinLock(&ramdisk->disk->SpinLock);
+    ramdisk->disk->Dev->Self = pdo;
 
-    WvDevFree(disk->Dev);
-    err_nodisk:
+    /* Some device parameters. */
+    pdo->Flags |= DO_DIRECT_IO;         /* FIXME? */
+    pdo->Flags |= DO_POWER_INRUSH;      /* FIXME? */
 
-    return NULL;
+    DBG("New PDO: %p\n", pdo);
+    return ramdisk;
   }
 
 /**
@@ -193,9 +215,5 @@ WV_SP_RAMDISK_T ramdisk__create(void) {
  * @v dev               Points to the RAM disk device to delete.
  */
 static VOID STDCALL WvRamdiskFree_(IN WV_SP_DEV_T dev) {
-    WV_SP_RAMDISK_T ramdisk = WvRamdiskFromDev_(dev);
-    /* Free the "inherited class". */
-    ramdisk->prev_free(dev);
-  
-    wv_free(ramdisk);
+    IoDeleteDevice(dev->Self);
   }