HID报告描述符解析过程中的数据结构关系
Hid报告描述符的短项定义了MAIN,GLOBAL,LOCAL三种类型的项。
其中MAIN项主要定义了三个类型,分别为集合(COLLECTION),输入报告(Input Report),输出报告(Output Report)和特性报告(Feature Report).
在Windows系统的Parser驱动中,对于MAIN ITEM也是进行了足够的遵重,直接使用HID_COLLECTION
来表示一个集合(COLLECTION),其中最顶层的集合由HID_PARSER_CONTEXT
的成员指针RootCollection
引入,各个集合的子项则由HID_COLLECTION
的成员struct __HID_COLLECTION__ ** Nodes;
保存,其struct __HID_COLLECTION__ * Root;
指向父或者上一层的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存在。
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
- MAIN Input/Output/Feature Report