一、首先irp的传递流程
1、I/O管理器创建一个空的IRP,然后将该IRP沿设备堆栈向下传递,比如IRP_MJ_CREATE、IRP_MJ_READ
2、如果驱动程序设置的分发函数捕获到IRP_MJ_CREATE,那么可以在这个分发函数(CREATEdispatch)中对该IRP进行操作,比如IoSetCompletionRoutine,这样当该IRP返回的时候,我们的驱动程序就可以再次捕捉到该IRP,这时候可以用来读取其中的数据,设置返回值等。
IoGetCurrentIrpStackLoca
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