[disk] Use new PnpQueryDevText member of WV_S_DISK_T
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 10 Jan 2011 01:59:49 +0000 (20:59 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Mon, 10 Jan 2011 02:00:36 +0000 (21:00 -0500)
To satisfy IRP_MJ_PNP:IRP_MN_QUERY_DEVICE_TEXT.

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

index 6a93eb8..cecc63f 100644 (file)
@@ -1434,6 +1434,64 @@ static NTSTATUS STDCALL AoeDiskPnpQueryId_(
     return WvlIrpComplete(irp, 0, status);
   }
 
+NTSTATUS STDCALL AoeDiskPnpQueryDevText_(
+    IN PDEVICE_OBJECT dev_obj,
+    IN PIRP irp,
+    IN WV_SP_DISK_T disk
+  ) {
+    IN WV_SP_DEV_T dev = WvDevFromDevObj(dev_obj);
+    WCHAR (*str)[512];
+    PIO_STACK_LOCATION io_stack_loc = IoGetCurrentIrpStackLocation(irp);
+    NTSTATUS status;
+    UINT32 str_len;
+
+    /* Allocate a string buffer. */
+    str = wv_mallocz(sizeof *str);
+    if (str == NULL) {
+        DBG("wv_malloc IRP_MN_QUERY_DEVICE_TEXT\n");
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto alloc_str;
+      }
+    /* Determine the query type. */
+    switch (io_stack_loc->Parameters.QueryDeviceText.DeviceTextType) {
+        case DeviceTextDescription:
+          str_len = swprintf(*str, L"AoE Disk") + 1;
+          irp->IoStatus.Information =
+            (ULONG_PTR) wv_palloc(str_len * sizeof *str);
+          if (irp->IoStatus.Information == 0) {
+              DBG("wv_palloc DeviceTextDescription\n");
+              status = STATUS_INSUFFICIENT_RESOURCES;
+              goto alloc_info;
+            }
+          RtlCopyMemory(
+              (PWCHAR) irp->IoStatus.Information,
+              str,
+              str_len * sizeof *str
+            );
+          status = STATUS_SUCCESS;
+          goto alloc_info;
+
+        case DeviceTextLocationInformation:
+          if (disk->disk_ops.PnpQueryId) {
+              io_stack_loc->MinorFunction = IRP_MN_QUERY_ID;
+              io_stack_loc->Parameters.QueryId.IdType = BusQueryInstanceID;
+              return disk->disk_ops.PnpQueryId(dev_obj, irp, disk);
+            }
+          /* Else, fall through... */
+
+        default:
+          irp->IoStatus.Information = 0;
+          status = STATUS_NOT_SUPPORTED;
+      }
+    /* irp->IoStatus.Information not freed. */
+    alloc_info:
+
+    wv_free(str);
+    alloc_str:
+
+    return WvlIrpComplete(irp, irp->IoStatus.Information, status);
+  }
+
 #ifdef _MSC_VER
 #  pragma pack(1)
 #endif
@@ -1757,6 +1815,7 @@ static AOE_SP_DISK AoeDiskCreatePdo_(void) {
     aoe_disk->disk->disk_ops.Close = AoeDiskClose_;
     aoe_disk->disk->disk_ops.UnitNum = AoeDiskUnitNum_;
     aoe_disk->disk->disk_ops.PnpQueryId = AoeDiskPnpQueryId_;
+    aoe_disk->disk->disk_ops.PnpQueryDevText = AoeDiskPnpQueryDevText_;
     aoe_disk->disk->ext = aoe_disk;
     aoe_disk->disk->DriverObj = AoeDriverObj_;
 
index 5779db4..3b2ff2a 100644 (file)
@@ -133,6 +133,7 @@ typedef struct WV_DISK_OPS {
     WV_FP_DISK_CLOSE Close;
     WVL_FP_DISK_UNIT_NUM UnitNum;
     WVL_FP_DISK_PNP PnpQueryId;
+    WVL_FP_DISK_PNP PnpQueryDevText;
   } WV_S_DISK_OPS, * WV_SP_DISK_OPS;
 
 struct WV_DISK_T {
index 1c58190..fc52e68 100644 (file)
@@ -58,6 +58,11 @@ extern NTSTATUS STDCALL WvDiskDevCtl(
   );
 extern NTSTATUS STDCALL WvDiskScsi(IN struct WV_DEV_T *, IN PIRP, IN UCHAR);
 extern NTSTATUS STDCALL WvDiskPnp(IN struct WV_DEV_T *, IN PIRP, IN UCHAR);
+extern NTSTATUS STDCALL WvDiskPnpQueryDevText(
+    IN PDEVICE_OBJECT,
+    IN PIRP,
+    IN struct WV_DISK_T *
+  );
 /* From bus.c */
 extern WVL_M_LIB PDEVICE_OBJECT WvBusFdo(void);
 
index 345a797..4ef9878 100644 (file)
 #include "debug.h"
 
 /* Forward declarations. */
-static WVL_F_DISK_PNP disk_pnp__query_dev_text_;
 static WVL_F_DISK_PNP WvlDiskPnpQueryDevRelations_;
 static WVL_F_DISK_PNP WvlDiskPnpQueryBusInfo_;
 static WVL_F_DISK_PNP WvlDiskPnpQueryCapabilities_;
 static WVL_F_DISK_PNP disk_pnp__simple_;
 
-static NTSTATUS STDCALL disk_pnp__query_dev_text_(
-    IN PDEVICE_OBJECT dev_obj,
-    IN PIRP irp,
-    WV_SP_DISK_T disk
-  ) {
-    IN WV_SP_DEV_T dev = disk->Dev;
-    WCHAR (*str)[512];
-    PIO_STACK_LOCATION io_stack_loc = IoGetCurrentIrpStackLocation(irp);
-    NTSTATUS status;
-    UINT32 str_len;
-
-    /* Allocate a string buffer. */
-    str = wv_mallocz(sizeof *str);
-    if (str == NULL) {
-        DBG("wv_malloc IRP_MN_QUERY_DEVICE_TEXT\n");
-        status = STATUS_INSUFFICIENT_RESOURCES;
-        goto alloc_str;
-      }
-    /* Determine the query type. */
-    switch (io_stack_loc->Parameters.QueryDeviceText.DeviceTextType) {
-        case DeviceTextDescription:
-          str_len = swprintf(*str, WVL_M_WLIT L" Disk") + 1;
-          irp->IoStatus.Information =
-            (ULONG_PTR) wv_palloc(str_len * sizeof *str);
-          if (irp->IoStatus.Information == 0) {
-              DBG("wv_palloc DeviceTextDescription\n");
-              status = STATUS_INSUFFICIENT_RESOURCES;
-              goto alloc_info;
-            }
-          RtlCopyMemory(
-              (PWCHAR) irp->IoStatus.Information,
-              str,
-              str_len * sizeof (WCHAR)
-            );
-          status = STATUS_SUCCESS;
-          goto alloc_info;
-
-        case DeviceTextLocationInformation:
-          str_len = WvDevPnpId(
-              dev,
-              BusQueryInstanceID,
-              str
-            );
-          irp->IoStatus.Information =
-            (ULONG_PTR) wv_palloc(str_len * sizeof *str);
-          if (irp->IoStatus.Information == 0) {
-              DBG("wv_palloc DeviceTextLocationInformation\n");
-              status = STATUS_INSUFFICIENT_RESOURCES;
-              goto alloc_info;
-            }
-          RtlCopyMemory(
-              (PWCHAR) irp->IoStatus.Information,
-              str,
-              str_len * sizeof (WCHAR)
-            );
-          status = STATUS_SUCCESS;
-          goto alloc_info;
-
-        default:
-          irp->IoStatus.Information = 0;
-          status = STATUS_NOT_SUPPORTED;
-      }
-    /* irp->IoStatus.Information not freed. */
-    alloc_info:
-
-    wv_free(str);
-    alloc_str:
-
-    return WvlIrpComplete(irp, irp->IoStatus.Information, status);
-  }
-
 static NTSTATUS STDCALL WvlDiskPnpQueryDevRelations_(
     IN PDEVICE_OBJECT dev_obj,
     IN PIRP irp,
@@ -385,7 +313,9 @@ WVL_M_LIB NTSTATUS STDCALL disk_pnp__dispatch(
 
         case IRP_MN_QUERY_DEVICE_TEXT:
           DBG("IRP_MN_QUERY_DEVICE_TEXT\n");
-          return disk_pnp__query_dev_text_(DevObj, Irp, Disk);
+          if (Disk->disk_ops.PnpQueryDevText)
+            return Disk->disk_ops.PnpQueryDevText(DevObj, Irp, Disk);
+          return WvlIrpComplete(Irp, 0, STATUS_NOT_SUPPORTED);
 
         case IRP_MN_QUERY_DEVICE_RELATIONS:
           DBG("IRP_MN_QUERY_DEVICE_RELATIONS\n");
index a78ade9..4395a8c 100644 (file)
@@ -464,6 +464,64 @@ NTSTATUS STDCALL WvDiskPnp(
     return disk_pnp__dispatch(dev->Self, irp, disk__get_ptr(dev));
   }
 
+NTSTATUS STDCALL WvDiskPnpQueryDevText(
+    IN PDEVICE_OBJECT dev_obj,
+    IN PIRP irp,
+    IN WV_SP_DISK_T disk
+  ) {
+    IN WV_SP_DEV_T dev = WvDevFromDevObj(dev_obj);
+    WCHAR (*str)[512];
+    PIO_STACK_LOCATION io_stack_loc = IoGetCurrentIrpStackLocation(irp);
+    NTSTATUS status;
+    UINT32 str_len;
+
+    /* Allocate a string buffer. */
+    str = wv_mallocz(sizeof *str);
+    if (str == NULL) {
+        DBG("wv_malloc IRP_MN_QUERY_DEVICE_TEXT\n");
+        status = STATUS_INSUFFICIENT_RESOURCES;
+        goto alloc_str;
+      }
+    /* Determine the query type. */
+    switch (io_stack_loc->Parameters.QueryDeviceText.DeviceTextType) {
+        case DeviceTextDescription:
+          str_len = swprintf(*str, WVL_M_WLIT L" Disk") + 1;
+          irp->IoStatus.Information =
+            (ULONG_PTR) wv_palloc(str_len * sizeof *str);
+          if (irp->IoStatus.Information == 0) {
+              DBG("wv_palloc DeviceTextDescription\n");
+              status = STATUS_INSUFFICIENT_RESOURCES;
+              goto alloc_info;
+            }
+          RtlCopyMemory(
+              (PWCHAR) irp->IoStatus.Information,
+              str,
+              str_len * sizeof *str
+            );
+          status = STATUS_SUCCESS;
+          goto alloc_info;
+
+        case DeviceTextLocationInformation:
+          if (disk->disk_ops.PnpQueryId) {
+              io_stack_loc->MinorFunction = IRP_MN_QUERY_ID;
+              io_stack_loc->Parameters.QueryId.IdType = BusQueryInstanceID;
+              return disk->disk_ops.PnpQueryId(dev_obj, irp, disk);
+            }
+          /* Else, fall through... */
+
+        default:
+          irp->IoStatus.Information = 0;
+          status = STATUS_NOT_SUPPORTED;
+      }
+    /* irp->IoStatus.Information not freed. */
+    alloc_info:
+
+    wv_free(str);
+    alloc_str:
+
+    return WvlIrpComplete(irp, irp->IoStatus.Information, status);
+  }
+
 /**
  * Miscellaneous: Grouped memory allocation functions.
  */
index 58830dc..7d95ef9 100644 (file)
@@ -369,6 +369,7 @@ WV_SP_FILEDISK_T STDCALL WvFilediskCreatePdo(
     filedisk->disk->disk_ops.Io = WvFilediskIo_;
     filedisk->disk->disk_ops.UnitNum = WvFilediskUnitNum_;
     filedisk->disk->disk_ops.PnpQueryId = WvFilediskPnpQueryId_;
+    filedisk->disk->disk_ops.PnpQueryDevText = WvDiskPnpQueryDevText;
     filedisk->disk->ext = filedisk;
     filedisk->disk->DriverObj = WvDriverObj;
 
index 4a2ab14..3dac473 100644 (file)
@@ -226,6 +226,7 @@ WV_SP_RAMDISK_T STDCALL WvRamdiskCreatePdo(
     ramdisk->disk->disk_ops.Io = WvRamdiskIo_;
     ramdisk->disk->disk_ops.UnitNum = WvRamdiskUnitNum_;
     ramdisk->disk->disk_ops.PnpQueryId = WvRamdiskPnpQueryId_;
+    ramdisk->disk->disk_ops.PnpQueryDevText = WvDiskPnpQueryDevText;
     ramdisk->disk->ext = ramdisk;
     ramdisk->disk->DriverObj = WvDriverObj;