键盘的过滤(绑定驱动kdbclass的所有设备对象)

本文探讨了键盘输入过滤的实现,从IRP的传递流程开始,详细讲解了如何在驱动层捕获并处理IRP,特别是针对IRP_MJ_CREATE的操作。还介绍了键盘过滤的基础,包括符号连接的作用,以及在Windows中键盘设备栈的层次结构。在CPU与键盘的交互过程中,阐述了中断和扫描码的概念,并提到了在Windows XP下的中断号和端口号。最后,给出了键盘过滤的初步代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、首先irp的传递流程

1、I/O管理器创建一个空的IRP,然后将该IRP沿设备堆栈向下传递,比如IRP_MJ_CREATE、IRP_MJ_READ

2、如果驱动程序设置的分发函数捕获到IRP_MJ_CREATE,那么可以在这个分发函数(CREATEdispatch)中对该IRP进行操作,比如IoSetCompletionRoutine,这样当该IRP返回的时候,我们的驱动程序就可以再次捕捉到该IRP,这时候可以用来读取其中的数据,设置返回值等。

       如果没有设置分发函数来捕获这个IRP,那么就直接将该IRP传递给下层的驱动程序,这时候需要将lower DeviceObject的堆栈环境设置成和我们的过滤驱动的堆栈环境相同。需调用两个函数
IoGetCurrentIrpStackLocation and IoGetNextIrpStackLocation. 然后调用IoCallDriver将IRP传递给lower设备对象

3、IRP继续向下传递

4、如果该IRP完成了,那么CompletionRoutine就会被再次调用,之后沿着设备堆栈一直往上传递,返回给用户态的应用程序。

二、键盘过滤的基础

1、符号连接:
符号连接,其实就是一个别名.可以用一个不同的名字代表一个设备对象.

2.、csrss.exe中的win32!RawInputThread通过一个GUID(GUID_CLASS_KEYBOARD)

获得键盘设备栈中PDO符号连接名.

3、PS/2键盘设备栈,
最顶层的设备对象是驱动Kbdclass生成的设备对象
中间层的设备对象是驱动i8042prt生成的设备对象
最底层的设备对象是驱动ACPI生成的设备对象.


CPU与键盘交互方式是中断和读取端口

一个键需要两个扫描码.
按下的扫描码为x,则同一个键弹起为x+0x80

windows xp下端口号与中断号固定
中断号为0x93,端口号为0x60

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值