[disk] Split WvDiskCreatePdo_() for WV_S_DEV_T independence
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sat, 8 Jan 2011 20:27:08 +0000 (15:27 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Sat, 8 Jan 2011 20:27:08 +0000 (15:27 -0500)
The independent portion is now in WvlDiskCreatePdo().

src/include/disk.h
src/winvblock/disk/disk.c

index a88d4e3..7895f3a 100644 (file)
@@ -168,6 +168,12 @@ extern WVL_M_LIB VOID disk__guess_geometry(
     IN OUT WV_SP_DISK_T disk_ptr
   );
 
+extern WVL_M_LIB NTSTATUS STDCALL WvlDiskCreatePdo(
+    IN PDRIVER_OBJECT,
+    IN SIZE_T,
+    IN WVL_E_DISK_MEDIA_TYPE,
+    OUT PDEVICE_OBJECT *
+  );
 extern WVL_M_LIB VOID STDCALL WvDiskInit(IN WV_SP_DISK_T);
 extern WVL_M_LIB WV_SP_DISK_T disk__create(void);
 
index aef8d28..4c9854a 100644 (file)
@@ -113,6 +113,85 @@ static NTSTATUS STDCALL WvDiskIrpSysCtl_(IN WV_SP_DEV_T dev, IN PIRP irp) {
     return WvlIrpComplete(irp, 0, irp->IoStatus.Status);
   }
 
+
+/**
+ * Create a disk PDO.
+ *
+ * @v DriverObj         The driver to associate with the PDO.
+ * @v ExtensionSize     The device object extension size.
+ * @v MediaType         The media type for the device.
+ * @v Pdo               Points to the PDO pointer to fill, upon success.
+ */
+WVL_M_LIB NTSTATUS STDCALL WvlDiskCreatePdo(
+    IN PDRIVER_OBJECT DriverObj,
+    IN SIZE_T ExtensionSize,
+    IN WVL_E_DISK_MEDIA_TYPE MediaType,
+    OUT PDEVICE_OBJECT * Pdo
+  ) {
+    /* Floppy, hard disk, optical disc specifics. */
+    static const DEVICE_TYPE disk_types[WvlDiskMediaTypes] =
+      { FILE_DEVICE_DISK, FILE_DEVICE_DISK, FILE_DEVICE_CD_ROM };
+    static const UINT32 characteristics[WvlDiskMediaTypes] = {
+        FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE,
+        0,
+        FILE_REMOVABLE_MEDIA | FILE_READ_ONLY_DEVICE
+      };
+    NTSTATUS status;
+    PDEVICE_OBJECT pdo;
+
+    /* Validate parameters. */
+    status = STATUS_INVALID_PARAMETER;
+    if (!DriverObj) {
+        DBG("No driver passed!\n");
+        goto err_driver_obj;
+      }
+    if (ExtensionSize < sizeof (WV_S_DEV_EXT)) {
+        DBG("Extension size too small!\n");
+        goto err_ext_size;
+      }
+    if (MediaType >= WvlDiskMediaTypes) {
+        DBG("Unknown media type!\n");
+        goto err_media_type;
+      }
+    if (!Pdo) {
+        DBG("No PDO to fill!\n");
+        goto err_pdo_fill;
+      }
+
+    /* Create the PDO. */
+    status = IoCreateDevice(
+        DriverObj,
+        ExtensionSize,
+        NULL,
+        disk_types[MediaType],
+        FILE_AUTOGENERATED_DEVICE_NAME |
+          FILE_DEVICE_SECURE_OPEN |
+          characteristics[MediaType],
+        FALSE,
+        &pdo
+      );
+    if (!NT_SUCCESS(status)) {
+        DBG("Could not create disk PDO.\n");
+        goto err_pdo;
+      }
+
+    *Pdo = pdo;
+    return STATUS_SUCCESS;
+
+    IoDeleteDevice(pdo);
+    err_pdo:
+
+    err_pdo_fill:
+
+    err_media_type:
+
+    err_ext_size:
+
+    err_driver_obj:
+
+    return status;
+  }
+
 /**
  * Create a disk PDO filled with the given disk parameters.
  *
@@ -128,34 +207,21 @@ static PDEVICE_OBJECT STDCALL WvDiskCreatePdo_(IN WV_SP_DEV_T dev_ptr) {
     NTSTATUS status;
     /* The new node's physical device object (PDO). */
     PDEVICE_OBJECT dev_obj_ptr;
-    /* Floppy, hard disk, optical disc specifics. */
-    static DEVICE_TYPE disk_types[WvlDiskMediaTypes] =
-      { FILE_DEVICE_DISK, FILE_DEVICE_DISK, FILE_DEVICE_CD_ROM };
-    static UINT32 characteristics[WvlDiskMediaTypes] = {
-        FILE_REMOVABLE_MEDIA | FILE_FLOPPY_DISKETTE,
-        0,
-        FILE_REMOVABLE_MEDIA | FILE_READ_ONLY_DEVICE
-      };
   
-    DBG("Creating PDO...\n");
+    DBG("Creating PDO for dev %p...\n", dev_ptr);
 
     /* Point to the disk details provided. */
     disk_ptr = disk__get_ptr(dev_ptr);
 
     /* Create the disk PDO. */
-    status = IoCreateDevice(
+    status = WvlDiskCreatePdo(
         disk_ptr->DriverObj,
         sizeof (WV_S_DEV_EXT),
-        NULL,
-        disk_types[disk_ptr->Media],
-        FILE_AUTOGENERATED_DEVICE_NAME |
-          FILE_DEVICE_SECURE_OPEN |
-          characteristics[disk_ptr->Media],
-        FALSE,
+        disk_ptr->Media,
         &dev_obj_ptr
       );
     if (!NT_SUCCESS(status)) {
-        WvlError("IoCreateDevice", status);
+        WvlError("WvlDiskCreatePdo", status);
         return NULL;
       }