[vbox-dev] [PATCH] VBoxUsbMon: Hook proper driver object
Michal Necasek
michal.necasek at oracle.com
Thu Jul 13 11:59:03 UTC 2017
Hi Sameeh/Yuri,
Thanks for the patch. For us to actually accept it, the patch needs to
be either explicitly licensed under MIT or submitted by someone with a
signed OCA (Oracle Contributors Agreement).
Do you happen to know if the patch also solves interoperability
problems with USBPcap?
Regards,
Michal
On 7/12/2017 10:39 AM, Sameeh Jubran wrote:
> 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___ */
>
More information about the vbox-dev
mailing list