• 常用的鼠标类型:串口鼠标、PS/2鼠标、USB鼠标(HID)
  • 常用的键盘类型:串口键盘、PS/2鼠标、USB键盘(HID)

非HID鼠标键盘(PS/2鼠标键盘)

  • 物理配置方式

上图左边展示了键盘鼠标设备通过独立的控制器连接到系统总线。一种典型的配置由通过i8042控制器操作的PS/2类型键盘,和通过串口操作的串口鼠标组成。

上图右边展示了键盘鼠标设备通过集成的键盘鼠标控制器连接到系统总线。一种典型的配置由通过i8042控制器操作的PS/2类型键盘和鼠标组成。

Windows支持同时连接多个键盘和鼠标设备。然而Windows不支持通过单独的客户端访问每个设备。Win32子系统以独占方式打开所有的键盘和鼠标设备。

  • 非HID鼠标键盘标准配置

1.标准的键盘鼠标驱动栈

2.键盘鼠标的设备对象结构

上图描述了即插即用PS/2鼠标键盘的设备对象结构。类驱动创建上层类过滤设备对象,并通过可选的设备过滤对象附加到下层功能设备对象。上层设备过滤驱动创建上层设备过滤设备对象。I8042prt创建功能设备对象,并附加到总线驱动创建的物理设备对象。

上图描述了即插即用串口鼠标键盘的设备对象结构

上图描述了传统鼠标键盘的设备对象结构

3.多个键盘鼠标的设备对象结构

Kbdclass和Mouclass支持以两种不同方式管理多个鼠标键盘设备。

① one-to-one模式

在一对一(one-to-one)模式中,每个设备有自己独立的设备栈。类驱动创建和附加独立的类设备对象到每个设备栈中。每个设备栈有自身的控制状态和输入缓冲。微软Win32子系统通过与设备关联的唯一文件对象访问输入。

②grandmaster模式

在grandmaster模式中,类驱动以如下方式操作所有设备:

  • 类驱动创建代表所有设备的grandmaster类设备对象,并为每个设备创建subordinate类设备对象。类驱动附加subordinate类设备对象到每个设备栈。在subordinate类设备对象下,设备栈和one-to-one模式创建的设备栈相似。
  • grandmaster类设备对象控制所有subordinate类设备对象的操作
  • Win32子系统通过代表grandmaster类设备的文件对象来访问所有设备的输入
  • 所有设备的输入缓存在grandmaster的数据队列中

Kbdclass和Mouclass通过查询注册表路径(HKLM\CurrentControlSet\SYSTEM\Services\<classservice>\Parameters)下的ConnectMultiplePorts值来决定采用哪种模式。ConnectMultiplePorts为0时,采用grandmaster模式;否则采用one-to-one模式。


上图描述了Grandmaster模式下鼠标的设备栈

  • 非HID鼠标键盘的操作

1.打开和关闭键盘鼠标设备

Win32子系统以独占方式打开所有的键盘和鼠标设备。对每一个设备类,Win32子系统处理所有设备的输入,就像输入来自一个输入设备。应用程序不能请求只接收来自某一个特定设备的输入。

在从PNP manager接收到GUID_CLASS_KEYBOARD或GUID_CLASS_MOUSE设备接口启用通知后,Win32子系统动态地打开PNP输入设备。相反地,在接收到相应设备接口禁用后,Win32子系统关闭PNP输入设备。Win32子系统也通过名字打开传统设备(比如:\Device\KeyboardLegacyClass0)。需要注意的是一旦Win32子系统成功打开传统设备后,不能确定是否设备已经移除。

2.连接类服务回调和过滤服务回调到设备

在设备打开前,类驱动必须连接相应的类服务到设备。在类驱动附加类设备对象到设备栈后,类驱动连接相应的类服务。功能驱动用类服务回调来传输设备的输入数据到设备相应类设备的数据队列。功能驱动的ISR(Interrupte Service routines)调用类服务回调。Kbdclass提供服务回调:KeyboardClassServiceCallback;Mouclass提供服务回调:MouseClassServiceCallback。

