示例 I/O 请求 - 概述

下图概述了当子系统代表应用程序打开表示数据文件的文件对象时会发生什么情况。

说明打开文件对象的示意图。

  1. 子系统调用 I/O 系统服务以打开命名文件。

  2. I/O 管理器调用对象管理器来查找命名文件并帮助它解析文件对象的任何符号链接。 它还调用安全引用监视器来检查子系统具有打开该文件对象的正确访问权限。

  3. 如果尚未装载卷,I/O 管理器会暂时挂起打开的请求并调用一个或多个文件系统,直到其中一个系统将文件对象识别为存储在文件系统使用的其中一个大容量存储设备上的对象。 文件系统装载卷后,I/O 管理器将恢复请求。

  4. I/O 管理器为打开的请求分配内存并初始化 IRP。 对于驱动程序,打开相当于“创建”请求。

  5. I/O 管理器调用文件系统驱动程序,向其传递 IRP。 文件系统驱动程序访问 IRP 中的 I/O 堆栈位置,以确定它必须执行的操作、检查参数、确定请求的文件是否在缓存中,如果不是,则设置 IRP 中下一个较低驱动程序的 I/O 堆栈位置。

  6. 两个驱动程序都处理 IRP 并完成请求的 I/O 操作,调用由 I/O 管理器和其他系统组件提供的内核模式支持例程, (上图) 中未显示。

  7. 驱动程序将 IRP 返回到 I/O 管理器,并在 IRP 中设置了 I/O 状态块,以指示请求的操作是否成功或失败的原因。

  8. I/O 管理器从 IRP 获取 I/O 状态,以便它可以通过受保护的子系统将状态信息返回给原始调用方。

  9. I/O 管理器释放已完成的 IRP。

  10. 如果打开操作成功,I/O 管理器会将文件对象的句柄返回到子系统。 如果出现错误,它会向子系统返回适当的状态。

在子系统成功打开表示数据文件、设备或卷的文件对象后,子系统使用返回的句柄在后续设备 I/O 操作请求中标识文件对象, (通常读取、写入或设备 I/O 控制请求) 。 为了发出此类请求,子系统调用 I/O 系统服务。 I/O 管理器将这些请求作为发送到相应驱动程序的 IRP 进行路由。