2022年驱动程序开发技术-过滤键盘驱动 .pdf
《2022年驱动程序开发技术-过滤键盘驱动 .pdf》由会员分享,可在线阅读,更多相关《2022年驱动程序开发技术-过滤键盘驱动 .pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、驱动程序开发技术大作业 过滤键盘驱动姓名:梁海杰学号: 2009441624 班级:计科普0902名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - 摘 要Kbdclass.sys是键盘的类驱动,无论是USB键盘,还是 PS/2 键盘都要经过它的处理;在键盘类驱动之下,和实际硬件打交道的驱动叫做“端口驱动”,比如: i8042prt.sys是 ps/2键盘的端口驱动, Kbdhid.sys 是 USB 键盘的端口驱动。键盘中断导致
2、键盘中断服务例程被执行 , 导 致 最 终i8042prt的I8042KeyboardInterruptService被 执 行 。 在I8042KeyboardInterruptService中,从端口读取扫描码,放到一个KEYBOARD_INPUT_DATA结 构 中 。 并 把 这 个 结 构 放 到i8042prt的 输 入 队 列 中 。 最 后 会 调 用 内 核api函 数KeInsertQueueDpc 。 在这 个调 用中 会 调 用 上 层 KbdClass.sys中 处 理 输 入 的回 调函 数KeyboardClassServiceCallback,取走 i8042p
3、rt的输入数据队列里的数据。 利用驱动分层机制,使用过滤驱动捕获键盘的扫描码并保存下来;应用程序定时访问驱动程序取回扫描码,转换成相应的按键名称并显示;通过应用程序设定按键映射,应用程序将指令传送给驱动程序,以实现将指定的按键消息转换成其他按键。关键词:过滤键盘;驱动分层;映射;扫描码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 过滤键盘驱动一、 主要设计思路利用驱动分层机制,使用过滤驱动捕获键盘的扫描码并保存下来;应用程序
4、定时访问驱动程序取回扫描码,转换成相应的按键名称并显示;通过应用程序设定按键映射,应用程序将指令传送给驱动程序,以实现将指定的按键消息转换成其他按键。表.1 :设计思路键盘过滤驱动是工作在异步模式下的。系统为了得到一个按键操作,首先要发送一个IRP_MJ_READ 消息到驱动的设备栈,驱动收到这个IRP 后,会一直保持这个IRP 为未确定(pending )态,因为当时并没有按键操作。直到一个键被真正的按下,驱动此时就会立刻完成这个 IRP,并将刚按下的键的相关数据做为该IRP 的返回值。在该IRP 带着对应的数据返回后,操作系统将这些值传递给对应的事件系统来处理,然后系统紧接着又会立刻发送一
5、个IRP_MJ_READ 请求,等待下次的按键操作,重复以上的步骤。为了实现截获键盘消息,需要在过滤驱动程序中创建一个挂接到物理键盘设备上层的过滤驱动设备。系统发送的IRP_MJ_READ 消息会首先到达过滤驱动设备,这样就可以有机会给IRP_MJ_READ 设置指定的完成例程,然后将消息下传给物理键盘设备。当有按键动作发生时,IRP_MJ_READ 消息在完成后就会调用指定的完成例程,这时就可以在完成例程中读出键盘动作的内容,或者修改这些信息,以实现按键的映射。应用程序驱动程序显示按键设置映射读扫描码设置映射捕获扫描码名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
6、- - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - 表.2 :截获键盘消息标准的按键扫描码和ASCII 码没有直接的对应关系,大部分按键的扫描码为一个字节;部分功能键为两个字节,且都以0 xE0为高字节。但实验中发现,IRP中返回的按键信息和标准的扫描码并不全等。在KEYBOARD_INPUT_DATA结构中, MakeCode 字段仅包含了一个字节的编码,还要同时参照Flags 字段的内容才能判断出按键的扫描码。下表是KEYBOARD_INPUT_DATA结构中两个字段的内容与其所代表的按键动作的对应
7、关系。当 Flags=0 或 1 时,说明按下的按键是扫描码为一个字节的按键;若Flags=2 或 3,则说明按下的是扫描码为两个字节的按键,而MakeCode 中只保留扫描码的低字节。FlagMakeCode 动作0 等于扫描码按下1 等于扫描码松开2 扫描码的低字节按下3 扫描码的低字节松开表.3 :按键动作的对应关系若使用指定的内容改写返回值中的KEYBOARD_INPUT_DATA结构, 就可以改变按键的作用,实现按键映射的功能。除了 IRP_MJ_READ 以外,对于其他发送给键盘设备的消息,到达过滤驱动设备时就可以不做处理,直接下传给键盘设备,以保证系统的正常工作。在完成例程中将每
8、次捕获得到的扫描码保存起来,应用程序每隔一定的时间(100ms )读取一次并将其清空,再根据扫描码查表得到相应按键的名称,这样就可以做到在应用程序中实时的显示键盘动 作。 用户 在应 用 程序 中设 定 好按键 映射的对应关系后,可以通 过IRP_MJ_DEVICE_CONTROL消息将映射关系发送给过滤驱动程序,还是在完成例程中实现按键键盘设备过滤设备IRP_MJ_READ 设置完成例程完成读扫描码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - -
9、 - - - - - 的映射替代。二、模块的划分、实现及说明具体实现分为驱动程序和应用程序两大部分。驱动程序用C和 WindowsXP DDK 实现,应用程序通过 VC+ 6.0 基于 MFC 实现。在调试和测试中使用了DriverMonitor和 Dbgview 等工具。下面分别介绍其中主要部分的实现:(一)驱动程序部分1.DEVICE_EXTENSION 的定义/ 定义设备扩展对象typedef struct _DEVICE_EXTENSION PDRIVER_OBJECT pDriver; / 对应的驱动PDEVICE_OBJECT pDevice; / 驱动对应的设备对象PDEVICE
10、_OBJECT pKBDevice; / 挂接到的键盘设备UNICODE_STRING ustrDeviceName; / 设备名称UNICODE_STRING ustrSymLinkName; / 符号链接名ULONG IrpPendingCount; / 运行中的IRP 数量ULONG LastScanCode; / 最近获得的键盘扫描码ULONG SetCode2; / 按键映射规则:SetCode0-SetCode1 DEVICE_EXTENSION, *PDEVICE_EXTENSION;2.DriverEntry 主要任务是填写MajorFunction数组、设置卸载例程,并调用C
11、reateDevice 函数。对所关心的一些消息分别设置回调函数,为其他消息设置通用处理函数。/ 通用事件处理例程for (i=0; iMajorFunctioni = KeyFilter_DispatchGeneral; / 指定卸载驱动例程pDriverObject-DriverUnload = KeyFilter_UnLoad; / 捕获 IRP_MJ_READ 消息pDriverObject-MajorFunctionIRP_MJ_READ = KeyFilter_DispatchRead; / 与应用程序通讯pDriverObject-MajorFunctionIRP_MJ_DEVI
12、CE_CONTROL = KeyFilter_DeviceIOControl; pDriverObject-MajorFunctionIRP_MJ_CREATE = KeyFilter_OnFileCreate; pDriverObject-MajorFunctionIRP_MJ_CLOSE = KeyFilter_OnClose;3.DispatchGeneral 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - 对于不关心的
13、那些消息,返回成功值并传递给下一层的键盘设备,本层不作处理。/ 将消息传递到下一个单元IoCopyCurrentIrpStackLocationToNext(pIrp); / 将 IRP 下发给键盘设备status = IoCallDriver(pDevExt-pKBDevice, pIrp); return status;4.CreateDevice 建立设备对象,初始化DEVICE_EXTENSION结构,建立符号链接,将过滤驱动设备挂接到物理键盘设备之上。/设备名称RtlInitUnicodeString(&devName, LDeviceKeyFilterDriver); /要挂接的设
14、备RtlInitUnicodeString(&HookdevName, LDeviceKeyboardClass0); /符号链接RtlInitUnicodeString(&symLinkName,L?KeyFilterDriver); /建立键盘类设备status = IoCreateDevice( pDriverObject, /驱动程序对象sizeof(DEVICE_EXTENSION), /要求的设备扩展的大小&devName, /设备名称FILE_DEVICE_KEYBOARD, /设备的类型0, /指示可删除介质、只读等。FALSE, /非独占访问方式&HookpDeviceObj
15、ect); /返回的设备对象if(!NT_SUCCESS(status) /创建设备失败,输出调试信息DbgPrint(KeyFilter: Keyboard hook failed to create device!n); return status; /对设备进行必要的初始化HookpDeviceObject-Flags |= DO_BUFFERED_IO; pDevExt = (PDEVICE_EXTENSION)HookpDeviceObject-DeviceExtension; pDevExt-pDevice = HookpDeviceObject; pDevExt-pDriver
16、= pDriverObject; pDevExt-ustrDeviceName = devName; pDevExt-ustrSymLinkName = symLinkName; pDevExt-IrpPendingCount = 0; pDevExt-SetCode0 = pDevExt-SetCode1 = 0; /挂接过滤设备到DeviceKeyboardClass0 设备的上层status = IoAttachDevice(HookpDeviceObject, &HookdevName, &kbdDevice); if(!NT_SUCCESS(status) /连接失败,输出调试信息D
17、bgPrint(KeyFilter: Connect with keyboard failed!n); /删除设备IoDeleteDevice(HookpDeviceObject); return status; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 13 页 - - - - - - - - - pDevExt-pKBDevice = kbdDevice; /创建符号链接status = IoCreateSymbolicLink(&symLinkName,&de
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年驱动程序开发技术-过滤键盘驱动 2022 驱动程序 开发 技术 过滤 键盘 驱动
限制150内