正在加载图片...
6.驱动程序处理IRP,并完成请求的I/0操作,调用I/0管理器和其他系统组件(图2.2 种没有显示)提供的内核模式支持例程 7.驱动程序将IRP连同I/0状态块集返回到I/0管理器,以指明请求的操作是成功被执行 了,还是失败了。 8.I/o管理器从IRP获得I/0状态,所以它能通过保护子系统返回状态信息到原始调用 9.I/0管理器释放完成的IRP 如果打开操作成功,I/0管理器返回文件对象的句柄到子系统。如果出现错误,它 返回合适的状态到子系统 子系统成功打开一个描述数据文件、设备或卷的文件对象后,它使用返回的句柄为设备 Ⅰ/O操作(通常是读、写、或设备I/0控制请求)在后续的请求中指明文件对象。为了创 建这样的请求,子系统调用I/0系统设备。I/0管理器将这些请求作为IRP,发送它们到合 适的驱动程序。 2.2.1用户I/0请求的注意事项 当设计一个内核模式的驱动程序时,切记以下几点 驱动程序可以被分层,并且多个驱动程序能处理单独的I/0请求(IRP)。 驱动程序不能做任何有关其他驱动程序将会在设备栈位置中的假设。因此,每个驱动 程序应该被准备用于接收来自任何其他驱动程序的请求,并能处理所有潜在的错误 驱动程序在IRP的I/0状态块中获得请求的I/O操作成功或失败的消息。I/0管理器 将请求的I/0操作成功或失败的消息发送给用户模式的请求者。 驱动程序不必,也不应该被设计成能提供应用程序特定的支持。保护子系统或它的子 系统特定的用户模式驱动程序提供这种支持。对这条规则有一个例外:依赖于一个应 用专用设备的MS-D0S应用程序能请求 Windows2000驱动程序以控制这个设备,还能 请求一个紧密结合的Wind32用户模式的虚拟设备驱动程序(VDD)。有关VDD的详细 信息参看在线DDK中的“ Virtual device drivers”(虚拟设备驱动程序)文档 23IRP和驱动程序指定的WO栈位置 图2.2带有两个I/0栈位置的IRP,但实际上一个IRP可以拥有任意多个I/0栈位置,这 依赖于有多少分层的驱动程序处理给定的请求。 图2.3在分层的驱动程序中处理IRP 图2.3更详细的说明了图2.2中的驱动程序是怎样使用I/0支持例程(IoXx)为一个读/ 写请求处理IRP 1.I/O管理器用一个IRP调用文件系统驱动程序(FSD),这个IRP是为子系统读/写请求 分配的。FSD访问IRP中它的I/0栈位置,以决定它完成什么操作。 2.FSD能将原始请求分成更小的请求(可能是针对几个设备驱动程序),这项工作是通过 调用一个I/0支持例程( loAllocateIrp)一次或多次以分配额外的IRP。这些额外的 IRP连同为更低层驱动程序创建的I/⑩0栈位置(被填充为全零)被返回给FSD。由它随 意决定,FSD能在原始IRP中安装相邻的较低层驱动程序的I/0栈位置,并传递它给更 1414 6. 驱动程序处理 IRP,并完成请求的 I/O 操作,调用 I/O 管理器和其他系统组件(图 2.2 种没有显示)提供的内核模式支持例程。 7. 驱动程序将 IRP 连同 I/O 状态块集返回到 I/O 管理器,以指明请求的操作是成功被执行 了,还是失败了。 8. I/O 管理器从 IRP 获得 I/O 状态,所以它能通过保护子系统返回状态信息到原始调用 者。 9. I/O 管理器释放完成的 IRP。 10. 如果打开操作成功,I/O 管理器返回文件对象的句柄到子系统。如果出现错误,它 返回合适的状态到子系统。 子系统成功打开一个描述数据文件、设备或卷的文件对象后,它使用返回的句柄为设备 I/O 操作(通常是读、写、或设备 I/O 控制请求)在后续的请求中指明文件对象。为了创 建这样的请求,子系统调用 I/O 系统设备。I/O 管理器将这些请求作为 IRP,发送它们到合 适的驱动程序。 2.2.1 用户 I/O 请求的注意事项 当设计一个内核模式的驱动程序时,切记以下几点: ▪ 驱动程序可以被分层,并且多个驱动程序能处理单独的 I/O 请求(IRP)。 ▪ 驱动程序不能做任何有关其他驱动程序将会在设备栈位置中的假设。因此,每个驱动 程序应该被准备用于接收来自任何其他驱动程序的请求,并能处理所有潜在的错误。 ▪ 驱动程序在 IRP 的 I/O 状态块中获得请求的 I/O 操作成功或失败的消息。I/O 管理器 将请求的 I/O 操作成功或失败的消息发送给用户模式的请求者。 ▪ 驱动程序不必,也不应该被设计成能提供应用程序特定的支持。保护子系统或它的子 系统特定的用户模式驱动程序提供这种支持。对这条规则有一个例外:依赖于一个应 用专用设备的 MS-DOS 应用程序能请求 Windows 2000 驱动程序以控制这个设备,还能 请求一个紧密结合的 Wind32 用户模式的虚拟设备驱动程序(VDD)。有关 VDD 的详细 信息参看在线 DDK 中的“Virtual Device Drivers”(虚拟设备驱动程序)文档。 2.3 IRP 和驱动程序指定的 I/O 栈位置 图 2.2 带有两个 I/O 栈位置的 IRP,但实际上一个 IRP 可以拥有任意多个 I/O 栈位置,这 依赖于有多少分层的驱动程序处理给定的请求。 图 2.3 在分层的驱动程序中处理 IRP 图 2.3 更详细的说明了图 2.2 中的驱动程序是怎样使用 I/O 支持例程(IoXxx)为一个读/ 写请求处理 IRP。 1. I/O 管理器用一个 IRP 调用文件系统驱动程序(FSD),这个 IRP 是为子系统读/写请求 分配的。FSD 访问 IRP 中它的 I/O 栈位置,以决定它完成什么操作。 2. FSD 能将原始请求分成更小的请求(可能是针对几个设备驱动程序),这项工作是通过 调用一个 I/O 支持例程(IoAllocateIrp)一次或多次以分配额外的 IRP。这些额外的 IRP 连同为更低层驱动程序创建的 I/O 栈位置(被填充为全零)被返回给 FSD。由它随 意决定,FSD 能在原始 IRP 中安装相邻的较低层驱动程序的 I/O 栈位置,并传递它给更
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有