[disk] Use new PnpQueryId member of WV_S_DISK_T
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 10 Jan 2011 00:17:06 +0000 (19:17 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 10 Jan 2011 00:18:18 +0000 (19:18 -0500)
To satisfy IRP_MJ_PNP:IRP_MN_QUERY_ID.

This breaks the IRP_MN_QUERY_DEVICE_TEXT handling in
disk_pnp__query_dev_text_() (for now).

src/aoe/driver.c
src/include/disk.h
src/winvblock/disk/pnp.c
src/winvblock/filedisk/filedisk.c
src/winvblock/ramdisk/ramdisk.c

index 98a5333..6a93eb8 100644 (file)
@@ -1373,39 +1373,65 @@ static UINT32 AoeDiskMaxXferLen_(IN WV_SP_DISK_T disk) {
     return disk->SectorSize * aoe_disk->MaxSectorsPerPacket;
   }
 
-static UINT32 STDCALL query_id(
-    IN WV_SP_DEV_T dev,
-    IN BUS_QUERY_ID_TYPE query_type,
-    IN OUT WCHAR (*buf)[512]
+static NTSTATUS STDCALL AoeDiskPnpQueryId_(
+    IN PDEVICE_OBJECT dev_obj,
+    IN PIRP irp,
+    IN WV_SP_DISK_T disk
   ) {
-    AOE_SP_DISK aoe_disk = AoeDiskFromDev_(dev);
+    WCHAR (*buf)[512];
+    NTSTATUS status;
+    BUS_QUERY_ID_TYPE query_type;
+    AOE_SP_DISK aoe_disk = dev_obj->DeviceExtension;
+
+    /* Allocate a buffer. */
+    buf = wv_mallocz(sizeof *buf);
+    if (!buf) {
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto err_buf;
+      }
 
+    /* Populate the buffer with IDs. */
+    query_type = IoGetCurrentIrpStackLocation(irp)->Parameters.QueryId.IdType;
     switch (query_type) {
         case BusQueryDeviceID:
-          return swprintf(*buf, WVL_M_WLIT L"\\AoEHardDisk") + 1;
+          swprintf(*buf, WVL_M_WLIT L"\\AoEHardDisk");
+          break;
 
         case BusQueryInstanceID:
-          return swprintf(
+          swprintf(
               *buf,
               L"AoE_at_Shelf_%d.Slot_%d",
               aoe_disk->Major,
               aoe_disk->Minor
-            ) + 1;
-
-        case BusQueryHardwareIDs: {
-            UINT32 tmp;
+            );
+          break;
 
-            tmp = swprintf(*buf, WVL_M_WLIT L"\\AoEHardDisk") + 1;
-            tmp += swprintf(*buf + tmp, L"GenDisk") + 4;
-            return tmp;
-          }
+        case BusQueryHardwareIDs:
+          swprintf(
+              *buf + swprintf(*buf, WVL_M_WLIT L"\\AoEHardDisk") + 1,
+              L"GenDisk"
+            );
+          break;
 
         case BusQueryCompatibleIDs:
-          return swprintf(*buf, L"GenDisk") + 4;
+          swprintf(*buf, L"GenDisk");
+          break;
 
         default:
-          return 0;
+          DBG("Unknown query type %d for %p!\n", query_type, aoe_disk);
+          status = STATUS_INVALID_PARAMETER;
+          goto err_query_type;
       }
+
+    DBG("IRP_MN_QUERY_ID for AoE disk %p.\n", aoe_disk);
+    return WvlIrpComplete(irp, (ULONG_PTR) buf, STATUS_SUCCESS);
+
+    err_query_type:
+
+    wv_free(buf);
+    err_buf:
+
+    return WvlIrpComplete(irp, 0, status);
   }
 
 #ifdef _MSC_VER
@@ -1723,7 +1749,6 @@ static AOE_SP_DISK AoeDiskCreatePdo_(void) {
     WvDiskInit(aoe_disk->disk);
     WvDevInit(aoe_disk->Dev);
     aoe_disk->Dev->Ops.Free = AoeDiskFree_;
-    aoe_disk->Dev->Ops.PnpId = query_id;
     aoe_disk->Dev->ext = aoe_disk->disk;
     aoe_disk->disk->Dev = aoe_disk->Dev;
     aoe_disk->disk->Media = WvlDiskMediaTypeHard;
@@ -1731,6 +1756,7 @@ static AOE_SP_DISK AoeDiskCreatePdo_(void) {
     aoe_disk->disk->disk_ops.MaxXferLen = AoeDiskMaxXferLen_;
     aoe_disk->disk->disk_ops.Close = AoeDiskClose_;
     aoe_disk->disk->disk_ops.UnitNum = AoeDiskUnitNum_;
+    aoe_disk->disk->disk_ops.PnpQueryId = AoeDiskPnpQueryId_;
     aoe_disk->disk->ext = aoe_disk;
     aoe_disk->disk->DriverObj = AoeDriverObj_;
 
index 6c39753..5779db4 100644 (file)
@@ -132,6 +132,7 @@ typedef struct WV_DISK_OPS {
     WV_FP_DISK_MAX_XFER_LEN MaxXferLen;
     WV_FP_DISK_CLOSE Close;
     WVL_FP_DISK_UNIT_NUM UnitNum;
+    WVL_FP_DISK_PNP PnpQueryId;
   } WV_S_DISK_OPS, * WV_SP_DISK_OPS;
 
 struct WV_DISK_T {
index 8db199e..345a797 100644 (file)
@@ -379,7 +379,9 @@ WVL_M_LIB NTSTATUS STDCALL disk_pnp__dispatch(
     switch (io_stack_loc->MinorFunction) {
         case IRP_MN_QUERY_ID:
           DBG("IRP_MN_QUERY_ID\n");
-          return WvDevPnpQueryId(Disk->Dev, Irp);
+          if (Disk->disk_ops.PnpQueryId)
+            return Disk->disk_ops.PnpQueryId(DevObj, Irp, Disk);
+          return WvlIrpComplete(Irp, 0, STATUS_NOT_SUPPORTED);
 
         case IRP_MN_QUERY_DEVICE_TEXT:
           DBG("IRP_MN_QUERY_DEVICE_TEXT\n");
index f110286..58830dc 100644 (file)
@@ -31,6 +31,7 @@
 #include "portable.h"
 #include "winvblock.h"
 #include "wv_stdlib.h"
+#include "irp.h"
 #include "driver.h"
 #include "bus.h"
 #include "device.h"
@@ -106,40 +107,65 @@ static NTSTATUS STDCALL WvFilediskIo_(
     return status;
   }
 
-static UINT32 STDCALL query_id(
-    IN WV_SP_DEV_T dev,
-    IN BUS_QUERY_ID_TYPE query_type,
-    IN OUT WCHAR (*buf)[512]
+static NTSTATUS STDCALL WvFilediskPnpQueryId_(
+    IN PDEVICE_OBJECT dev_obj,
+    IN PIRP irp,
+    IN WV_SP_DISK_T disk
   ) {
-    WV_SP_DISK_T disk = disk__get_ptr(dev);
-    WV_SP_FILEDISK_T filedisk = filedisk__get_ptr(dev);
-    static PWCHAR hw_ids[WvlDiskMediaTypes] = {
+    static const WCHAR * hw_ids[WvlDiskMediaTypes] = {
         WVL_M_WLIT L"\\FileFloppyDisk",
         WVL_M_WLIT L"\\FileHardDisk",
         WVL_M_WLIT L"\\FileOpticalDisc"
       };
+    WCHAR (*buf)[512];
+    NTSTATUS status;
+    WV_SP_FILEDISK_T filedisk = CONTAINING_RECORD(disk, WV_S_FILEDISK_T, disk);
+    BUS_QUERY_ID_TYPE query_type;
+
+    /* Allocate a buffer. */
+    buf = wv_mallocz(sizeof *buf);
+    if (!buf) {
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto err_buf;
+      }
 
+    /* Populate the buffer with IDs. */
+    query_type = IoGetCurrentIrpStackLocation(irp)->Parameters.QueryId.IdType;
     switch (query_type) {
         case BusQueryDeviceID:
-          return swprintf(*buf, hw_ids[disk->Media]) + 1;
+          swprintf(*buf, hw_ids[disk->Media]);
+          break;
 
         case BusQueryInstanceID:
-          return swprintf(*buf, L"Hash_%08X", filedisk->hash) + 1;
-
-        case BusQueryHardwareIDs: {
-            UINT32 tmp;
+          /* "Location". */
+          swprintf(*buf, L"Hash_%08X", filedisk->hash);
+          break;
 
-            tmp = swprintf(*buf, hw_ids[disk->Media]) + 1;
-            tmp += swprintf(*buf + tmp, WvDiskCompatIds[disk->Media]) + 4;
-            return tmp;
-          }
+        case BusQueryHardwareIDs:
+          swprintf(
+              *buf + swprintf(*buf, hw_ids[disk->Media]) + 1,
+              WvDiskCompatIds[disk->Media]
+            );
+          break;
 
         case BusQueryCompatibleIDs:
-          return swprintf(*buf, WvDiskCompatIds[disk->Media]) + 4;
+          swprintf(*buf, WvDiskCompatIds[disk->Media]);
 
         default:
-          return 0;
+          DBG("Unknown query type %d for %p!\n", query_type, filedisk);
+          status = STATUS_INVALID_PARAMETER;
+          goto err_query_type;
       }
+
+    DBG("IRP_MN_QUERY_ID for file-backed disk %p.\n", filedisk);
+    return WvlIrpComplete(irp, (ULONG_PTR) buf, STATUS_SUCCESS);
+
+    err_query_type:
+
+    wv_free(buf);
+    err_buf:
+
+    return WvlIrpComplete(irp, 0, status);
   }
 
 /* Attach a file as a disk, based on an IRP. */
@@ -336,13 +362,13 @@ WV_SP_FILEDISK_T STDCALL WvFilediskCreatePdo(
     WvDiskInit(filedisk->disk);
     WvDevInit(filedisk->Dev);
     filedisk->Dev->Ops.Free = WvFilediskFree_;
-    filedisk->Dev->Ops.PnpId = query_id;
     filedisk->Dev->Ops.Close = WvFilediskClose_;
     filedisk->Dev->ext = filedisk->disk;
     filedisk->Dev->IrpMj = &irp_mj;
     filedisk->disk->Dev = filedisk->Dev;
     filedisk->disk->disk_ops.Io = WvFilediskIo_;
     filedisk->disk->disk_ops.UnitNum = WvFilediskUnitNum_;
+    filedisk->disk->disk_ops.PnpQueryId = WvFilediskPnpQueryId_;
     filedisk->disk->ext = filedisk;
     filedisk->disk->DriverObj = WvDriverObj;
 
index ecd066f..4a2ab14 100644 (file)
@@ -104,41 +104,67 @@ static NTSTATUS STDCALL WvRamdiskIo_(
   }
 
 /* Copy RAM disk IDs to the provided buffer. */
-static UINT32 STDCALL WvRamdiskQueryId_(
-    IN WV_SP_DEV_T dev,
-    IN BUS_QUERY_ID_TYPE query_type,
-    IN OUT WCHAR (*buf)[512]
+static NTSTATUS STDCALL WvRamdiskPnpQueryId_(
+    IN PDEVICE_OBJECT dev_obj,
+    IN PIRP irp,
+    IN WV_SP_DISK_T disk
   ) {
     static const WCHAR * hw_ids[WvlDiskMediaTypes] = {
         WVL_M_WLIT L"\\RAMFloppyDisk",
         WVL_M_WLIT L"\\RAMHardDisk",
         WVL_M_WLIT L"\\RAMOpticalDisc"
       };
-    WV_SP_DISK_T disk = disk__get_ptr(dev);
-    WV_SP_RAMDISK_T ramdisk = WvRamdiskFromDev_(dev);
+    WCHAR (*buf)[512];
+    NTSTATUS status;
+    WV_SP_RAMDISK_T ramdisk = CONTAINING_RECORD(disk, WV_S_RAMDISK_T, disk);
+    PWCHAR hw_id;
+    BUS_QUERY_ID_TYPE query_type;
+
+    /* Allocate a buffer. */
+    buf = wv_mallocz(sizeof *buf);
+    if (!buf) {
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto err_buf;
+      }
 
+    /* Populate the buffer with IDs. */
+    query_type = IoGetCurrentIrpStackLocation(irp)->Parameters.QueryId.IdType;
     switch (query_type) {
         case BusQueryDeviceID:
-          return swprintf(*buf, hw_ids[disk->Media]) + 1;
+          swprintf(*buf, hw_ids[disk->Media]);
+          break;
 
         case BusQueryInstanceID:
                /* "Location". */
-          return swprintf(*buf, L"RAM_at_%08X", ramdisk->DiskBuf) + 1;
+          swprintf(*buf, L"RAM_at_%08X", ramdisk->DiskBuf);
+          break;
 
-        case BusQueryHardwareIDs: {
-            UINT32 tmp;
-
-            tmp = swprintf(*buf, hw_ids[disk->Media]) + 1;
-            tmp += swprintf(*buf + tmp, WvDiskCompatIds[disk->Media]) + 4;
-            return tmp;
-          }
+        case BusQueryHardwareIDs:
+          swprintf(
+              *buf + swprintf(*buf, hw_ids[disk->Media]) + 1,
+              WvDiskCompatIds[disk->Media]
+            );
+          break;
 
         case BusQueryCompatibleIDs:
-          return swprintf(*buf, WvDiskCompatIds[disk->Media]) + 4;
+          swprintf(*buf, WvDiskCompatIds[disk->Media]);
+          break;
 
         default:
-          return 0;
+          DBG("Unknown query type %d for %p!\n", query_type, ramdisk);
+          status = STATUS_INVALID_PARAMETER;
+          goto err_query_type;
       }
+
+    DBG("IRP_MN_QUERY_ID for RAM disk %p.\n", ramdisk);
+    return WvlIrpComplete(irp, (ULONG_PTR) buf, STATUS_SUCCESS);
+
+    err_query_type:
+
+    wv_free(buf);
+    err_buf:
+
+    return WvlIrpComplete(irp, 0, status);
   }
 
 static WVL_F_DISK_UNIT_NUM WvRamdiskUnitNum_;
@@ -194,12 +220,12 @@ WV_SP_RAMDISK_T STDCALL WvRamdiskCreatePdo(
     WvDiskInit(ramdisk->disk);
     WvDevInit(ramdisk->Dev);
     ramdisk->Dev->Ops.Free = WvRamdiskFree_;
-    ramdisk->Dev->Ops.PnpId = WvRamdiskQueryId_;
     ramdisk->Dev->ext = ramdisk->disk;
     ramdisk->Dev->IrpMj = &irp_mj;
     ramdisk->disk->Dev = ramdisk->Dev;
     ramdisk->disk->disk_ops.Io = WvRamdiskIo_;
     ramdisk->disk->disk_ops.UnitNum = WvRamdiskUnitNum_;
+    ramdisk->disk->disk_ops.PnpQueryId = WvRamdiskPnpQueryId_;
     ramdisk->disk->ext = ramdisk;
     ramdisk->disk->DriverObj = WvDriverObj;