VBoxUsbFlt.cpp revision 134ae55f7965e893a8437f80e736a5321321645b
af062818b47340eef15700d2f0211576ba3506eevboxsync * VBox USB Monitor Device Filtering functionality
af062818b47340eef15700d2f0211576ba3506eevboxsync * Copyright (C) 2011 Oracle Corporation
af062818b47340eef15700d2f0211576ba3506eevboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
af062818b47340eef15700d2f0211576ba3506eevboxsync * available from http://www.virtualbox.org. This file is free software;
af062818b47340eef15700d2f0211576ba3506eevboxsync * you can redistribute it and/or modify it under the terms of the GNU
af062818b47340eef15700d2f0211576ba3506eevboxsync * General Public License (GPL) as published by the Free Software
af062818b47340eef15700d2f0211576ba3506eevboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
af062818b47340eef15700d2f0211576ba3506eevboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
af062818b47340eef15700d2f0211576ba3506eevboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
af062818b47340eef15700d2f0211576ba3506eevboxsync/*******************************************************************************
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync* Header Files *
114410893548b9522c46fdcbd8f63385eb8bfb68vboxsync*******************************************************************************/
040b4a09341f574825386333398110f4db3e1e51vboxsync * Note: Must match the VID & PID in the USB driver .inf file!!
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryDeviceID USB\Vid_80EE&Pid_CAFE
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryInstanceID 2
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryHardwareIDs USB\Vid_80EE&Pid_CAFE&Rev_0100
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryHardwareIDs USB\Vid_80EE&Pid_CAFE
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryCompatibleIDs USB\Class_ff&SubClass_00&Prot_00
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryCompatibleIDs USB\Class_ff&SubClass_00
af062818b47340eef15700d2f0211576ba3506eevboxsync BusQueryCompatibleIDs USB\Class_ff
#define szBusQueryCompatibleIDs L"USB\\Class_ff&SubClass_00&Prot_00\0USB\\Class_ff&SubClass_00\0USB\\Class_ff\0\0"
* | ->---> CAPTURED ---------------------->| by "real" removal | the device info is removed form the list)
typedef struct VBOXUSBFLT_DEVICE
bool fIsFilterOneShot;
#define PVBOXUSBFLT_DEVICE_FROM_LE(_pLe) ( (PVBOXUSBFLT_DEVICE)( ((uint8_t*)(_pLe)) - RT_OFFSETOF(VBOXUSBFLT_DEVICE, GlobalLe) ) )
#define PVBOXUSBFLT_DEVICE_FROM_REPLUGGINGLE(_pLe) ( (PVBOXUSBFLT_DEVICE)( ((uint8_t*)(_pLe)) - RT_OFFSETOF(VBOXUSBFLT_DEVICE, RepluggingLe) ) )
#define PVBOXUSBFLTCTX_FROM_LE(_pLe) ( (PVBOXUSBFLTCTX)( ((uint8_t*)(_pLe)) - RT_OFFSETOF(VBOXUSBFLTCTX, ListEntry) ) )
typedef struct VBOXUSBFLT_LOCK
#define VBOXUSBFLT_LOCK_INIT() \
#define VBOXUSBFLT_LOCK_TERM() do { } while (0)
#define VBOXUSBFLT_LOCK_ACQUIRE() \
#define VBOXUSBFLT_LOCK_RELEASE() \
typedef struct VBOXUSBFLTGLOBALS
if (!cRefs)
static void vboxUsbFltDevOwnerSetLocked(PVBOXUSBFLT_DEVICE pDevice, PVBOXUSBFLTCTX pContext, uintptr_t uFltId, bool fIsOneShot)
static void vboxUsbFltDevOwnerUpdateLocked(PVBOXUSBFLT_DEVICE pDevice, PVBOXUSBFLTCTX pContext, uintptr_t uFltId, bool fIsOneShot)
if (pContext)
else if (pContext)
#ifdef DEBUG_mista
return pDevice;
return NULL;
return pDevice;
return Status;
static PVBOXUSBFLTCTX vboxUsbFltDevMatchLocked(PVBOXUSBFLT_DEVICE pDevice, uintptr_t *puId, bool fRemoveFltIfOneShot, bool *pfFilter, bool *pfIsOneShot)
*puId = 0;
*pfFilter = false;
*pfIsOneShot = false;
PVBOXUSBFLTCTX pOwner = VBoxUSBFilterMatchEx(&DevFlt, puId, fRemoveFltIfOneShot, pfFilter, pfIsOneShot);
return pOwner;
static NTSTATUS vboxUsbFltDevPopulate(PVBOXUSBFLT_DEVICE pDevice, PDEVICE_OBJECT pDo /*, BOOLEAN bPopulateNonFilterProps*/)
return STATUS_INSUFFICIENT_RESOURCES;
int langId;
Status = VBoxUsbToolGetStringDescriptorA(pDo, pDevice->szSerial, sizeof (pDevice->szSerial), pDevDr->iSerialNumber, langId);
Status = VBoxUsbToolGetStringDescriptorA(pDo, pDevice->szMfgName, sizeof (pDevice->szMfgName), pDevDr->iManufacturer, langId);
Status = VBoxUsbToolGetStringDescriptorA(pDo, pDevice->szProduct, sizeof (pDevice->szProduct), pDevDr->iProduct, langId);
&cbRegKeyBuf);
return Status;
static void vboxUsbFltSignalChangeLocked()
bool bNeedReplug = false;
bool fFilter = false;
bool fIsOneShot = false;
if (!fFilter)
if (fIsOneShot)
if (pNewOwner)
bNeedReplug = true;
if (fIsOneShot)
bNeedReplug = true;
bNeedReplug = true;
if (bNeedReplug)
return bNeedReplug;
if (!RtlCompareUnicodeString(&szStandardControllerName[j], &pHubDevObj->DriverObject->DriverName, TRUE /* case insensitive */))
#ifdef DEBUG
if (pDevice)
if (bReplug)
--cReplugPdos;
bool fFilter = false;
bool fIsOneShot = false;
if (!fFilter)
--cReplugPdos;
if (cReplugPdos)
if (!--cReplugPdos)
return STATUS_SUCCESS;
return STATUS_SUCCESS;
return STATUS_SUCCESS;
*pId = 0;
USBFilterGetString(pFilter, USBFILTERIDX_MANUFACTURER_STR) ? USBFilterGetString(pFilter, USBFILTERIDX_MANUFACTURER_STR) : "<null>",
USBFilterGetString(pFilter, USBFILTERIDX_PRODUCT_STR) ? USBFilterGetString(pFilter, USBFILTERIDX_PRODUCT_STR) : "<null>",
USBFilterGetString(pFilter, USBFILTERIDX_SERIAL_NUMBER_STR) ? USBFilterGetString(pFilter, USBFILTERIDX_SERIAL_NUMBER_STR) : "<null>"));
#ifdef DEBUG
Log(("VBoxUSBClient::addFilter: idVendor=%#x idProduct=%#x bcdDevice=%#x bDeviceClass=%#x bDeviceSubClass=%#x bDeviceProtocol=%#x bBus=%#x bPort=%#x\n",
return rc;
AssertFailed();
return rc;
/* clear the fIsFilterOneShot flag to ensure the device is replugged on the next VBoxUsbFltFilterCheck call */
return rc;
if (hEvent)
NULL);
return Status;
if (pOldEvent)
return STATUS_SUCCESS;
AssertFailed();
return USBDEVICESTATE_USED_BY_HOST;
return USBDEVICESTATE_USED_BY_HOST;
return USBDEVICESTATE_HELD_BY_PROXY;
return USBDEVICESTATE_USED_BY_GUEST;
AssertFailed();
return USBDEVICESTATE_UNSUPPORTED;
static void vboxUsbDevToUserInfo(PVBOXUSBFLTCTX pContext, PVBOXUSBFLT_DEVICE pDevice, PUSBSUP_DEVINFO pDevInfo)
NTSTATUS VBoxUsbFltGetDevice(PVBOXUSBFLTCTX pContext, HVBOXUSBDEVUSR hDevice, PUSBSUP_GETDEV_MON pInfo)
return STATUS_SUCCESS;
AssertFailed();
return STATUS_INVALID_PARAMETER;
if (pDevice)
return STATUS_SUCCESS;
if (!pDevice)
AssertFailed();
return STATUS_NO_MEMORY;
AssertFailed();
return Status;
bool fFilter = false;
bool fIsOneShot = false;
if (pTmpDev)
return STATUS_SUCCESS;
if (fFilter)
if (pCtx)
return STATUS_SUCCESS;
return STATUS_SUCCESS;
if (pDevice)
if (pDevice)
if (pDevice)
return STATUS_SUCCESS;
AssertFailed();
return pDevice;
return STATUS_UNSUCCESSFUL;
return STATUS_SUCCESS;
bool bBusy = false;
AssertFailed();
bBusy = true;
AssertFailed();
bBusy = true;
if (bBusy)
return STATUS_DEVICE_BUSY;
return STATUS_SUCCESS;