跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

驱动开发之 键盘过滤驱动--传统型键盘过滤

近来在看 《寒江独钓 windows内核编程》,看到键盘过滤部分,记下笔记,仅供参考,有理解不对之处,还望大家指正。

现在来说一下传统型键盘过滤,就是把自己的设备对象绑定在KbdClass设备对象之上。

那么发送到KbdClass的IRP都会先经过自己的设备对象,我们可以在读派遣函数中设置完成例程,当IRP完成后在完成历程中得到按键信息。

KbdClass被称为键盘类驱动,在windows中,类驱动通常是指统管一类设备的驱动程序。

不管是USB键盘,还是PS/2键盘均经过它,所以在这层做拦截,能获得很好的通用性。

用工具Devicetree查看 安装《寒江独钓 windows内核编程》中实例 ctl2cap,再次查看 代码如下:

#include

// Kbdclass驱动的名字 #define KBD_DRIVER_NAME L"\\Driver\\Kbdclass"

typedef struct _C2P_DEV_EXT { // 这个结构的大小 ULONG NodeSize; // 过滤设备对象 PDEVICE_OBJECT pFilterDeviceObject; // 同时调用时的保护锁 KSPIN_LOCK IoRequestsSpinLock; // 进程间同步处理 KEVENT IoInProgressEvent; // 绑定的设备对象 PDEVICE_OBJECT TargetDeviceObject; // 绑定前底层设备对象 PDEVICE_OBJECT LowerDeviceObject; } C2P_DEV_EXT, *PC2P_DEV_EXT;

NTSTATUS c2pDevExtInit( IN PC2P_DEV_EXT devExt, IN PDEVICE_OBJECT pFilterDeviceObject, IN PDEVICE_OBJECT pTargetDeviceObject, IN PDEVICE_OBJECT pLowerDeviceObject ) { memset(devExt, 0, sizeof(C2P_DEV_EXT)); devExt->NodeSize = sizeof(C2P_DEV_EXT); devExt->pFilterDeviceObject = pFilterDeviceObject; KeInitializeSpinLock(&(devExt->IoRequestsSpinLock)); KeInitializeEvent(&(devExt->IoInProgressEvent), NotificationEvent, FALSE); devExt->TargetDeviceObject = pTargetDeviceObject; devExt->LowerDeviceObject = pLowerDeviceObject; return( STATUS_SUCCESS ); }

// 这个函数是事实存在的,只是文档中没有公开。

声明一下 // 就可以直接使用了。

NTSTATUS ObReferenceOb

相关文章