开发工具:
文件大小: 840kb
下载次数: 0
上传时间: 2011-03-17
详细说明: 部分解析下《Windows 文件系统过滤驱动开发教程(第二版)》 第一章实用的东西不多,但对过滤驱动是做什么的、怎么做有一个简要的描述 第二章主要是驱动入口DirverEntry例程及各种对象。总的来说,DriverEntry例程代码的各个部分都是既定的,需要修改的只是部分变量和参数。本章需要注意的问题点是驱动中的各种对象。 DirverObject代表这个驱动实例,它有一组函数指针即dispatch函数的函数指针。这些函数类似于MFC中对应某个消息的处理函数,它们分别用于处理各自对应的IRP请求。举例来说(以sfilter为例):SfCreate对应IRP_MJ_CREATE即驱动只要收到MajorFunctionCode为IRP_MJ_CREATE的IRP就交给SfCreate例程处理。编写一个驱动的主要任务也就是确定要处理哪些IRP_MJ_XXX的IRP,然后编写相应的处理例程。CDO(控制设备对象)和DO(设备对象)比较好区分:首先,每个驱动只对应一个CDO,而可以有多个DO;CDO无设备扩展,DO有设备扩展;CDO的主要任务是作为某个操作(一般都是用户自定义的IOCTL等)的目标,用于修改整个驱动的内部配置,而DO是驱动对应某个卷生成的,只有 以它为目标的IRP才会被生成这个DO的驱动处理(这也与驱动栈的概念关联紧密,后面详述)。 再来看本章给出的DriverEntry例程代码片段,主要目的是生成CDO。这里主要有三个点:1、UNICODE_STRTING的使用,参考《驱动开发基础教程》;2、可用函数的调用。需要说明的是由于驱动是由C语言编写的,因此大部分C运行时函数都可以用于驱动编程,但直接使用C运行时库有许多风险,推荐能使用DDK封装好的函数就尽量多用封装好的,除非你愿意自己做繁琐的版本移植和维护;3、对某个函数调用所产生的各种结果都要处理到位。假如在用户模式下调用某函数不考虑其失败的情况,后面的程序要用到该函数返回的某个值(失败时该值无效)时就会发生错误,严重点也就程序运行时出错被迫终止并弹出一个相对友好的报错对话框。在内核模式下的编程,假如有异常或错误没有及时处理,一般都会引起bugcheck,现象就是蓝屏。本例只区分了成功或失败两种状态,在特殊场合,指定的函数调用的状态可能需要分很多种做相应处理。 第三章和第3.5章主要讲了分发例程(dispatch routine)和fastio这两种方式。 两种方式都不是小问题,后面会专门分别讲,这里只简述。先说说分发例程。在legacy驱动模型中,你必须对所有类型的请求都做处理,而不管你需不需要过滤它。因而有些IRP_MJ_XXX类型的IRP你只需要把它传给驱动栈中在你之下的驱动。既然处理方式一样,为了避免重复编码的无用功,就需要一个通用的“下传”例程,即例中的SfPassThrough。它没什么可说的,就只是负责下传当前的IRP。那些需要处理的IRP类型,就得按照例子中的示范给出对应的分发例程,如DriverObject->MajorFunction[IRP_MJ_CREATE] = SfCreate;这样只要驱动接收到IRP_MJ_CREATE类型的IRP就会把它交给SfCreate例程处理。断言的用法与用户模式对应,不再赘述。这里可以形象地认为邮局(驱动)收到邮件(IRP),邮局根据邮件上收信人的邮编和地址(MajorFunction和MinorFunction),把邮件交给收信人(SfCreate)做处理。这里只是比喻,IRP最终的“收件人”并不一定是当前这个过滤驱动的分发例程。 Fastio是cache调用引发的,且没有IRP。你可以认为fastio操作的数据一定是在缓存中。也就是说,用户模式下各种IO到内核模式下只走两天路线:IRP和fastio。假如你只关心磁盘里的数据,那fastio就没什么意义。关于其中出现的内存申请方面的技巧后面会详述。提到的两种锁在后来对某些数据结构的操作中会经常碰到。初期只需要知道。 后面几章操作和编程方面,就示范目的而言讲解地比较详细,其中出现的很多概念和方法还需专门开问讨论,也不推荐过早考虑实际开发。暂时要接受和理解这本书中提到的基本理论已经不容易了。 ...展开收缩
(系统自动生成,下载前可以参看下载内容)
下载文件列表
相关说明
- 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
- 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度。
- 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
- 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
- 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
- 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.