驱动对象和设备对象.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
驱动对象和设备对象

驱动对象与设备对象 DRIVER_OBJECT和DEVICE_OBJECT的关系DRIVER_OBJECT是驱动程序在内核中的数据结构,每个驱动程序有唯一DRIVER_OBJECT,IO管理器使用驱动程序对象代表每个设备驱动程序,驱动程序描述了驱动程序的载入到内存什么地方,驱动程序的大小和它的主要入口点(MajorFunction数组);驱动程序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。 DEVICE_OBJECT是物理设备或逻辑设备在内核中的数据结构,跟这个概念相关的有PDO和FDO;PDO对应于具体的硬件设备,每个硬件设备对应一个PDO,而一个PDO可以对应多个FDO;PDO和FDO都是DEVICE_OBJECT的实体;同一个设备驱动程序对象下的所有设备通过NextObject域连接成一个链表(即上述驱动程序设备对象的一个域);AttachedDevice域是针对“早期”驱动的(Window NT4以前的版本,在以后的版本中也可以正常使用);DriverObject域指向与该设备相关的驱动程序对象。这里所说的驱动对象是一种数据结构, 在DDK 中名为DRIVER_OBJECT。任何驱动程序都对应一个DRIVER_OBJECT.如何获得本人所写的驱动对应的DRIVER_OBJECT 呢?驱动程序的入口函数为DriverEntry,因此,当你写一个驱动的开始,你会写下如下的代码:NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { } 这个函数就相当与喜欢c 语言的你所常用的main().IN 是无意义的宏,仅仅表明后边的参数是一种输入,而对应的OUT 则代表这个参数是一种返回。这里没有使用引用,因此如果想在参数中返回结果,一律传入指针。 DriverObject 就是你所写的驱动对应的DRIVER_OBJECT, 是系统在加载你的驱动时候所分配的。 RegisteryPath 是专用于你记录你的驱动相关参数的注册表路径。这两者都由系统分配并通过这两个参数传递给你。DriverObject 重要之处,在于它拥有一组函数指针,称为dispatch functions.开发驱动的主要任务就是亲手撰写这些dispatch functions.当系统用到你的驱动,会向你的驱动发送IRP(这是windows 所有驱动的共同工作方式)。你的任务是在dispatch function 中处理这些请求。你可以让irp 失败,也可以成功返回,也可以修改这些irp,甚至可以自己发出irp。设备对象则是指DEVICE_OBJECT.下边简称DO. 但是实际上每个irp 都是针对DO 发出的。只有针对由该驱动所生成的DO 的IRP, 才会发给该驱动来处理。具体的分发函数,决定于DO 下的DriverObject 域。 当一个应用程序打开文件并读写文件的时候,windows 系统将这些请求变成irp 发送给文件系统驱动。文件系统过滤驱动将可以过滤这些irp.这样,你就拥有了捕获和改变文件系统操作的能力。 象Fat32,NTFS 这样的文件系统(File System,简称FS),可能生成好几种设备。首先文件系统驱动本身往往生成一个控制设备(CDO).这个设备的主要任务是修改整个驱动的内部配置。因此一个Driver 只对应一个CDO. 另一种设备是被这个文件系统Mount 的Volume。一个FS 可能有多个Volume,也可能一个都没有。解释一下,如果你有C:,D:,E:,F:四个分区。C:,D:为NTFS,E:,F:为Fat32.那么E:,F:则是Fat 的两个Volume 设备对象.实际上C:是该设备的符号连接(Symbolic Link)名。而不是真正的设备名。可以打开Symbolic Links Viewer,能看到: C: \Device\HarddiskVolume1 因此该设备的设备名为“\Device\HarddiskVolume1”. 这里也看出来,文件系统驱动是针对每个Volume 来生成一个DeviceObject,而不是针对每个文件的。实际上对文件的读写的irp,都发到Volume 设备对象上去了。并不会生成一个“文件设备对象”。掌握了这些概念的话,我们现在用简单的代码来生成我们的CDO,作为我们开发文件系统驱动的第一步牛刀小试。NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { // 定义一个Unicode 字符串。 UNICODE_ST

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档