- spice usbredir 调用 libusb
- libusb 调用usbdk
模块结构
spice/usbredir | 应用层 |
libusb | 应用层 |
usbdkhelper.dll | 应用层 |
usbdk.sys | 驱动曾 |
结构图
classDiagram CAllocatable --|> CWdmEvent class CWdmEvent{ m_Event } CIrpBase --|> CIoControlIrp class CIrpBase{ m_Event } class CUsbDkRedirection{ m_RedirectionCreated } CUsbDkRedirection <|-- CWdmRefCountingObject CUsbDkRedirection o-- CWdmEvent
- Device 系列继承关系
classDiagram class CUsbDkFilterDevice{ Create
}
class CWdfDevice{
Create
}
CUsbDkFilterDevice <|– CWdmRefCountingObject
CUsbDkFilterDevice <|– CWdfDevice
class CUsbDkControlDevice{
AddRedirect
RemoveRedirect
AddRedirectionToSet
NotifyRedirectorAttached
GetPDOByDeviceID
}
CUsbDkControlDevice <|– CWdfControlDevice
CUsbDkControlDevice o– RedirectionsSet
class CUsbDkControlDeviceQueue{
AddRedirect
}
- Strategy 系列继承关系
classDiagram CUsbDkFilterStrategy --|> CUsbDkNullFilterStrategy CUsbDkNullFilterStrategy --|> CUsbDkHiderStrategy CUsbDkHiderStrategy --|> CUsbDkRedirectorStrategy CUsbDkRedirectorStrategy o-- CUsbDkFilterDevice CUsbDkRedirectorStrategy o-- CUsbDkControlDevice
- mEvent的修改点
flowchart LR SendSynchronously --> ForwardAndWait PostProcess --> ForwardAndWait PostProcessOnSuccess --> PostProcess PostProcessOnFailure --> PostProcess CUsbDkHubFilterStrategy::PNPPreProcess --> PostProcessOnSuccess CUsbDkHiderStrategy::PNPPreProcess --> PostProcessOnSuccess CUsbDkHiderStrategy::PNPPreProcess --> PostProcessOnFailure CWdmDeviceAccess::QueryForInterface --> SendSynchronously CWdmDeviceAccess::QueryCapabilities --> SendSynchronously CWdmDeviceAccess::QueryBusID --> SendSynchronously
应用层
LIBUSB 和USBDK的对接接口
1 | static int load_usbdk_helper_dll(struct libusb_context *ctx) |
UsbDk_StartRedirect
1 | #UsbDkHelper/UsbDkHelper.cpp |
- UsbDk_StartRedirect
- new REDIRECTED_DEVICE_HANDLE
- new UsbDkRedirectorAccess
- UsbDkDriverAccess::AddRedirect
- 发IOCTL_USBDK_ADD_REDIRECT消息给驱动层
- UsbDkRedirectorAccess::reset
驱动层
入口函数
- CUsbDkControlDeviceQueue::DeviceControl
IOCTL_USBDK_ADD_REDIRECT
- CUsbDkControlDeviceQueue::AddRedirect
- CUsbDkControlDevice::AddRedirect
- CUsbDkControlDevice::ResetUsbDevice
- CWdmUsbDeviceAccess::Reset
- PoRequestPowerIrp IRP_MN_SET_POWER
- CIoControlIrp::SendSynchronously IOCTL_INTERNAL_USB_CYCLE_PORT
- CUsbDkRedirection::WaitForAttachment
- CWdmUsbDeviceAccess::Reset
- CUsbDkControlDevice::ResetUsbDevice
- CUsbDkControlDevice::AddRedirect
CUsbDkFilterDeviceInit::Configure
在设备加载驱动阶段执行该函数,注册一些监听事件eg IRP_MJ_PNP
Hub的IRP_MJ_PNP 事件处理 CUsbDkHubFilterStrategy::PNPPreProcess
- hub设备,会监听其下设备的变动(有插入或者拔出时,回调其中注册的函数)
调用如下函数 - CNonPagedDeviceRelations::Create
- CUsbDkHubFilterStrategy::DropRemovedDevices
- CUsbDkHubFilterStrategy::AddNewDevices
插入设备处理 CUsbDkHubFilterStrategy::AddNewDevices
- CUsbDkHubFilterStrategy::AddNewDevices
- CUsbDkHubFilterStrategy::IsChildRegistered
- CUsbDkHubFilterStrategy::RegisterNewChild
- ::UsbDkGetWdmDeviceIdentity
- CWdmDeviceAccess::GetDeviceID
- CWdmDeviceAccess::GetInstanceID
- CWdmUsbDeviceAccess::GetAddress
- ::UsbDkWdmUsbDeviceGetSpeed
- CWdmUsbDeviceAccess::GetDeviceDescriptor
- new CUsbDkChildDevice
- CWdmUsbDeviceAccess::Children().PushBack
- CWdmUsbDeviceAccess::ApplyRedirectionPolicy
- CUsbDkChildDevice::AttachToDeviceStack
- WdfDriverWdmGetDriverObject::DriverExtension->AddDevice
- CUsbDkChildDevice::AttachToDeviceStack
- ::UsbDkGetWdmDeviceIdentity
对于Hub设备,调用到这里,就是对新插入的设备处理完毕,并且调用把新设备AddDevice
拔除设备处理 CUsbDkHubFilterStrategy::DropRemovedDevices
- CUsbDkHubFilterStrategy::DropRemovedDevices
- CWdmUsbDeviceAccess::ToBeDeleted.PushBack
- CUsbDkControlDevice::NotifyRedirectionRemoved
- CUsbDkRedirection::NotifyRedirectionRemoved
- 触发 m_RedirectionRemoved事件
- CUsbDkRedirection::NotifyRedirectionRemoved
设备的终止重定向 CUsbDkFilterStrategy::onClose
- CUsbDkFilterStrategy::onClose
- CUsbDkControlDevice::RemoveRedirect
设备的 m_RedirectionRemoved事件
关于
- 本文作者: crazyboy
- 本文链接: http://crazyboy.www.crazyboy.info/blog/blog/2023/02/01/it/windows/UsbDk/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!