[driver,device] Use place-holder driver__default_dispatch
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 2 Dec 2010 20:16:50 +0000 (15:16 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 2 Dec 2010 20:17:13 +0000 (15:17 -0500)
Working towards the same prototype for IRP handling routines,
we need this place-holder while the mini IRP handling
infrastructure is unchanged.  This is simply to ensure build
and functionality during development, and to keep commit size
reasonable.

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

index 53795ee..e8e7316 100644 (file)
@@ -183,6 +183,8 @@ typedef void STDCALL (device__thread_func)(IN void *);
 struct _device__type
 {
   winvblock__bool IsBus;       /* For debugging */
+  /* A device's IRP dispatch routine. */
+  driver__dispatch_func * (dispatch);
   /* The device's thread routine. */
   device__thread_func * (thread);
   /* The device's thread wakeup signal. */
index 93ee193..8c289ba 100644 (file)
@@ -77,4 +77,6 @@ typedef NTSTATUS STDCALL (driver__dispatch_func)(
     IN PIRP
   );
 
+extern winvblock__lib_func driver__dispatch_func (driver__default_dispatch);
+
 #endif                         /* _DRIVER_H */
index dcd05bc..40db50d 100644 (file)
@@ -32,8 +32,8 @@
 #include "wv_stdlib.h"
 #include "portable.h"
 #include "irp.h"
-#include "device.h"
 #include "driver.h"
+#include "device.h"
 #include "debug.h"
 
 static LIST_ENTRY dev_list;
@@ -94,6 +94,7 @@ device__create (
   /*
    * Populate non-zero device defaults
    */
+  dev_ptr->dispatch = driver__default_dispatch;
   dev_ptr->DriverObject = driver__obj_ptr;
   dev_ptr->ops.create_pdo = make_dev_pdo;
   dev_ptr->ops.free = free_dev;
index ee8131a..c0f47e5 100644 (file)
@@ -250,15 +250,11 @@ static NTSTATUS STDCALL (driver_dispatch)(
     IN PIRP Irp
   ) {
   NTSTATUS status;
-  PIO_STACK_LOCATION Stack;
   device__type_ptr dev_ptr;
-  size_t irp_handler_index;
-  winvblock__bool completion = FALSE;
 
 #ifdef DEBUGIRPS
   Debug_IrpStart ( DeviceObject, Irp );
 #endif
-  Stack = IoGetCurrentIrpStackLocation ( Irp );
   dev_ptr = ( ( driver__dev_ext_ptr ) DeviceObject->DeviceExtension )->device;
 
   /*
@@ -266,7 +262,7 @@ static NTSTATUS STDCALL (driver_dispatch)(
    */
   if ( dev_ptr->State == Deleted )
     {
-      if ( Stack->MajorFunction == IRP_MJ_POWER )
+      if (IoGetCurrentIrpStackLocation(Irp)->MajorFunction == IRP_MJ_POWER)
        PoStartNextPowerIrp ( Irp );
       Irp->IoStatus.Information = 0;
       Irp->IoStatus.Status = STATUS_NO_SUCH_DEVICE;
@@ -288,17 +284,34 @@ static NTSTATUS STDCALL (driver_dispatch)(
         );
       KeSetEvent(&dev_ptr->thread_wakeup, 0, FALSE);
       status = STATUS_PENDING;
-    } else
-      status = irp__process(DeviceObject, Irp, Stack, dev_ptr, &completion);
-
-#ifdef DEBUGIRPS
-  if ( status != STATUS_PENDING )
-    Debug_IrpEnd ( Irp, status );
-#endif
+    } else status = dev_ptr->dispatch(DeviceObject, Irp);
 
   return status;
 }
 
+/* Place-holder while implementing a dispatch routine per device class. */
+winvblock__lib_func NTSTATUS STDCALL (driver__default_dispatch)(
+    IN PDEVICE_OBJECT (dev),
+    IN PIRP (irp)
+  ) {
+    NTSTATUS (status);
+    winvblock__bool (completion) = FALSE;
+
+    status = irp__process(
+        dev,
+        irp,
+        IoGetCurrentIrpStackLocation(irp),
+        ((driver__dev_ext_ptr) dev->DeviceExtension)->device,
+        &completion
+      );
+    #ifdef DEBUGIRPS
+    if (status != STATUS_PENDING)
+      Debug_IrpEnd(irp, status);
+    #endif
+
+    return status;
+  }
+
 static void STDCALL
 Driver_Unload (
   IN PDRIVER_OBJECT DriverObject