[idd] input: add virtual HID driver

Build LGInput as an independent UMDF driver with its own entry point,
service, tracing, and binary.

Expose absolute pointer, relative mouse, and keyboard collections with a
guarded report queue.

Keep LGIdd as the startup and deployment project. Give it a non-linking
build/package dependency on LGInput so F5 stages both driver stacks and
installs them together through LGIddInstall, while the two UMDF binaries
remain independent for future IPC.

Stage both DLLs for the NSIS installer, retain the WDK UMDF remote-debug
startup attachment, and move CSRWLock into LGCommon for the input
driver's report queue.
This commit is contained in:
Geoffrey McRae
2026-08-08 11:36:16 +10:00
parent d3fff4eb57
commit 214665bedd
20 changed files with 1372 additions and 98 deletions

75
idd/LGInput/HIDReports.h Normal file
View File

@@ -0,0 +1,75 @@
/**
* Looking Glass
* Copyright © 2017-2026 The Looking Glass Authors
* https://looking-glass.io
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc., 59
* Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#pragma once
#include <stddef.h>
#include <stdint.h>
enum HIDReportId : uint8_t
{
HID_REPORT_ID_TABLET = 1,
HID_REPORT_ID_MOUSE = 2,
HID_REPORT_ID_KEYBOARD = 3,
};
#pragma pack(push, 1)
struct HIDTabletReport
{
uint8_t reportId;
uint8_t buttons;
uint16_t x;
uint16_t y;
};
struct HIDMouseReport
{
uint8_t reportId;
uint8_t buttons;
int16_t x;
int16_t y;
int8_t wheel;
};
struct HIDKeyboardReport
{
uint8_t reportId;
uint8_t modifiers;
uint8_t reserved;
uint8_t keys[6];
};
struct HIDKeyboardLedsReport
{
uint8_t reportId;
uint8_t leds;
};
#pragma pack(pop)
static_assert(sizeof(HIDTabletReport) == 6);
static_assert(sizeof(HIDMouseReport) == 7);
static_assert(sizeof(HIDKeyboardReport) == 9);
static_assert(sizeof(HIDKeyboardLedsReport) == 2);
const uint8_t * HIDGetReportDescriptor();
size_t HIDGetReportDescriptorSize();
size_t HIDGetInputReportSize(uint8_t reportId);