Windows Debugging之十一

I/O数据结构

==========

数据结构

有四种代表I/O请求的主要的数据结构: file objects(文件对象), driver objects(驱动对象),  device objects(设备对象), I/O request packets(IRPs)(IO请求封包)

这些数据结构中的每一个都定义在DDK文档库中的头文件NTDDK.H中. 你可以使用内核debugger的命令!file, !devobj, !drvobj, 和 !irp来查看它们.


文件对象- File Object
这是一个代表着打开的文件, 设备, 目录, 卷等的, 在用户态可见的对象. 文件对象可以通过文件句柄来访问, 文件句柄是由受保护的子系统函数返回的, 而该子函数是向下调用打开文件对象的系统服务的. IO系统服务的调用者是等待文件句柄的. 在任何一个给定的时刻, 几个文件对象可以与一个单个的, 共享的文件联系起来, 但是每一个这样的文件都有一个独一无二的句柄, 和一个objcet-specific的当前文件指针的值.

文件对象有时也被叫做"persistent object", 因为这个在所有运行时文件对象集后台的实体在系统启动之后, 就被保存起来了.


驱动对象- Driver Object
是一个代表驱动加载镜像的仅内核态对象, 被IOmanager使用, 用来定位驱动中的某些入口点. 

设备对象- Device Object
由IO manager定义的内核态对象, 代表着物理的, 逻辑的, 虚拟的设备. 所有的驱动都调用IoCreateDevice方法来为物理的, 逻辑的, 虚拟的设备创建和初始化一个设备对象, 驱动程序服务于该对象. PnP驱动创建三种设备对象: 总线驱动创建PDO, 功能驱动创建FDO, 过滤驱动创建DO. 设备作为一个命名了的文件对象从而对终端用户是可见的, 通过一个命名的设备接口对用户态的代码可见.(受保护的子系统).

原文地址:https://www.cnblogs.com/awpatp/p/1614781.html