[vbox-dev] [PATCH] VBoxUsbMon: Hook proper driver object

Sameeh Jubran sameeh at daynix.com
Wed Jul 12 08:39:14 GMT 2017


From: Yuri Benditovich <yuri.benditovich at daynix.com>

VBoxUsbMon hooks PnP call in driver object of top level devices
in stack of every hub. There is assumption that such a way it
will receive PnP messages for PDOs of USB devices created by
these hubs. This assumption is not always correct: if there is
upper filter installed in stack of hub devices but not in stack
of USB devices, the VBoxUsbMon does not receive devices' PnP
messages and USB redirection does not work.
---
 src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbFlt.cpp |  4 ++++
 src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp | 10 ++++++++++
 src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.h   |  2 ++
 3 files changed, 16 insertions(+)

diff --git a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbFlt.cpp b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbFlt.cpp
index bd1eeaa..63cf973 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbFlt.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbFlt.cpp
@@ -725,6 +725,7 @@ static bool vboxUsbFltDevCheckReplugLocked(PVBOXUSBFLT_DEVICE pDevice, PVBOXUSBF
                 LOG(("Matching: Need replug"));
                 /* the device needs to be filtered, but the owner changes, replug needed */
                 bNeedReplug = true;
+                EnsureDeviceIsFiltered(pDevice->Pdo);
             }
         }
         else
@@ -740,6 +741,7 @@ static bool vboxUsbFltDevCheckReplugLocked(PVBOXUSBFLT_DEVICE pDevice, PVBOXUSBF
             {
                 bNeedReplug = true;
                 LOG(("Matching: Need replug"));
+                EnsureDeviceIsFiltered(pDevice->Pdo);
             }
         }
     }
@@ -852,6 +854,7 @@ static DECLCALLBACK(BOOLEAN) vboxUsbFltFilterCheckWalker(PFILE_OBJECT pFile, PDE
                 if (fFilter)
                 {
                     LOG(("Matching: This device SHOULD be filtered"));
+                    EnsureDeviceIsFiltered(Device.Pdo);
                     /* this device needs to be filtered, but it's not,
                      * leave the PDO in array to issue a replug request for it
                      * later on */
@@ -1295,6 +1298,7 @@ NTSTATUS VBoxUsbFltPdoAdd(PDEVICE_OBJECT pPdo, BOOLEAN *pbFiltered)
         ASSERT_WARN(pCtx, ("zero ctx"));
         ASSERT_WARN(uId, ("zero uId"));
         pDevice->enmState = VBOXUSBFLT_DEVSTATE_CAPTURING;
+        EnsureDeviceIsFiltered(pPdo);
     }
     else
     {
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
index dba6c1d..307abe5 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
+++ b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.cpp
@@ -1259,6 +1259,16 @@ static DECLCALLBACK(BOOLEAN) vboxUsbMonHookDrvObjWalker(PFILE_OBJECT pFile, PDEV
     return FALSE;
 }
 
+
+/**
+* Ensure PnP hooks will be installed in the driver that
+  serves USB device PDO
+*/
+void EnsureDeviceIsFiltered(PDEVICE_OBJECT Pdo)
+{
+    vboxUsbMonHookDrvObjWalker(NULL, NULL, Pdo, NULL);
+}
+
 /**
  * Finds all USB drivers in the system and installs hooks if haven't done already.
  */
diff --git a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.h b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.h
index b218bde..c64d789 100644
--- a/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.h
+++ b/src/VBox/HostDrivers/VBoxUSB/win/mon/VBoxUsbMon.h
@@ -58,4 +58,6 @@ typedef FNVBOXUSBMONDEVWALKER *PFNVBOXUSBMONDEVWALKER;
 
 VOID vboxUsbMonHubDevWalk(PFNVBOXUSBMONDEVWALKER pfnWalker, PVOID pvWalker, ULONG fFlags);
 
+void EnsureDeviceIsFiltered(PDEVICE_OBJECT Pdo);
+
 #endif /* #ifndef ___VBoxUsbMon_h___ */
-- 
2.7.0.windows.1




More information about the vbox-dev mailing list