HID规范
+ -

HID报告描述符解析过程中的数据结构关系

2022-05-18 714 1

Hid报告描述符的短项定义了MAIN,GLOBAL,LOCAL三种类型的项。

其中MAIN项主要定义了三个类型,分别为集合(COLLECTION),输入报告(Input Report),输出报告(Output Report)和特性报告(Feature Report).

在Windows系统的Parser驱动中,对于MAIN ITEM也是进行了足够的遵重,直接使用HIDCOLLECTION来表示一个集合(COLLECTION),其中最顶层的集合由HIDPARSERCONTEXT的成员指针RootCollection引入,各个集合的子项则由HIDCOLLECTION的成员`struct __HID_COLLECTION ** Nodes;保存,其 struct __HID_COLLECTION * Root;`指向父或者上一层的HID_COLLECTION.这样就形成了一个集合树形结构。
HID_COLLECTION树

typedef struct __HID_COLLECTION__
{
    UCHAR Type;            //集合类型
    ULONG Usage;       //集合Usage
    UCHAR StringID;
    UCHAR PhysicalID;

    ULONG ReportCount;            //报告数组数量
    ULONG NodeCount;  //子集合数量
    struct __HID_COLLECTION__ ** Nodes;//子集合数组
    struct __HID_COLLECTION__ * Root;  //上一集COLLECTION集合指针
    struct _HID_REPORT ** Reports; //报告(Input,output,Feature)数组


    ULONG Offsets[1];

}HID_COLLECTION, *PHID_COLLECTION;

而对于输入报告(Input Report),输出报告(Output Report)和特性报告(Feature Report),虽然从MAIN ITEM的定义上来看是同一级别的,但实际上是属于某一集合的,故其作为HID_COLLECTION的子项HID_REPORT存在。

HID_REPORT

typedef struct _HID_REPORT
{
    UCHAR Type;   //报告类型Input,output,Feature
    UCHAR ReportID; //报告ID
    ULONG ReportSize; //报告总字节数

    ULONG ItemCount;     //Items当前容量
    ULONG ItemAllocated; //Items最大容量
    HID_REPORT_ITEM Items[1];//USAGE定义的数据含义
}HID_REPORT, *PHID_REPORT;

从HID_REPORT的结构可以看到,其有一个HID_REPORT_ITEM成员信息,代表着该报告在USAGE过程中的数据组成方式。不过同于USAGE出现比较前,故会先以GLOBAL_ITEM_STATE的形式存储于HID_PARSER_CONTEXT中。所以说HID_REPORT_ITEM来原于GLOBA和LOCAL的组合定义。所以从这里也可以讲,MAIN项定义了报告描述符的层给结构,而GLOBAL和LOCAL定义了数据项的详细信息,只是GLOBAL和LOCAL的作用域不同而已。

  • MAIN COLLECTION
    • MAIN Input/Output/Feature Report
      • GLOBAL/LOCAL ITEM最终组成的HID_REPORT_ITEM
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系统HidD_GetPreparsedData数据结构PHIDP_PREPARSED_DATA研究
上天开了一个玩笑,研究了REACTOS的HidD_GetPreparsedData函数的数据结构(http://www.usbzh.com/article/detail-980.html ),竟然发现这和Windows体统的不兼容。所以这一节我们来研究一下Windows下的HidD_GetPrepa......
HID多ReportId数据长度返回的问题
最近搞了一个虚拟的USB HID设备,为了测试各个报告描述符。不过遇到了一个奇怪的问题,以前没有留意,现在分享给大家。比如在自定义的HID的报告描述符中,描述输入的报告内容分别如下:ReportId数据长度总长度011617026061可以看到,当Rep......
HID_PARSER_CONTEXT解析报告描述符生成的COLLECTION树形结构
通过前面的代码,我们简单的说明了一下HIDP_DEVICE_DESC和HIDP_COLLECTION_DESC、HIDP_REPORT_IDS关系:其实我们在分析其代码的时候,都是通过ParserContext来实现的,这个指针的定义实质上为:typedef struct{ // ......
HID报告描述符主项ITEM_TYPE_MAIN-COLLECTION和END COLLECTION
主项ITEM_TYPE_MAIN时,ITEM_PREFIX的Type(BIT2,BIT3)为0时。#define ITEM_TYPE_MAIN 0x0主项主要包括以下几个:ITEM_TAG_MAIN_COLLECTIONITEM_TAG_MAIN......
HID报告描述符主项InputReport、OutputReport,FeatureReport
HID报告描述符主项除过COLLECTION项,就是输入报告InputReport,输出报告OutputReport和特性报告FeatureReport。ITEM_PREFIX的BIT2,BIT3为00,bit4-7的值为:#define ITEM_TAG_MAIN_INPUT ......
HID报告描述符的GLOBAL ITEM
HID报告描述符的GLOBAL ITEM相当于报告描述符的全部变量,只能不更新,以前的值就永远有意义。ITEM_PREFIX的BIT2,BIT3为01,bit4-7的值为:GLOBAL ITEM包括的内容有:#define ITEM_TAG_GLOBAL_USAGE_PAGE ......
HID报告描述符解析过程中的数据结构关系
Hid报告描述符的短项定义了MAIN,GLOBAL,LOCAL三种类型的项。其中MAIN项主要定义了三个类型,分别为集合(COLLECTION),输入报告(Input Report),输出报告(Output Report)和特性报告(Feature Report).在Windows系统的Pars......
使用USB鼠标HID报告描述符分析HID_REPORT及成员HID_REPORT_ITEM关系
HID报告描述分过程比较麻烦,对于MAIN ITEM,相对来说比较简单,就是一个简单的树形结构。但对于GLOBAL ITEM和LOCAL ITEM组织的数据结构定义,还是相对比较麻烦的。每一个HID报告描述符都会有很多集合,这是由MAIN ITEM的Collection关键字定义的,无论它是Appl......
HID报告描述符INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit 1{Array (0) | Variable (1)}和HID_REPORT_ITEM的关系
HID的MAIN ITEM的INPUT ITEM,OUTPUT ITEM,FEATERU ITEM Bit定义如下:0:代表是数组1:代表变量我们在 HID主条目input item、output item和feature item详解http://www.usbzh.com/article......
关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

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

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