Я нашел это как связанную тему: Драйвер виртуальной мыши для 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), а истекший таймер предоставляет данные.
Я предполагаю, что что-то не так с сообщаемыми структурами ИЛИ идентификатором отчета, но язастрял на данный момент.Может быть, вы можете помочь мне.
Спасибо