Windows驱动学习(五)-- 键盘过滤

教程参考自:https://www.bilibili.com/video/av26193169/?p=5
代码地址:https://github.com/G4rb3n/Windows-Driver/tree/master/MT-Keyboard

1. 概述

我们在键盘上按下一个按键时,键盘会产生要给硬件中断(中断级很高),Windows会捕捉这个中断,从而得知键盘上有了操作,然后由驱动来读取及处理键值。

2. 驱动编写

2.1 驱动入口函数

跟之前的差不多,我们首先注册驱动卸载函数,然后注册通用的IRP分发函数。接着便是注册键盘过滤特有的三个分发函数:读IRP、电源IRP、即插即用IRP。ReadDispatch用来处理键值的读操作,PowerDispatch用来处理电源操作,PnPDispatch用来处理即插即用(当键盘插上或拔掉)操作。注册完这些分发函数后,便调用AttachDevice来绑定一个过滤设备到键盘驱动上。
Windows驱动学习(五)-- 键盘过滤_第1张图片

2.2 通用IRP分发函数
Windows驱动学习(五)-- 键盘过滤_第2张图片

2.3 电源IRP分发函数
Windows驱动学习(五)-- 键盘过滤_第3张图片

2.4 即插即用IRP分发函数
Windows驱动学习(五)-- 键盘过滤_第4张图片

2.5 过滤设备绑定函数

键盘驱动对应着一个设备链,物理硬件(键盘)处于该设备链的最底端,在键盘上面叠着很多其他的虚拟设备,当键盘上有击键操作时,键值便会存储在IRP中,一层一层向上传递。所以我们可以创建一个虚拟设备,绑定到这条设备链中来第一时间获取到按键信息,从而对其进行操作。
Windows驱动学习(五)-- 键盘过滤_第5张图片

2.6 读IRP分发函数

因为中断处理要求的是快,我们不能在读IRP分发函数做一些耗时的工作(比如获取、替换键值等操作),那样的话会导致系统变卡,所以我们只在ReadDispatch中做一个关键操作,设置IRP完成回调函数,意思是指读IRP完成后,再由系统来调用操作键值的函数,那样就不会耽误IRP的传递了。
Windows驱动学习(五)-- 键盘过滤_第6张图片

2.7 读IRP完成回调函数

核心的键值操作在ReadComp中完成,下图中我将键值0x1f(‘s’键)替换成了0x20(‘d’键).
Windows驱动学习(五)-- 键盘过滤_第7张图片

3. 驱动测试

下图中,我分别按了三下“a”、“s”、“d”,但在记事本中可以看出,“s”都被替换成了“d”。从DebugView中也可以看到详细信息。
Windows驱动学习(五)-- 键盘过滤_第8张图片

你可能感兴趣的:(Windows驱动)