用 WDM toaster bus 改写 USB虚拟总线

本文介绍了在WDM驱动中,如何处理USB虚拟总线的内部设备控制IRP,并探讨了在卸载总线驱动时遇到的问题。在Bus_InternalIoCtl例程中,当存在未完成的Irp时,卸载或拔出设备会导致PnP管理器响应异常。分析了清理PendingQueue中的Irp以及Bus_PnP未能接收到PnP IRP的问题,强调了在设备移除过程中正确处理IRP的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NTSTATUS
DriverEntry (
    IN  PDRIVER_OBJECT  DriverObject,
    IN  PUNICODE_STRING RegistryPath
    )
{
...
DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] = Bus_InternalIoCtl;
...
}
如果已安装相应USB驱动,用enmu插入USB硬件ID:USB\VID_XXXX&PID_XXXX、顺带将一个Event句柄传入Bus_PlugInDevice,Bus_InternalIoCtl内就可以接收并处理上层驱动发来的URB.
Bus_InternalIoCtl例程要干的事就是记住Irp、Urb两个指针信息,用KeSetEvent激活enmu里的事件,使enmu知道总线驱动收到了上层驱动发来的URB,enmu需要用Bus_IocCtl或者Bus_Read将Urb头部信息及其扩展数据读取出来,分析,构造回复用的Urb,并用Bus_IocCtl或Bus_Write回复此Urb,并IoCompleteRequest此Irp。
Bus_InternalIoCtl例程中需置Irp的CancelRoutine,此Irp的CompletionRoutine靠应用层使用Bus_IocCtl或Bus_Write来进行。


试着在Bus_InternalIoCtl中还有排队等待没完成的Irp的情形下:
用 devcon remove "root\vusbbus" 卸载此总线,一直等,成不了功。
或者
用Bus_UnPlugDevice强行将此USB设备拔出来,问题来了:


在Bus_UnPlugDevice中,使用IoInvalidateDeviceRelations (FdoData->UnderlyingPDO, BusRelations)通知PnP管理器发送IRP到Bus_PnP查询,B
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值