可通过安装上层过滤驱动来修改类服务回调函数。WDK中的Kbfiltr和Moufiltr例子分别定义了KbFilter_ServiceCallback和MouFilter_ServiceCallback过滤回调函数。在自定义的过滤回调函数中,可修改传输到类设备数据队列的数据,比如删除、变换、或者插入数据。

类和过滤服务回调函数以如下方式进行连接:

  • 类驱动发送内部设备连接请求到设备栈(IOCTL_INTERNAL_KEYBOARD_CONNECT或者IOCTL_INTERNAL_MOUSE_CONNECT)。连接参数CONNECT_DATA中包含指定类设备对象的指针和类服务回调函数指针
  • 过滤驱动接收到连接请求后,保存类连接参数,并用过滤驱动连接参数替换类驱动连接参数。过滤连接参数包含指向过滤设备对象和过滤驱动服务回调函数的指针。过滤驱动发送连接请求到功能驱动。

类和过滤服务回调函数以如下方式被调用:

  • 功能驱动使用过滤驱动连接参数来调用过滤服务回调函数
  • 在过滤输入数据后,过滤服务回调函数使用保存的类连接参数来调用类服务回调函数

3.查询和设置键盘设备

I8042prt驱动支持如下内部设备控制请求,查询键盘信息,设置键盘参数。

①IOCTL_KEYBOARD_QUERY_ATTRIBUTES

输出:KEYBOARD_ATTRIBUTES

②IOCTL_KEYBOARD_QUERY_INDICATOR

输出:KEYBOARD_INDICATOR_PARAMETERS

③IOCTL_KEYBOARD_QUERY_TYPEMATIC

输出:KEYBOARD_TYPEMATIC_PARAMETERS

④IOCTL_KEYBOARD_SET_INDICATOR

输入:KEYBOARD_INDICATOR_PARAMETERS

⑤IOCTL_KEYBOARD_SET_TYPEMATIC

输入:KEYBOARD_TYPEMATIC_PARAMETERS

4.查询鼠标设备

I8042prt驱动支持如下内部设备控制请求,查询鼠标信息。

①IOCTL_MOUSE_QUERY_ATTRIBUTES

输出:MOUSE_ATTRIBUTES

5.绝对指向设备的特殊要求

对于设备类型为GUID_CLASS_MOUSE的设备,设备功能驱动需:

  • 处理设备特定的输入
  • 创建MouseClassServiceCallback需要的MOUSE_INPUT_DATA结构
  • 调用MouseClassServiceCallback将MOUSE_INPUT_DATA数据结构发送Mouclass数据队列

对于绝对指向设备,设备功能驱动必须如下设置MOUSE_INPUT_DATA中的LastX、LastY和Flags成员:

  • 变化设备输入数据

LastX = ((device input x value) * 0xFFFF ) / (Maximum x capabilityof the device)

LastY = ((device input y value) * 0xFFFF ) / (Maximum ycapability of the device)

  • 设置Flags标志为MOUSE_MOVE_ABSOLUTE
  • 如果输入数据需要被映射到虚拟桌面,则需要设置Flags标志为MOUSE_VIRTUAL_DESKTOP。如果未设置为MOUSE_VIRTUAL_DESKTOP,输入数据将被映射到主监视器

