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设备拔出来,问题来了:
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设备拔出来,问题来了: