自定义HID应用程序开发(Windows)
+ -

Windows自定义HID API相关函数解释

2021-09-13 1827 0

Windows自定义HID

CreateFile()

CreateFile()函数的函数原型为:

HANDLE CreateFile(
  LPCWSTR lpFileName,        //指向路径的指针
  DWORD dwDesiredAccess,     //访问模式(读/写)
  DWORD dwShareMode,         //共享模式
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
  DWORD dwCreationDisposition,   //如何创建
  DWORD dwFlagsAndAttributes,    //文件属性(同步或异步)
  HANDLE hTemplateFile           //用于复制文件句柄
);

CreateFile()用于打开HID设备,设备路径可通过函数SetupDi系列函数获取。此函数有以下需要注意的地方:

● 访问模式。 系统独占设备,比如鼠标、键盘等,应将此参数设置为0,否则后续函数的操作将失败。也就是说,对独占设备只能进行查询操作,所以可使用的函数有限。

● 文件属性。此参数用来设置同步或异步模式,它主要是对后续的WriteFile()和ReadFile()有影响。此参数为0时,代表同步模式,也即数据处理完成之后才返回,否则阻塞在函数内部。

CreateFile在创建时,一个重要的参数就是dwFlagsAndAttributes是否含有FILE_FLAG_OVERLAPPED标识,表示是否为异步操作。这里的异步操作将会影响到后续ReadFile,WriteFile最后一个参数。如果没有对应起来,调用ReadFile,WriteFile使用GetLastError()将返回参数错误。

ReadFile()

BOOL ReadFile(
  HANDLE hFile,        //设备句柄,可通过CreateFile得到
  LPVOID lpBuffer,     //存储数据的缓冲区
  DWORD nNumberOfBytesToRead,   //要读取的数据长度
  LPDWORD lpNumberOfBytesRead,  //实际收到的数据长度
  LPOVERLAPPED lpOverlapped      //OVERLAPPED结构体指针
);

ReadFile()用于读取设备通过中断IN传输发来的输入报告,读取的数据从中断输入管道传入。其读取的数据是从HID设备驱动的缓冲区中得到的,缓冲区的大小,可通过HidD _ SetNumInputBuffers()来改变。

ReadFile()的入口参数nNumberOfBytesToRead代表要读取数据的长度(数据正文+1字节报告ID)。当然,在实际设计中,HID设备是由我们自己设计的,我们是知道设备固件的信息的。

上位机也可通过HidD _ GetPreparsedData()来取得报告的长度。此参数设置过大,不会有错误产生,上位机将受到实际读到的长度;此参数设置过小,也即小于数据长度,会返回错误。

WriteFile()

BOOL WriteFile(
  HANDLE hFile,             //设备句柄,可通过CreateFile得到
  LPCVOID lpBuffer,         //要发送的buffer(指针)
  DWORD nNumberOfBytesToWrite,   //要发送数据的长度
  LPDWORD lpNumberOfBytesWritten,   //实际发送数据的长度
  LPOVERLAPPED lpOverlapped  //OVERLAPPED结构体指针,如果设备是以
//FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL
);

WriteFile()通过中断OUT得到来自设备的数据,其入口参数lpBuffer的第一个元素为待发送的报告ID,而且此报告ID必须是Output Report,否则会返回错误。

HidD_GetInputReport()和HidD_SetOutputReport()

BOOLEAN HidD_GetInputReport(
  HANDLE HidDeviceObject,     //设备句柄
  PVOID  ReportBuffer,        //存储数据的缓冲区
  ULONG  ReportBufferLength  //缓冲区长度
);
BOOLEAN HidD_SetOutputReport(
  HANDLE HidDeviceObject,    //设备句柄
  PVOID  ReportBuffer,       //存有待发送数据的缓冲区
  ULONG  ReportBufferLength //缓冲区长度
);

这两个函数通过Input Report和Output Report进行数据传输。主要在其它们的入口参数中,缓冲区的数据,第一个元素为Report ID,后面跟着的才是数据正文。

在固件程序中,这两个函数对应的类命令为Get Report和Set Report。

HidD_SetFeature()和HidD_GetFeature()

BOOLEAN HidD_GetFeature(
  HANDLE HidDeviceObject,     //设备句柄
  PVOID  ReportBuffer,        //存储数据的缓冲区
  ULONG  ReportBufferLength  //缓冲区长度
);
BOOLEAN HidD_SetFeature(
  HANDLE HidDeviceObject,    //设备句柄
  PVOID  ReportBuffer,       //存有待发送数据的缓冲区
  ULONG  ReportBufferLength //缓冲区长度
);

与介绍的两个函数类似,不过这两个函数是通过Feature Report进行数据传输的。在固件程序中,对应的类命令也是Get Report和Set Report。

