[bus,driver] Put bus IRP_MJ_SYSTEM_CONTROL handler in driver
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 23 Dec 2010 17:07:38 +0000 (12:07 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Thu, 23 Dec 2010 17:07:38 +0000 (12:07 -0500)
If the bus library is going to be used by any driver, it should
be the driver's responsibility to dispatch IRPs to a bus using
an interface provided by the bus library.

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

index d0232c3..be7ed73 100644 (file)
@@ -94,5 +94,9 @@ extern winvblock__lib_func NTSTATUS STDCALL WvBusAddNode(
   );
 extern winvblock__lib_func NTSTATUS STDCALL WvBusRemoveNode(WV_SP_BUS_NODE);
 extern winvblock__lib_func NTSTATUS STDCALL WvBusEnqueueIrp(WV_SP_BUS_T, PIRP);
+extern winvblock__lib_func NTSTATUS STDCALL WvBusSysCtl(
+    IN WV_SP_BUS_T,
+    IN PIRP
+  );
 
 #endif  /* WV_M_BUS_H_ */
index 11c5a6a..638b496 100644 (file)
@@ -61,7 +61,6 @@ typedef struct WV_BUS_WORK_ITEM_ {
 static WV_F_DEV_FREE WvBusFree_;
 static WV_F_DEV_CREATE_PDO WvBusCreatePdo_;
 static WV_F_DEV_DISPATCH WvBusPower_;
-static WV_F_DEV_DISPATCH WvBusSysCtl_;
 static WV_F_BUS_THREAD WvBusDefaultThread_;
 static winvblock__bool WvBusAddWorkItem_(
     WV_SP_BUS_T,
@@ -72,7 +71,7 @@ static WV_SP_BUS_WORK_ITEM_ WvBusGetWorkItem_(WV_SP_BUS_T);
 /* Globals. */
 WV_S_DEV_IRP_MJ WvBusIrpMj_ = {
     WvBusPower_,
-    WvBusSysCtl_,
+    (WV_FP_DEV_DISPATCH) 0,
     WvBusDevCtlDispatch,
     (WV_FP_DEV_SCSI) 0,
     WvBusPnpDispatch,
@@ -159,16 +158,18 @@ winvblock__lib_func winvblock__bool STDCALL WvBusAddChild(
   }
 
 /* Handle an IRP_MJ_SYSTEM_CONTROL IRP. */
-static NTSTATUS STDCALL WvBusSysCtl_(IN WV_SP_DEV_T dev, IN PIRP irp) {
-    WV_SP_BUS_T bus = WvBusFromDev(dev);
-    PDEVICE_OBJECT lower = bus->LowerDeviceObject;
+winvblock__lib_func NTSTATUS STDCALL WvBusSysCtl(
+    IN WV_SP_BUS_T Bus,
+    IN PIRP Irp
+  ) {
+    PDEVICE_OBJECT lower = Bus->LowerDeviceObject;
 
     if (lower) {
         DBG("Passing IRP_MJ_SYSTEM_CONTROL down\n");
-        IoSkipCurrentIrpStackLocation(irp);
-        return IoCallDriver(lower, irp);
+        IoSkipCurrentIrpStackLocation(Irp);
+        return IoCallDriver(lower, Irp);
       }
-    return driver__complete_irp(irp, 0, STATUS_SUCCESS);
+    return driver__complete_irp(Irp, 0, STATUS_SUCCESS);
   }
 
 /* Handle a power IRP. */
index f6b1732..433d89c 100644 (file)
@@ -79,6 +79,7 @@ static driver__dispatch_func driver__dispatch_dev_ctl_;
 static driver__dispatch_func driver__dispatch_scsi_;
 static driver__dispatch_func driver__dispatch_pnp_;
 static void STDCALL driver__unload_(IN PDRIVER_OBJECT);
+static WV_F_DEV_DISPATCH WvDriverBusSysCtl_;
 
 static LPWSTR STDCALL get_opt(IN LPWSTR opt_name) {
     LPWSTR our_opts, the_opt;
@@ -181,6 +182,7 @@ static NTSTATUS STDCALL driver__attach_fdo_(
     WvDevForDevObj(fdo, &WvDriverBus_.Dev);
     WvDriverBus_.Dev.Self = WvDriverBus_.Fdo = fdo;
     WvDriverBus_.Dev.IsBus = TRUE;
+    WvDriverBus_.Dev.IrpMj->SysCtl = WvDriverBusSysCtl_;
     WvDriverBus_.PhysicalDeviceObject = PhysicalDeviceObject;
     fdo->Flags |= DO_DIRECT_IO;         /* FIXME? */
     fdo->Flags |= DO_POWER_INRUSH;      /* FIXME? */
@@ -563,3 +565,10 @@ winvblock__lib_func WV_SP_BUS_T driver__bus(void) {
       }
     return WvBusFromDev(WvDevFromDevObj(WvDriverBusFdo_));
   }
+
+/* Pass an IRP_MJ_SYSTEM_CONTROL IRP to the bus. */
+static NTSTATUS STDCALL WvDriverBusSysCtl_(IN WV_SP_DEV_T dev, IN PIRP irp) {
+    WV_SP_BUS_T bus = WvBusFromDev(dev);
+
+    return WvBusSysCtl(bus, irp);
+  }