虚拟鼠标kmdf-指针不动

时间:2019-01-02 14:06:56

标签: windows driver windows-kernel

我发现这是相关主题:Windows virtual mouse driver

但是它不能解决我的问题。 我正在基于vhidmini示例编写kmdf虚拟鼠标驱动程序。

驱动程序安装正常,我可以在设备管理器中看到HID兼容的鼠标设备正在运行,但是看起来系统由于某种原因不接受该设备,因为鼠标没有移动。

我正在使用的描述符如下:

HID_REPORT_DESCRIPTOR G_DefaultReportDescriptor[] = {

0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
0x09, 0x02,                    // USAGE (Mouse)
0xA1, 0x01,     // COLLECTION (Application)
0x09, 0x01,         // USAGE_PAGE (Pointer)
0xA1, 0x00,         // COLLECTION (Physical)
0x85, M_CONTROL_FEATURE_REPORT_ID,    // REPORT_ID (1)
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) ; 3 button bits
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) ; 2 position bytes     (X&Y)
0xC0,               // END_COLLECTION
0xC0,           // END_COLLECTION

0x06,0x00, 0xFF,                // USAGE_PAGE (Vendor Defined Usage Page)
0x09,0x01,                      // USAGE (Vendor Usage 0x01)
0xA1,0x01,                      // COLLECTION (Application)
0x85,CONTROL_FEATURE_REPORT_ID,    // REPORT_ID (1)
0x09,0x01,                         // USAGE (Vendor Usage 0x01)
0x15,0x00,                         // LOGICAL_MINIMUM(0)
0x26,0xff, 0x00,                   // LOGICAL_MAXIMUM(255)
0x75,0x08,                         // REPORT_SIZE (0x08)
0x96,(FEATURE_REPORT_SIZE_CB & 0xff), (FEATURE_REPORT_SIZE_CB >> 8), // REPORT_COUNT
0xB1,0x00,                         // FEATURE (Data,Ary,Abs)
0x09,0x01,                         // USAGE (Vendor Usage 0x01)
0x75,0x08,                         // REPORT_SIZE (0x08)
0x96,(INPUT_REPORT_SIZE_CB & 0xff), (INPUT_REPORT_SIZE_CB >> 8), // REPORT_COUNT
0x81,0x00,                         // INPUT (Data,Ary,Abs)
0x09,0x01,                         // USAGE (Vendor Usage 0x01)
0x75,0x08,                         // REPORT_SIZE (0x08)
0x96,(OUTPUT_REPORT_SIZE_CB & 0xff), (OUTPUT_REPORT_SIZE_CB >> 8), //REPORT_COUNT
0x91,0x00,                         // OUTPUT (Data,Ary,Abs)
0xC0,                           // END_COLLECTION

};

因此,有2个TLC,其中1个物理用于OS,第二个TLC由我控制(打开设备和硬鼠标)。

我正在使用的输入报告是这样的:

typedef struct _HIDMINI_INPUT_REPORT{
    UCHAR ReportId;
    UCHAR Buttons;
    UCHAR X;
    UCHAR Y;
} HIDMINI_INPUT_REPORT, *PHIDMINI_INPUT_REPORT;

到目前为止,我可以观察到的是:驱动程序启动后,其查询如下:IOCTL_HID_GET_DEVICE_DESCRIPTOR,IOCTL_HID_GET_DEVICE_ATTRIBUTES和IOCTL_HID_GET_REPORT_DESCRIPTOR。很好 之后,使用IOCTL_HID_READ_REPORT对其进行查询,该消息将发送到手动队列(与vhidmini示例中的完全相同),并且experied计时器正在提供数据。

我的猜测是报告的结构或报告ID出问题,但我暂时坚持。 也许你可以帮我。

谢谢

0 个答案:

没有答案