zoukankan      html  css  js  c++  java
  • 键盘过滤驱动程序

          在我,因为现在是半个月后的时间与驱动器接触,我深深体会到开头难,和学习毅力的重要性。同时推动新。当看着帆驱动的开始《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

  • 相关阅读:
    HDU 2433 Travel (最短路,BFS,变形)
    HDU 2544 最短路 (最短路,spfa)
    HDU 2063 过山车 (最大匹配,匈牙利算法)
    HDU 1150 Machine Schedule (最小覆盖,匈牙利算法)
    290 Word Pattern 单词模式
    289 Game of Life 生命的游戏
    287 Find the Duplicate Number 寻找重复数
    283 Move Zeroes 移动零
    282 Expression Add Operators 给表达式添加运算符
    279 Perfect Squares 完美平方数
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4590800.html
Copyright © 2011-2022 走看看