键盘过滤驱动程序[通俗易懂]

键盘过滤驱动程序[通俗易懂]在我,因为现在是半个月后的时间与驱动器接触,我深深体会到开头难,和学习毅力的重要性。同时推动新。当看着帆驱动的开始《Windows驱动开发技术具体解释》讲的挺细。对新手来说是个不错的学习资料,可是更重

大家好,又见面了,我是你们的朋友全栈君。

      在我,因为现在是半个月后的时间与驱动器接触,我深深体会到开头难,和学习毅力的重要性。同时推动新。当看着帆驱动的开始《Windows驱动开发技术具体解释》讲的挺细。对新手来说是个不错的学习资料,可是更重要的还是自己要多动手练习。笔者在学习到同步操作的相关知识的时候。实在是看天书。

最后还是放弃了学习本书。再找了本楚狂人的资料学习。感觉本书对新手来说还是比較吃力的,当中笔者就是这样,非常多知识点不是非常明确。仅仅能凭借自己的感觉去做,只是造成的后果就是无情的蓝屏^_^。终于要的是笔者坚持下来了。


  今天来分享下学习过程中,编写键盘过滤的心得。关于工作原理由于笔者也是一知半解,就不在阐述。

 

  我们的目的就是将自己的驱动设备挂接/driver/kbdclass驱动下的全部设备,如图所看到的:

 

 

键盘过滤驱动程序[通俗易懂]

 

 

   然后通过处理来达到过滤我们想要的按键信息。

挂接后的驱动中的第一个设备就是我们的过滤设备。当有按键触发,按键信息首先会被我们自己写的设备所拦截,可是这时候拦截到的是没有处理的按键信息,那改怎么处理呢?我们去问键盘驱动。当我们拦截到按键IRP的时候先不做处理,给IRP设置完毕回调函数并传递给键盘驱动的设备。这样一来,当按键IRP被键盘驱动处理完毕之后就会运行我们的回调函数,这时我们在处理按键信息。当卸载我们的过滤设备的时候会有个麻烦就是会有个IRP已经设备了回调例程,而且在等待按键触发。

假设这个IRP在没有处理之前就卸载掉我们的过滤驱动,就会引发按键蓝盘。

为什么会蓝屏呢?由于这个IRP是已经被设置了回调函数。当IRP被处理完毕之后去找我们设置的回调函数。由于我们在IRP没有处理之前已经卸载了,所以这时IRP已经找不到回调函数了,所以导致蓝屏。

大部分都的解决方式是在处理IRP的时候放置个计数器,当计数器不为0的时候说明还有IRP未完毕,这是卸载的时候就用while来一直等待这个IRP完毕,假设我们要是不按键盘的话,它会无休止的等待下去,而且也影响系统性能。

  笔者通过相关资料的查阅,另个解决方式就是做个代理IRP,然后保存原来的IRP,由于我们能够取消自己的IRP。在卸载的时候先卸载我们的代理IRP。然后在发送原来保存的IRP,这样就非常好的攻克了无限的等待的BUG…可是笔者也没有找到相关代码,仅仅好自己动手试。经过一下午的測试,笔者发现我们仅仅须要做一个代理IRP就可以,并不须要保存原来的IRP,卸载的时候直接取消我们的IRP,并不须要又一次发送个IRP。以下我们来通过详细代码学习一下键盘过滤驱动。

 

首先:

 

    

 

  在主函数中,调用BindDevice来实现过滤驱动的创建与绑定,代码例如以下:

   

在这里说一下ObReferenceObjectByName函数,该方法没有被导出,知我我们在头文件里声明一下就可以使用,声明例如以下:

  

 

