виртуальная мышь kmdf - без движения указателя - PullRequest
0 голосов
/ 02 января 2019

Я нашел это как связанную тему: Драйвер виртуальной мыши для Windows

, однако он не отвечает на мою проблему.Я пишу драйвер виртуальной мыши kmdf на основе примера vhidmini.

Драйвер устанавливается нормально, я вижу, что 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, один физический для ОС, и второй для управления им (чтобы открыть устройствои stear mouse).

входной отчет, который я использую, выглядит следующим образом:

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), а истекший таймер предоставляет данные.

Я предполагаю, что что-то не так с сообщаемыми структурами ИЛИ идентификатором отчета, но язастрял на данный момент.Может быть, вы можете помочь мне.

Спасибо

...