[disk] Move away from mini IRP handling table registration
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 3 Dec 2010 21:23:54 +0000 (16:23 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 3 Dec 2010 21:29:12 +0000 (16:29 -0500)
There was no current usage for hooking a disk's mini IRP
handling table chain, so we simply walk the one table from
a disk_dispatch() function.

src/winvblock/disk/disk.c

index 6a28482..d7eb015 100644 (file)
@@ -122,34 +122,6 @@ irp__handler_decl (
   return status;
 }
 
-static irp__handling handling_table[] = {
-  /*
-   * Major, minor, any major?, any minor?, handler
-   */
-  {IRP_MJ_DEVICE_CONTROL, 0, FALSE, TRUE, disk_dev_ctl__dispatch}
-  ,
-  {IRP_MJ_SYSTEM_CONTROL, 0, FALSE, TRUE, sys_ctl}
-  ,
-  {IRP_MJ_POWER, 0, FALSE, TRUE, power}
-  ,
-  {IRP_MJ_SCSI, 0, FALSE, TRUE, disk_scsi__dispatch}
-  ,
-  {IRP_MJ_PNP, 0, FALSE, TRUE, disk_pnp__simple}
-  ,
-  {IRP_MJ_PNP, IRP_MN_QUERY_CAPABILITIES, FALSE, FALSE,
-   disk_pnp__query_capabilities}
-  ,
-  {IRP_MJ_PNP, IRP_MN_QUERY_BUS_INFORMATION, FALSE, FALSE,
-   disk_pnp__query_bus_info}
-  ,
-  {IRP_MJ_PNP, IRP_MN_QUERY_DEVICE_RELATIONS, FALSE, FALSE,
-   disk_pnp__query_dev_relations}
-  ,
-  {IRP_MJ_PNP, IRP_MN_QUERY_DEVICE_TEXT, FALSE, FALSE, disk_pnp__query_dev_text}
-  ,
-  {IRP_MJ_PNP, IRP_MN_QUERY_ID, FALSE, FALSE, disk_pnp__query_id}
-};
-
 /**
  * Create a disk PDO filled with the given disk parameters
  *
@@ -383,6 +355,59 @@ disk__guess_geometry (
     disk_ptr->Cylinders = disk_ptr->LBADiskSize / ( heads * sects_per_track );
 }
 
+/* Disk dispatch routine. */
+static NTSTATUS STDCALL (disk_dispatch)(
+    IN PDEVICE_OBJECT (dev),
+    IN PIRP (irp)
+  ) {
+    NTSTATUS (status);
+    winvblock__bool (completion) = FALSE;
+    static const irp__handling (handling_table)[] = {
+        /*
+         * Major, minor, any major?, any minor?, handler
+         * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+         * Note that the fall-through case must come FIRST!
+         * Why? It sets completion to true, so others won't be called.
+         */
+        {                     0, 0,  TRUE,  TRUE,  driver__not_supported },
+        {          IRP_MJ_CLOSE, 0, FALSE,  TRUE,   driver__create_close },
+        {         IRP_MJ_CREATE, 0, FALSE,  TRUE,   driver__create_close },
+        { IRP_MJ_DEVICE_CONTROL, 0, FALSE,  TRUE, disk_dev_ctl__dispatch },
+        { IRP_MJ_SYSTEM_CONTROL, 0, FALSE,  TRUE,                sys_ctl },
+        {          IRP_MJ_POWER, 0, FALSE,  TRUE,                  power },
+        {           IRP_MJ_SCSI, 0, FALSE,  TRUE,    disk_scsi__dispatch },
+        {            IRP_MJ_PNP, 0, FALSE,  TRUE,       disk_pnp__simple },
+        {            IRP_MJ_PNP,
+         IRP_MN_QUERY_CAPABILITIES, FALSE, FALSE,
+                                            disk_pnp__query_capabilities },
+        {            IRP_MJ_PNP,
+      IRP_MN_QUERY_BUS_INFORMATION, FALSE, FALSE,
+                                                disk_pnp__query_bus_info },
+        {            IRP_MJ_PNP,
+     IRP_MN_QUERY_DEVICE_RELATIONS, FALSE, FALSE,
+                                           disk_pnp__query_dev_relations },
+        {            IRP_MJ_PNP,
+          IRP_MN_QUERY_DEVICE_TEXT, FALSE, FALSE,
+                                                disk_pnp__query_dev_text },
+        {            IRP_MJ_PNP,
+                   IRP_MN_QUERY_ID, FALSE, FALSE,     disk_pnp__query_id },
+      };
+
+    status = irp__process_with_table(
+        dev,
+        irp,
+        handling_table,
+        sizeof handling_table,
+        &completion
+      );
+    #ifdef DEBUGIRPS
+    if (status != STATUS_PENDING)
+      Debug_IrpEnd(irp, status);
+    #endif
+
+    return status;
+  }
+
 /**
  * Create a new disk
  *
@@ -424,16 +449,13 @@ disk__create (
   disk_ptr->disk_ops.max_xfer_len = default_max_xfer_len;
   disk_ptr->disk_ops.init = default_init;
   disk_ptr->disk_ops.close = default_close;
+  dev_ptr->dispatch = disk_dispatch;
   dev_ptr->ops.close = close;
   dev_ptr->ops.create_pdo = create_pdo;
   dev_ptr->ops.free = free_disk;
   dev_ptr->ops.init = init;
   dev_ptr->ext = disk_ptr;
   KeInitializeSpinLock ( &disk_ptr->SpinLock );
-  /*
-   * Register the default disk IRP handling table
-   */
-  irp__reg_table ( &dev_ptr->irp_handler_chain, handling_table );
 
   return disk_ptr;
 
@@ -475,10 +497,6 @@ device__free_decl (
  )
 {
   disk__type_ptr disk_ptr = disk__get_ptr ( dev_ptr );
-  /*
-   * Un-register the default disk IRP handling table
-   */
-  irp__unreg_table ( &dev_ptr->irp_handler_chain, handling_table );
   /*
    * Free the "inherited class"
    */