BindDevice方法中,调用了一个CreateDevice方法。该方法负责创建过滤设备,而且附加在目标设备上。详细代码例如以下:

  

 

 

 通过以上代码能够实现过滤设备的绑定,绑定了之后还是主要处理派遣函数,功能例如以下:

  

 

  注意的是在处理派遣函数的时候我们将IRP换成我们自己的IRP。这样就能达到取消IRP的目的,我们给IRP设置了回调函数,当IRP处理完毕的时候就去运行回调函数,回调函数例如以下:

  

  函数就不说明了,主要就是对makecode的处理,只是在回调函数中引用了对比表,例如以下:

 

 

  就是卸载函数,在卸载的时候我们要删除设备和附加的设备,然后取消最后一个IRP。代码例如以下:

  

 

  载函数中调用了个取消IRP的方法,代码例如以下:

  

 

整个键盘过滤驱动就完毕了,以后还得多多学习,多多总结。

转载请注明来自:http://blog.csdn.net/ms2146

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154970.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • pytorch安装、环境搭建及在pycharm中的设置

    pytorch安装、环境搭建及在pycharm中的设置pytorch安装、环境搭建及在pycharm中设置这两天同学在问我pytorch的安装,因为自己的已经安装好了,但是好像又有点遗忘,所以记录一下。一、安装python直接到官网找到和自己设备匹配的版本下载安装即可。安装过程不会出现太多问题,一般情况下python安装在本机上,故可以直接在终端测试是否安装成功。只需win+R——cmd——输入python,就会输出python的版本信息。…

  • 红黑树和平衡二叉树有什么区别?「建议收藏」

    红黑树和平衡二叉树有什么区别?「建议收藏」什么是二叉树?二叉树(BinaryTree)是指每个节点最多只有两个分支的树结构,即不存在分支大于2的节点,二叉树的数据结构如下图所示这是一棵拥有6个节点深度为2(深度从0开始),并且根节点为3的二叉树二叉树有两个分支通常被称作“左子树”和“右子树”,而且这些分支具有左右次序不能随意地颠倒一棵空树或者满足以下性质的二叉树被称之为二叉查找树若任意节点的左子树不为空,则左子树上所有节点的值均小于它的根节点的值; 若任意节点的右子树不为空,则右子树上所有节点的值均大

  • SSM整合,非常详细的SSM整合[通俗易懂]

    SSM整合,非常详细的SSM整合[通俗易懂]对于ssm框架网上有很多,这里只是自己为大家提供的一个ssm整合框架参考分享,这个前提是基于maven的管理工具写的,如果觉得写得不好,博主这边已经把代码上传了:不妨可以参考代码再理解学习:https://download.csdn.net/download/qq_30764991/11012764如果觉得文章不错,对你有帮助,请作者喝杯咖啡,谢谢!如果对您有帮助,请多多支持.多少都…

  • 164. 可达性统计(拓扑排序+数位dp)[通俗易懂]

    164. 可达性统计(拓扑排序+数位dp)[通俗易懂]给定一张 N 个点 M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。输入格式第一行两个整数 N,M,接下来 M 行每行两个整数 x,y,表示从 x 到 y 的一条有向边。输出格式输出共 N 行,表示每个点能够到达的点的数量。数据范围1≤N,M≤30000输入样例:10 103 82 32 55 95 92 33 94 82 104 9输出样例:1633211111#include<bits/stdc++.h>using

  • MIPI协议简介

    MIPI协议简介MIPI协议简介 介绍 MIPI联盟定义了一套接口标准,把移动设备内部的接口如摄像头、显示屏、基带、射频接口等标准化,从而增加设计灵活性,同时降低成本、设计复杂度、功耗和EMI。未来的产品都将朝着移动的方向发展,例如智能手机、数码相机、摄像机、平板电脑、媒体播放器、游戏机等,这些产品需要能执行多任务,包括处理多个不同的传感器如麦克风、图像传感器、磁罗盘、三轴加速度计和精细的触摸屏…

  • 手机qq怎么看撤回的闪照_如何查看qq闪照过后的照片

    手机qq怎么看撤回的闪照_如何查看qq闪照过后的照片QQ只要接收到了图片都是有本地缓存,我们通过浏览本地文件即可找到。1、打开文件管理。找到图片中的目录。 2、按照时间降序排序。按照时间找到QQ好友发送的时间。  3、打开,以图片格式; 这样我们就很简单的看到了QQ好友撤回照片以及闪照。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号