其它相关

当然,如果自己使用API嫌麻烦的话,也可以使用GIThub上已经封装好的HidApi库来进行开发,下载地址是https://github.com/yigityuce/HidApi

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 篇笔记 写笔记

Windows下枚举系统中所有HID设备
Windows下对任何设备,文件的打开都是通过CreateFile来实现的,不过要打开一个设备得首先知道设备或文件名。由上节可知道,对于HID设备,都会注册一个接口类型为{2ACCFE60-C130-11D2-B082-00A0C91EFB8B}的GUID。我们可以通过Setup系列函数枚举出系统中......
HID 设置协议SetProtocol
SetProtocol用于设置ID设备的协议值。对于USB引导设备,该协议是必须对;对于非引导设备,是可选的。详见:USB请求bmRequestType(1):0x21bRequest(1): SetProtocol,值为0bwValue(2):数据为0表示引导协议,为1表示报告协议。wInd......
HID 设置报告请求SetReport
SetReport请求用于主机向设备发送报告请求。详见:USB请求bmRequestType(1):0x21bRequest(1): SET_REPORT,值为09.wValue(2):高字节报告类型,低字节为报告ID.01:表示输入报告02: 表示输出报告03: 表示特定报告wIndex......
HID 触摸屏的报表描述符
讲道理,这个触摸屏的报告描述符是我从网上搜索的一段代码,这个触摸屏的报告内容本人也进行了测试。测试是通过本站编写的虚拟触摸屏驱动实现的。0x05, 0x0d, // USAGE_PAGE (Digitizers) 0 0x......
HID 简介
 HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。  Wndows操作系......
HID 体系结构
Windows 中的 HID 驱动程序堆栈的体系结构基于名为 hidclass.sys 的类驱动程序。 客户端和传输微型驱动程序从用户模式或内核模式下访问的类驱动程序。HID类驱动程序在系统提供的 HID 类驱动程序是 WDM 功能驱动程序和总线驱动程序 HID 设备安装程序类 (HIDClass)......
HID 报表描述符数字显示实例
USAGE_PAGE (Alphnumeric Display) 05 14USAGE (Alphanumeric Display) 09 01LOGICAL_MINIMUM (0) 15 00 CO......
HID键盘设备数据抓包分析实践
本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理。在进行数据分析前,我们先回顾一下USB相关的基础知识。USB描述符USB 主机是通过各种描述符来识别设备的,有设备描述符,接口描述符,端点描述符,字符描述符,报告描述符(HID)等。和普通的......
USB复合HID设备报告描述符的区分
在USB规范中,设备的功能是通过接口来承载的,在USB规格书中就是接口描述符。对于一般的设备,一般一个接口就是一个功能,这个功能可以是鼠标,键盘或其它设备类型。当然这个只是对USB简易设备而言的,对于一些USB复杂设备如UVC摄像头,UAC音频等是多接口相互配合来实现其功能的,为了整合这么多接口使......
HID 设备描述符关系
HID设备连接到USB主机后,主机通过发送Get_Descriptor请求读取HID设备的描述符,了解描述符对了解USB设备是至关重要的。HID设备的描述符HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:USB标准描述符:设备描述符、配置描述符、......
Windows应用层视频API接口
1. VFWVFW(Video for Windows)是微软于 1992 年推出的关于数字视频的一个 SDK,它能使应用程序通过数字化设备从传统的模拟视频源得到数字化的视频剪辑。VFW 的一个关键思想是播放时不需要专用硬件。为了解决数字视频数据量大的问题,需要对数据进行压缩。VFW 引进了一种叫 ......
HID描述符
HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。偏移量字段字节数数值类型说明0bLength1Numeric描述符字节数1bDescriptorType1Constant0x21 = HID描述符2bcdH......
HID报告描述符详解
HID的报告描述符和其它描述符不一样,不是具有固定的数据结构,而是由固件开发商根据上报的数据自行组装的。这个组装的原材料是HID规范定义的ITEM。所以说HID报告描述符就像搭积木一样,其最终的数据结构和设计图纸是什么,都是由固件开发商决定的,但是其最终的产品又是由HID规范提供的各个标准积木模块搭......
HID 报表描述符远程控制实例
USAGE_PAGE (Consumer Devices) 05 0CUSAGE (Consumer Control) 09 01COLLECTION (Application) A1 01 ......
HID 报表描述符键盘实例
通过下面的报告描述符的定义,我们根据上面的注释可知,包含一个中断输入报表描述符和一个中断输出报告描述符。其中断输入报告描述符用于USB HID键盘中断输入端点,输出报表描述符用于USB HID键盘中断输出端点。USB HID键盘的中断输入报告对于中断输入端点,数据格式定义如下:BYTE0:该字......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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