阅读:2236回复:5
大神帮忙,键盘过滤的小问题
打开\\driver\\kbdclass,把所有分发函数替换为下面这个函数,我就是想让这个键盘事件不下发给系统。
NTSTATUS HookedDispatch(DEVICE_OBJECT *DeviceObject, IRP *Irp) { NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); if(stack->MajorFunction == IRP_MJ_READ) { if(Irp->UserBuffer) { KEYBOARD_INPUT_DATA *data = (KEYBOARD_INPUT_DATA *)Irp->UserBuffer; DbgPrint("ID: KBD%d\tCODE: 0x%x\tPUSH: %d\n", data->UnitId, data->MakeCode, data->Flags); Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT);//直接完成,不让irp下发 return status; } } else status = pOldDispatch[stack->MajorFunction](DeviceObject, Irp);//保存下来的原来的分发函数 return status; } 问题是,这个Irp完成不掉,函数返回后,马上来一个相同的Irp,data里的数据也一样,无限执行下去.... 如果设Irp.IoStatus.status为非SUCCESS,则从此以后再无Irp到来,键盘失效。 当然,直调用原分发函数没有问题。 |
|
沙发#
发布于:2010-11-13 07:54
过滤者,irp一定要下发,只是根据键盘码处理掉。里面是扫描码,不是ascii字符
|
|
|
板凳#
发布于:2010-11-13 07:57
其实就是把你要拦截的改为无效值就行了,至于无效值,你可以想一下,很容易明白的,扫描码中的无效值。。。
|
|
|
地板#
发布于:2010-11-13 12:53
回 2楼(znsoft) 的帖子
改无效值我试过了,就是设一个完成函数,在完成函数中把SystemBuffer改了,但是改过之后,以后所有的按键都是这个值了。比如我改成0x02,就是按键1,但是以后我按什么,来的都是1。 |
|
地下室#
发布于:2010-11-19 23:16
如果想不下发给系统,那么你可以判断发来的请求,是read的话,你把请求改写成一个空的请求,然后下发下去
|
|
5楼#
发布于:2011-02-20 22:32
设置一个完成回调函数 在回调函数里面把IRP设置完成,键盘设备总是要发一个空IRP等待用户按键,你直接完成了这个IRP 键盘设备估计就无限发给你的过滤了都让你给设置成一样的了!
|
|