[driver,device,irp] Don't use mini IRP handling registration
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 3 Dec 2010 06:36:14 +0000 (01:36 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 3 Dec 2010 19:17:31 +0000 (14:17 -0500)
We're moving away from registering/deregistering mini IRP
handling tables for devices, and towards each device class
implementing its own dispatch routine.

src/include/driver.h
src/include/irp.h
src/winvblock/device.c
src/winvblock/driver.c
src/winvblock/irp.c

index 8c289ba..383de9d 100644 (file)
@@ -40,8 +40,6 @@
 
 #  define POOLSIZE 2048
 
-extern irp__handling driver__handling_table[];
-extern size_t driver__handling_table_size;
 extern PDRIVER_OBJECT driver__obj_ptr;
 
 extern winvblock__lib_func void STDCALL Driver_CompletePendingIrp (
@@ -78,5 +76,7 @@ typedef NTSTATUS STDCALL (driver__dispatch_func)(
   );
 
 extern winvblock__lib_func driver__dispatch_func (driver__default_dispatch);
+extern winvblock__lib_func irp__handler_decl (driver__not_supported);
+extern winvblock__lib_func irp__handler_decl (driver__create_close);
 
 #endif                         /* _DRIVER_H */
index f00ff40..9755668 100644 (file)
@@ -102,7 +102,7 @@ extern irp__handler_decl (
 extern winvblock__lib_func NTSTATUS STDCALL (irp__process_with_table)(
     IN PDEVICE_OBJECT,
     IN PIRP,
-    irp__handling *,
+    const irp__handling *,
     size_t,
     winvblock__bool *
   );
index 40db50d..18b61e6 100644 (file)
@@ -98,11 +98,6 @@ device__create (
   dev_ptr->DriverObject = driver__obj_ptr;
   dev_ptr->ops.create_pdo = make_dev_pdo;
   dev_ptr->ops.free = free_dev;
-  /*
-   * Register the default driver IRP handling table
-   */
-  irp__reg_table_s ( &dev_ptr->irp_handler_chain, driver__handling_table,
-                    driver__handling_table_size );
 
   return dev_ptr;
 }
@@ -179,10 +174,6 @@ device__free_decl (
   free_dev
  )
 {
-  /*
-   * Un-register the default driver IRP handling table
-   */
-  irp__unreg_table ( &dev_ptr->irp_handler_chain, driver__handling_table );
   /*
    * Track the device deletion in our global list.  Unfortunately,
    * for now we have faith that a device won't be deleted twice and
index c0f47e5..063ae70 100644 (file)
@@ -204,11 +204,14 @@ static NTSTATUS STDCALL (driver_dispatch_not_supported)(
     return Irp->IoStatus.Status;
   }
 
-static
-irp__handler_decl (
-  create_close
- )
-{
+/* Handle IRP_MJ_CREATE and IRP_MJ_CLOSE */
+extern winvblock__lib_func NTSTATUS STDCALL (driver__create_close)(
+    IN PDEVICE_OBJECT (DeviceObject),
+    IN PIRP (Irp),
+    IN PIO_STACK_LOCATION (Stack),
+    IN struct _device__type * (dev_ptr),
+    OUT winvblock__bool_ptr (completion_ptr)
+  ) {
   NTSTATUS status = STATUS_SUCCESS;
 
   Irp->IoStatus.Status = status;
@@ -217,11 +220,14 @@ irp__handler_decl (
   return status;
 }
 
-static
-irp__handler_decl (
-  not_supported
- )
-{
+/* IRP is not understood. */
+extern winvblock__lib_func NTSTATUS STDCALL (driver__not_supported)(
+    IN PDEVICE_OBJECT (DeviceObject),
+    IN PIRP (Irp),
+    IN PIO_STACK_LOCATION (Stack),
+    IN struct _device__type * (dev_ptr),
+    OUT winvblock__bool_ptr (completion_ptr)
+  ) {
   NTSTATUS status = STATUS_NOT_SUPPORTED;
   Irp->IoStatus.Status = status;
   IoCompleteRequest ( Irp, IO_NO_INCREMENT );
@@ -229,22 +235,6 @@ irp__handler_decl (
   return status;
 }
 
-irp__handling driver__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, not_supported}
-  ,
-  {IRP_MJ_CLOSE, 0, FALSE, TRUE, create_close}
-  ,
-  {IRP_MJ_CREATE, 0, FALSE, TRUE, create_close}
-};
-
-size_t driver__handling_table_size = sizeof ( driver__handling_table );
-
 static NTSTATUS STDCALL (driver_dispatch)(
     IN PDEVICE_OBJECT DeviceObject,
     IN PIRP Irp
@@ -296,6 +286,17 @@ winvblock__lib_func NTSTATUS STDCALL (driver__default_dispatch)(
   ) {
     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 },
+      };
 
     status = irp__process(
         dev,
@@ -304,6 +305,15 @@ winvblock__lib_func NTSTATUS STDCALL (driver__default_dispatch)(
         ((driver__dev_ext_ptr) dev->DeviceExtension)->device,
         &completion
       );
+    /* Fall through to some driver defaults, if needed. */
+    if (status == STATUS_NOT_SUPPORTED && !completion)
+      status = irp__process_with_table(
+          dev,
+          irp,
+          handling_table,
+          sizeof handling_table,
+          &completion
+        );
     #ifdef DEBUGIRPS
     if (status != STATUS_PENDING)
       Debug_IrpEnd(irp, status);
index 529b59e..3b74501 100644 (file)
@@ -168,7 +168,7 @@ irp__unreg_table (
 winvblock__lib_func NTSTATUS STDCALL (irp__process_with_table)(
     IN PDEVICE_OBJECT (dev),
     IN PIRP (irp),
-    irp__handling * (table),
+    const irp__handling * (table),
     size_t (table_size),
     winvblock__bool * (completion)
   ) {