HID.dll与整个HID驱动程序架构的关系揭密
2022-05-07
550
0
这里我们首先回顾一下HID相关驱动之间的调用关系图。
USB HID设备主要由包括以下几个驱动:
- HidClass.sys 这个驱动是HID驱动的类驱动,其实就是一个DLL,用于处理USB HID驱动通用功能。
- HIDUSB.sys 这个驱动是HID驱动的miniPort驱动,即我们常说的迷你小端口驱动。主要实现的是类驱动需要扩展的功能,其通过函数HidRegisterMinidriver建立起与HidClass.sys驱动关联。
- HidParser.sys 这个驱动其实和类驱动一样,也是DLL库,用于提供HIDCLASS获取到报告描述符时进行报告描述符的解析。所以这个Parse其实就是Parse Hid Report Descriptor.
- HidParse 这其实是HidParser.sys驱动的一个补充。
以上是几个驱动程序之间的结构,不过这个图并不能清楚的表明与HID.DLL之间的关系,故我们对此图进行详细化。
- HID.DLL通过其导出的API函数供我们在应用层进行通讯。
- HID.DLL导出的API函数通过DeviceIoCtrol与HidClass.sys驱动中创建的子PDO通讯。这些子PDO是通过解析HID报告描述符来实现的。
- HidClass.sys的FDO通过函数指针的方式与Hidusb.sys之间进行通讯,用于获取USBHID设备的信息。典型的代码结构如下:
status = hidDriverExtension->MajorFunction[irpSp->MajorFunction](DeviceObject, Irp);
- hidclass.sys是HID设备的类驱动,这个类驱动在设计之初可不仅仅面向于USB-HID设备,不过本人当前见到也只有USB设备使用了hidclass这个类驱动。hidclass是对HID设备类(不仅仅是USB)的总体抽象。
- hidusb.sys更是对hidclass的补充,是对USB设备HID类接口的更具体化,也是USB-HID设备的接口。
hidclass是HID类驱动,hidusb.sys是usb-hid设备的mini端口驱动程序,故其共享一层设备栈,但在IPR传递时又各占一层IO_STACK_LOCATION。如当在HIDCLASS中调用usbhid的驱动接口时,是通过
Irp->CurrentLocation--
跳到下一层设备栈IO_STACK_LOCATION中的。但是又不是通过IoCallDriver调用的,而是通过上面的函数指针直接调用。
这里们可以对比其与IoCallDriver之间的代码,可以看到是模拟的IoCallDriver实现的。- ReactOS实现的IoCallDriver源代码:http://www.pnpon.com/article/detail-361.html
- ReactOSHidClassFDO_DispatchRequest源代码: http://www.usbzh.com/article/detail-930.html
而HIDUSB之下的就是USBCCGP或者HUB驱动创建的HID设备的PDO了。这些PDO与HIDCLASS创建的FDO相Attach.
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936