驱动对象及设备对象

驱动对象及设备对象

ID:22129568

大小:597.00 KB

页数:6页

时间:2018-10-27

驱动对象及设备对象_第1页
驱动对象及设备对象_第2页
驱动对象及设备对象_第3页
驱动对象及设备对象_第4页
驱动对象及设备对象_第5页
资源描述:

《驱动对象及设备对象》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、驱动对象与设备对象DRIVER_OBJECT和DEVICE_OBJECT的关系DRIVER_OBJECT是驱动程序在内核中的数据结构,每个驱动程序有唯一DRIVER_OBJECT,IO管理器使用驱动程序对象代表每个设备驱动程序,驱动程序描述了驱动程序的载入到内存什么地方,驱动程序的大小和它的主要入口点(MajorFunction数组);驱动程序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。DEVICE_OBJECT是物理设备或逻辑设备在内核中的数据结构,跟这个概念相关的有PDO和F

2、DO;PDO对应于具体的硬件设备,每个硬件设备对应一个PDO,而一个PDO可以对应多个FDO;PDO和FDO都是DEVICE_OBJECT的实体;同一个设备驱动程序对象下的所有设备通过NextObject域连接成一个链表(即上述驱动程序设备对象的一个域);AttachedDevice域是针对“早期”驱动的(WindowNT4以前的版本,在以后的版本中也可以正常使用);DriverObject域指向与该设备相关的驱动程序对象。这里所说的驱动对象是一种数据结构,在DDK中名为DRIVER_OBJECT。任何驱动程序都对应一

3、个DRIVER_OBJECT.如何获得本人所写的驱动对应的DRIVER_OBJECT呢?驱动程序的入口函数为DriverEntry,因此,当你写一个驱动的开始,你会写下如下的代码:NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,INPUNICODE_STRINGRegistryPath){}这个函数就相当与喜欢c语言的你所常用的main().IN是无意义的宏,仅仅表明后边的参数是一种输入,而对应的OUT则代表这个参数是一种返回。这里没有使用引用,因此如果想在参数中返回结

4、果,一律传入指针。DriverObject就是你所写的驱动对应的DRIVER_OBJECT,是系统在加载你的驱动时候所分配的。RegisteryPath是专用于你记录你的驱动相关参数的注册表路径。这两者都由系统分配并通过这两个参数传递给你。DriverObject重要之处,在于它拥有一组函数指针,称为dispatchfunctions.开发驱动的主要任务就是亲手撰写这些dispatchfunctions.当系统用到你的驱动,会向你的驱动发送IRP(这是windows所有驱动的共同工作方式)。你的任务是在dispatch

5、function中处理这些请求。你可以让irp失败,也可以成功返回,也可以修改这些irp,甚至可以自己发出irp。设备对象则是指DEVICE_OBJECT.下边简称DO.但是实际上每个irp都是针对DO发出的。只有针对由该驱动所生成的DO的IRP,才会发给该驱动来处理。具体的分发函数,决定于DO下的DriverObject域。当一个应用程序打开文件并读写文件的时候,windows系统将这些请求变成irp发送给文件系统驱动。文件系统过滤驱动将可以过滤这些irp.这样,你就拥有了捕获和改变文件系统操作的能力。象Fat32,

6、NTFS这样的文件系统(FileSystem,简称FS),可能生成好几种设备。首先文件系统驱动本身往往生成一个控制设备(CDO).这个设备的主要任务是修改整个驱动的内部配置。因此一个Driver只对应一个CDO.另一种设备是被这个文件系统Mount的Volume。一个FS可能有多个Volume,也可能一个都没有。解释一下,如果你有C:,D:,E:,F:四个分区。C:,D:为NTFS,E:,F:为Fat32.那么E:,F:则是Fat的两个Volume设备对象.实际上"C:"是该设备的符号连接(SymbolicLink)名

7、。而不是真正的设备名。可以打开SymbolicLinksViewer,能看到:C:DeviceHarddiskVolume1因此该设备的设备名为“DeviceHarddiskVolume1”.这里也看出来,文件系统驱动是针对每个Volume来生成一个DeviceObject,而不是针对每个文件的。实际上对文件的读写的irp,都发到Volume设备对象上去了。并不会生成一个“文件设备对象”。掌握了这些概念的话,我们现在用简单的代码来生成我们的CDO,作为我们开发文件系统驱动的第一步牛刀小试。NTSTATUSDri

8、verEntry(INPDRIVER_OBJECTDriverObject,INPUNICODE_STRINGRegistryPath){//定义一个Unicode字符串。UNICODE_STRINGnameString;RtlInitUnicodeString(&nameString,L"\FileSystem\Filter

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。