1 | [硬件层] |
硬件层 (Hardware Layer)
实际的物理设备(如鼠标、键盘)通过S/2、USB 或其他标准协议通过输入信号触发硬件中断
硬件抽象层 (HAL - Hardware Abstraction Layer)
Windows操作系统通过HAL屏蔽硬件细节,捕获硬件中断并将其传递给输入设备驱动,提供通用接口供上层驱动程序使用。
HID 层 (Human Interface Device Layer)
完成从设备信号到逻辑输入事件的映射,这些事件随后被传递到输入堆栈
HID Miniport Driver:每种设备(例如鼠标)都有特定的设备驱动程序,负责解析硬件协议并传递数据。
HID Class Driver (hidclass.sys):HID设备类驱动是一个标准化的接口,负责将低级别的设备事件包装成更高层次的消息。
输入堆栈 (Input Stack)
输入堆栈中包含多个层级的驱动程序和组件,处理输入事件的进一步传递和解析,然后会被封装成标准的输入事件供更高层处理
设备驱动 (Device-Specific Driver):
通常是标准的 mouhid.sys 或其他供应商驱动
负责进一步将硬件信号翻译为操作系统可以理解的数据格式
类驱动程序 (Class Driver):
鼠标:MouClass.sys
键盘:KbdClass.sys
这些类驱动程序接收事件并进行初步处理,例如缓冲数据或聚合事件。(各种鼠标聚合)
过滤驱动程序 (Filter Driver):
可用于拦截和修改输入事件。
例如,鼠标过滤驱动程序可以插入到设备驱动和类驱动之间。
Windows输入子系统 (Windows Input Subsystem)
位于内核模式和用户模式,负责输入事件的分发和调度
内核模式输入管理器:
包括 Win32k.sys(负责将输入事件传递到图形子系统)。
用户模式输入管理器:
通过 User32.dll 管理窗口消息(如 WM_MOUSEMOVE, WM_LBUTTONDOWN)。
在这个阶段,SendInput API 注入的模拟事件也会进入消息队列,与物理设备事件混合在一起。
用户模式层 (User Mode Layer)
在此处输入事件最终被传递到应用程序,Windows将系统消息队列中的消息分发到目标窗口所属的线程的消息队列中,注意只有GUI线程用于自己的消息队列
更多接口访问
Raw Input API:
提供对原始输入设备数据的访问,例如设备来源、坐标、按钮状态等。
Windows消息队列:
应用程序通过标准的消息循环 (GetMessage 或 PeekMessage) 接收事件。
事件如鼠标点击或移动被包装成窗口消息。
DirectInput / XInput:
主要用于游戏开发,直接访问输入设备数据。