Windows鼠标键盘(PS2)驱动框架相关推荐

  1. c++/win32实现模拟windows鼠标键盘操作

    使用到INPUT结构体 typedef struct tagINPUT {DWORD type;union {MOUSEINPUT mi;KEYBDINPUT ki;HARDWAREINPUT hi; ...

  2. Windows 鼠标键盘不可用

    启用这些设备

  3. ubantu系统(naro)鼠标键盘无法工作,连上了也不能工作

    在装机器人开发环境的时候,下一些准备的软件的时候,有可能误删了驱动. 导致第二天开机的时候,鼠标键盘都没用了. 光标不动,键盘无反应. wx_camera_1663850486324 上网问度娘,给出 ...

  4. 服务器重装系统鼠标没反应,重装系统鼠标键盘不能用怎么解决-重装系统鼠标键盘失灵的解决方法 - 河东软件园...

    在我们使用电脑过程中,如果电脑出现了系统问题或者需要将其改为其他的操作系统,我们一般会选择进行重装,从而解决电脑的问题以及获得更加流畅的操作体验,而部分用户在重装电脑后,出现了鼠标键盘不能正常使用的情 ...

  5. linux ps2键盘不能用,解决usb鼠标与ps2键盘合用时开机键盘失效

    昨晚熬夜安装mac os 10.6.3 ,跟着教程一步一步走,终于晚装完毕. 进入mac后发现,ps2接口的键盘无法使用,usb鼠标正常使用. 由于经常捣鼓windows和咱的机箱,下意识想到拔掉键盘 ...

  6. win7卸载显卡及对应驱动后桌面分辨率不对以及鼠标键盘无反应

    今天实验室师妹的一台电脑把显卡(GTX1070)卸载掉后,出现了一个很奇怪的问题,以前也没有遇到过,具体描述以及最后的解决办法如下: 问题: win7卸载掉显卡后,正常开机,但桌面分辨率不正常,致命的 ...

  7. 解决 Windows USB 鼠标键盘断连掉线的问题 和 安全删除硬件并弹出媒体图标 没有弹出移动硬盘的选项

    解决 Windows USB 鼠标键盘断连掉线的问题 鼠标键盘在连接到USB集线器后,经常性出现掉线的情况,键盘和数遍经常性的失灵. 在跟换USB集线器和重装官方驱动后无果.更换过新的USB集线器,发 ...

  8. Macbook air 2013安装windows7,解决鼠标键盘失灵问题的解决方法(集成USB3.0驱动的方法)

    Macbook air 2013安装windows7时,会出现在语言选择界面,键盘鼠标均失灵,或者在用户名界面,鼠标键盘失灵. 本文采用的是将USb3.0集成到Windows7的安装盘的方法. 本文为 ...

  9. Windows打印体系结构之打印驱动框架

    庐山烟雨浙江潮,未到千般恨不消.到得原来无别事,庐山烟雨浙江潮. 1.2.Windows打印驱动框架 Windows的打印驱动从总体架构上来说,包括一个渲染组件和一个配置组件.我们可以回想一下最开始的 ...

  10. Windows的设备驱动框架

    Windows的设备驱动框架 Windows内核管理层的部件之一是I/O管理模块,有时候也称为I/O子系统.I/O管理模块所管理的对象与活动纵向贯穿管理层.核心层乃至HAL层,所以称之为子系统其实也有 ...

最新文章

  1. linux下载文件的常用命令wget
  2. 关于学生信息录入(文件操作)的心得体会
  3. Elasticsearch 100问(上)
  4. 流星,刹那间划过天际
  5. 实战GraphQL+express+mysql项目完整demo
  6. 6-6-1:STL之map和set——set的基本使用
  7. P1099 树网的核
  8. 【Python】一些函数
  9. 截取屏幕并保存为BMP文件
  10. 把html转换成PDF的手机软件,如何将MHTML转换为PDF(Convert MHTML to PDF)?
  11. 配置管理工具应该具有的一般特性
  12. 【Research】Audit审计
  13. Java全栈工程师知识体系介绍
  14. emu8086:如何把数组里的值全部变为FFFF
  15. CSS 基础教程:CSS 选择器
  16. 自动化测试框架STAF介绍
  17. 这些中国顶级黑客带来的价值远比负面影响多!
  18. WIN10更改不了锁屏壁纸
  19. n9006 android6,超详细三星Note3(N9006)ROOT教程
  20. JS设计模式初识(七)-组合模式

热门文章

  1. dbfs和dbm的换算_「清晰易懂」dBFS、dBm、dBV、dBW、0dB、-3dB概念解析
  2. ACM 程序设计竞赛 数学题目
  3. 01.第一个html文件.html
  4. Python量化资源大合集
  5. Java编程题:年会抽奖(错排问题)
  6. 联想ibm服务器修改uefi,解决联想笔记本bios设置uefi变灰色的方法
  7. 在html css中加粗显示,HTML和CSS实现字体加粗的三种方法
  8. 通过IO口控制STC15F2K60S2系列单片机输出pwm
  9. origin8.0快速实现多X,Y绘制
  10. mysql 性能指标计算_干货|MySQL 性能指标及计算方法总结