通过USBD_CreateConfigurationRequestEx查找到了3个interfaces,1个是键盘,1个是鼠标。配置完成之后,得到2个pipe。
通过readfile访问驱动的IRP_MJ_READ读取其中1个pipe,可以获取数据。(这里readfile是阻塞了的,IoMarkIrpPending(Irp))
应用层如果用2个线程来readfile,也只有等其中1个读取完毕,才可以读。
我如何修改驱动,才能同时读取2个pipe的数据呢?
一个Endpoint用IRP_MJ_READ获取数据,另外一个用自定义的Device IO Control进行?
应用程序在线程里面,调用自定义的Device IO Control,被阻塞了,需要等待前面的readfile返回才能进行Device IO Control,
是因为IRP_MJ_READ函数里面的IRP返回STATUS_PENDING状态,导致的吗?
如果我把IRP_MJ_READ函数里面的IRP返回设置成STATUS_SUCCESS状态,要蓝屏
系统会根据Interface或者某个独立的Interface Set的数量,多次调用adddevice吗?
我的驱动是这么实现的:
1,首先在DriverEntry指定MajorFunction派遣函数
2,在AddDevice中IoCreateDevice,并且IoRegisterDeviceInterface注册/*"USB", "{36FC9E60-C465-11CF-8056-444553540000}",*/,然后设置DO_DIRECT_IO方式(read的时候,可以用MDL)
3,PnpStartDevice中只做了IoSetDeviceInterfaceState
4,在create中,才进行配置描述符和接口描述符,并且IOCTL_INTERNAL_USB_SUBMIT_URB来配置
5,应用层读写pipe
如果使用windows系统自带的usb composite device驱动,系统可以自动识别,并且加载HID mouse和HID keyboard。
硬件是没有问题的。
我是想自己实现usb composite device+HID mouse+HID keyboard的功能,并且自定义一些额外的按键。
确切需求:同时获取USB复合设备的两个interface的pipe数据,互不干扰。
目前只能串行读取(IRP处理方式决定了的?),不能并行读取。
疑问:是否需要分别给两个interface加载不同的驱动,来分别生成PDO+FDO,这样,访问两个设备,就不会干扰了