NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2236回复:5

大神帮忙,键盘过滤的小问题

楼主#
更多 发布于:2010-11-12 16:32
打开\\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到来,键盘失效。
当然,直调用原分发函数没有问题。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2010-11-13 07:54
过滤者,irp一定要下发,只是根据键盘码处理掉。里面是扫描码,不是ascii字符
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2010-11-13 07:57
其实就是把你要拦截的改为无效值就行了,至于无效值,你可以想一下,很容易明白的,扫描码中的无效值。。。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
NEU-Punk
驱动牛犊
驱动牛犊
  • 注册日期2009-10-02
  • 最后登录2010-11-13
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望131点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-11-13 12:53
回 2楼(znsoft) 的帖子
改无效值我试过了,就是设一个完成函数,在完成函数中把SystemBuffer改了,但是改过之后,以后所有的按键都是这个值了。比如我改成0x02,就是按键1,但是以后我按什么,来的都是1。
mengwuji
驱动牛犊
驱动牛犊
  • 注册日期2010-07-20
  • 最后登录2014-06-06
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-11-19 23:16
如果想不下发给系统,那么你可以判断发来的请求,是read的话,你把请求改写成一个空的请求,然后下发下去
hansiyuan
驱动牛犊
驱动牛犊
  • 注册日期2009-05-18
  • 最后登录2011-02-21
  • 粉丝0
  • 关注0
  • 积分17分
  • 威望151点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2011-02-20 22:32
设置一个完成回调函数 在回调函数里面把IRP设置完成,键盘设备总是要发一个空IRP等待用户按键,你直接完成了这个IRP 键盘设备估计就无限发给你的过滤了都让你给设置成一样的了!
游客

返回顶部