Windows动态库hid.dll
+ -

HID.dll与整个HID驱动程序架构的关系揭密

2022-05-07 444 0

这里我们首先回顾一下HID相关驱动之间的调用关系图。
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驱动程序架构

  • 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实现的。

  • 而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   

0 篇笔记 写笔记

HID.dll报告描述符解析数据PreparsedData
前面我们提到了Hid.dll使用HidD_GetPreparsedData来获取一个不透明的报告描述符数据,使用该数据可以解析出很多关于HID设备的有用信息。如我们可以通过HidP_GetCaps来解析出HIDP_CAPS。hid.dll是HidD_GetPreparsedData函数通过IOCT......
Windows服务HidServ及Hid.dll工作原理
在Windows操作系统下,使用自定义HID接口通讯时,离不开hid.dll,就算你使用的是hidapi等第三方HID库,它的底层也是HID.dll这个库。而我们使用系统原生的hid.dll库时,也一般是这样引用的。#include#pragma comment(......
Hid.dll导出函数与IOCTL对应大全
Windows封装的HID相关系列API函数,其本质是通过WIN32 API函数DeviceIoControl函数来与内核进行通讯的,而DeviceIoControl中一个重要的参数就是dwIoControlCode,代表了该次通讯的功能。BOOLWINAPIDeviceIoControl(......
Hid.dll导出函数大全
可以通过Depends.exe查看c:/windows/system32/hid.dll导出的所有函数HidD_FlushQueueHidD_FreePreparsedDataHidD_GetAttributesHidD_GetConfigurationHidD_GetFeatureHi......
HidClassFDO_DispatchRequest
NTSTATUSHidClassFDO_DispatchRequest( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ PHIDCLASS_COMMON_DEVICE_EXTENSION CommonDeviceExtens......
HID.dll与整个HID驱动程序架构的关系揭密
这里我们首先回顾一下HID相关驱动之间的调用关系图。USB HID设备主要由包括以下几个驱动:HidClass.sys 这个驱动是HID驱动的类驱动,其实就是一个DLL,用于处理USB HID驱动通用功能。HIDUSB.sys 这个驱动是HID驱动的miniPort驱动,即我们常说的迷你小端口......
HID.DLL导出函数HidD_GetAttributes探究
HidD_GetAttributes函数用于获取HID设备的基本信息,如设备的VendorID,ProductID和VersionNumber,对应于USB HID设备描述符的如下字段: WORD idVendor; //厂商编号 WORD idProduct......
HID.DLL导出函数HidD_GetInputReport探究
HidD_GetInputReport的功能HidD_GetInputReport用于获取输入报告(input report)。说明:不过微软关于此函数有一个特别的说明,就是只能获取当前的输入报告,不能连续的获取,因为可能会丢数据。所以如果要连续的获取输入报告,需要使用ReadFile函数。同时,......
Hid.dll导出函数HidD_GetPreparsedData
Hid.dll导出函数HidD_GetPreparsedData可以通过IOCTL获取一个PHIDP_PREPARSED_DATA的不透明数据结构。通过这个数据结构可以出报告描述符的相关信息。如本人在开发HID调试工具HidTool.exe的代码如下:do{ ... PHID......
Hid.dll获取字符串函数实现
Hid.dll中获取字符串的函数包括以下:HidD_GetProductStringHidD_GetManufacturerStringHidD_GetSerialNumberStringHidD_GetIndexedString这些函数分别通过不同的IOCTL来与HIDCLAS.SYS进行通......
Hid.dll报告缓存数量的设置与获取
HidD_GetNumInputBuffers和HidD_SetNumInputBuffers分别用于从HID设备中读取的报告内容的最大缓冲数量.BOOLEAN HidD_GetNumInputBuffers( [in] HANDLE HidDeviceObject, [out] PUL......
hidclass.sys多输入报告的长度研究
有没有思考过一个问题,一般我们的HID设备只一个输入输出报告,那么在hidclass.sys中在循环读取输入报告时,按指定的长度来进行读取即可。但是,我们知道,一个HID设备是可以支持多个输入报告的,多个输入报告使用ReportId来区分的。如我们提供如下的一个自定义通讯HID设备:0x06,0x......
HID.DLL函数HidD_GetMsGenreDescriptor与IOCTL_HID_GET_MS_GENRE_DESCRIPTOR
HID.DLL导出HidD_GetMsGenreDescriptor函数,其使用IOCTL_HID_GET_MS_GENRE_DESCRIPTOR与HIDCLASS.SYS通讯。而HIDCLASS.SYS将此请求下发给设备,用于获取设备的类型信息。而在HIDUSB.SYS中,通过下发Functio......
hid.dll导出函数HidD_GetPhysicalDescriptor与IOCTL_GET_PHYSICAL_DESCRIPTOR
hid.dll导出函数HidD_GetPhysicalDescriptor用于获取HID物理描述符,其通过IOCTL_GET_PHYSICAL_DESCRIPTOR发送给HIDCLASS.SYS。HIDCLASS创建一个主功能号为IRP_MJ_INTERNAL_DEVICE_CONTROL,IOCT......
HIDCLASS.SYS获取HID设备的硬件ID
在应用层通过如下代码实现: HANDLE tmp_DeviceHandle = CreateFile(st.DeviceName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, ......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!