我正在开发一个KMDF虚拟鼠标驱动程序。
总的想法是一个KMDF根枚举的非过滤器驱动程序,它将能够发送输出报告到鼠标和键盘驱动程序栈。
我的驱动程序已经在工作,并向其他驱动程序堆栈发送请求,但没有结果。
报告类型和数据包格式在Microsoft资源上是非常没有文档的。没有关于移动鼠标指针、模拟单击(使用鼠标或键盘)需要发送哪些数据和设备的信息。
只有关于HID客户端、驱动程序等的一般信息。它们的文档通常引用Windows驱动程序示例git存储库,但是存储库不包含任何与我的任务接近的源。很少有人在开发驱动程序,所以也没有教程。
我希望能给我一个提示,我可以在哪里找到更多关于我的任务。
发布于 2018-08-16 19:35:15
下面是我的工作驱动程序的报表描述符集。
HID_REPORT_DESCRIPTOR g_reportDescriptor[] = {
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x02, // USAGE (Mouse)
0xA1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_MOUSE_INPUT,
0x09, 0x01, // USAGE_PAGE (Pointer)
0xA1, 0x00, // COLLECTION (Physical)
0x05, 0x09, // USAGE_PAGE (Buttons)
0x19, 0x01, // USAGE_MINIMUM (1)
0x29, 0x03, // USAGE_MAXIMUM (3)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x01, // REPORT_SIZE (1)
0x81, 0x02, // INPUT (Data, Variable, Absolute)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x05, // REPORT_SIZE (5)
0x81, 0x01, // INPUT (Constant)
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7F, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x06, // Input (Data, Variable, Relative)
0xC0, // END_COLLECTION
0xC0, // END_COLLECTION
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (Undefined)
0xa1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_MOUSE_OUTPUT,
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x03, // REPORT_COUNT (3)
0x75, 0x08, // REPORT_SIZE (8)
0x91, 0x02, // OUTPUT (Data, Variable, Absolute)
0xc0, // END_COLLECTION
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x06, // USAGE (Keyboard)
0xA1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_KEYBOARD_INPUT,
0x05, 0x07, // USAGE_PAGE (Keyboard Key Codes)
0x19, 0xE0, // USAGE_MINIMUM (224)
0x29, 0xE7, // USAGE_MAXIMUM (231)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x81, 0x02, // INPUT (Data, Variable, Absolute)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x01, // INPUT (Constant)
0x19, 0x00, // USAGE_MINIMUM (0)
0x29, 0x65, // USAGE_MAXIMUM (101)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x65, // LOGICAL_MAXIMUM (101)
0x95, 0x06, // REPORT_COUNT (6)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x00, // INPUT (Data, Array, Absolute)
0x05, 0x08, // USAGE_PAGE (LEDs)
0x19, 0x01, // USAGE_MINIMUM (Num Lock)
0x29, 0x05, // USAGE_MAXIMUM (Kana)
0x95, 0x05, // REPORT_COUNT (5)
0x75, 0x01, // REPORT_SIZE (1)
0x91, 0x02, // OUTPUT (Data, Variable, Absolute)
0x95, 0x01, // REPORT_COUNT (1)
0x75, 0x03, // REPORT_SIZE (3)
0x91, 0x01, // OUTPUT (Constant)
0xC0, // END_COLLECTION
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x00, // USAGE (Undefined)
0xa1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_KEYBOARD_OUTPUT,
0x09, 0x00, // USAGE (Undefined)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x08, // REPORT_COUNT (8)
0x75, 0x08, // REPORT_SIZE (8)
0x91, 0x02, // OUTPUT (Data, Variable, Absolute)
0xc0 // END_COLLECTION
};它包括:
发布于 2017-12-30 13:48:38
刘杰的回答已经指向了正确的方向。现在模仿鼠标的最好方法就是模仿USB硬件。
如果您的虚拟鼠标数据来自您控制的硬件,您还可以跳过驱动程序部分并使您的硬件HID兼容。
如果我们说的是一个纯粹的软件仿真,我认为你最好的选择是模仿一个将自己定位为HID设备的USB设备。有一个伟大的MSDN文章创建您自己的USB设备仿真。好的是,他们使用HID作为一个示例USB描述符:
const UCHAR g_UsbDeviceDescriptor[] = {
// Device Descriptor
0x12, // Descriptor Size
0x01, // Device Descriptor Type
0x00, 0x03, // USB 3.0
0x00, // Device class
0x00, // Device sub-class
0x00, // Device protocol
0x09, // Maxpacket size for EP0 : 2^9
0x5E, 0x04, // Vendor ID
0x39, 0x00, // Product ID
0x00, // LSB of firmware version
0x03, // MSB of firmware version
0x01, // Manufacture string index
0x03, // Product string index
0x00, // Serial number string index
0x01 // Number of configurations
};要知道需要发送哪些端点和HID数据,您可以读取HID规范,但更容易查看现有的微控制器实现。许多微控制器品牌都有关于如何用USB堆栈模拟USB鼠标的例子。下面是一些例子:
发布于 2017-12-29 07:46:13
HID是USB定义的标准。所以微软没有定义格式。事实上,HID是如此通用,因此格式应该由您自己在HID报表描述符中定义。
HID描述符在设备类别定义HID和HID使用表中定义。
在Device Class Definition HID' there is an example of mouse which is exact what you want.使用页(通用桌面)、用法(鼠标)、集合(应用程序)、用法(指针)、集合(物理)、报表计数(3)、报表大小(1)、使用页(按钮)、使用量最小(1)、使用量最大值(3)、逻辑最小值(0)、逻辑最大值(1)、输入(数据、变量、绝对)、报表计数(1),报表大小(5)、输入(常量)、报表大小(8)、报表计数(2)、使用页(通用桌面)、使用(X)、使用率(Y)、逻辑最小值(-127)、逻辑最大值(127)、输入(数据、变量、相对)、结束集合、结束集合
https://stackoverflow.com/questions/47942366
复制相似问题