正在加载图片...
低层的驱动程序,通过这种方法FSD能重用原来的IRP,而不是象图2.3种所示的那样 分配额外的IRP。 3.对于每个驱动程序分配的IRP,图2.3中的FSD调用一个I/0支持例程以注册一个FSD 支持的完成例程。在这个完成例程中,FSD能确定低层驱动程序是否满足请求,并能在 低层驱动程序完成任务后释放每个驱动程序分配的IRP。不论每个驱动程序分配的IRP 是被成功完成,还是返回一个错误状态,或者是被放弃,I/0管理器都将调用FSD支持 的完成例程。更高层驱动程序负责释放IRP,这个IRP是它根据自己的需求为较低层驱 动程序分配并安装的。I/0管理器在所有驱动程序完成任务后释放它分配的IRP。 下一步,FSD调用一个I/0支持例程( IoGetIrpStackLocation)访问相邻的较低层的驱 动程序的I/0栈位置,从而为临近低层驱动程序设置请求。(图2.3种,相邻的较低层 驱动程序碰巧是最低层的驱动程序。)FSD然后调用I/0支持例程( loCalldriver)将 那个IRP传递给相邻的较低层驱动程序。 4.当最低层驱动程序被使用IRP调用时,它检查它的I/0栈位置以确定它将在目标设备上 完成什么操作(通过 IRP MJ XXX函数代码指定)。目标设备在它的被指定的I/0栈位 置中被设备对象表示,并且连带IRP被传送给驱动程序。最低层驱动程序假定I/O管理 器已经发送IRP到一个入口点,这个入口点是驱动程序为 IRP MJ XXX(这里是 IRP MJ READ或 IRP MJ WRITE)操作定义的,并且假定高层驱动程序已经为请求检查过 其他参数的有效性 如果没有较高层驱动程序,最低层驱动程序将检査 IRP MJ XXX的输入参数是否是有效 的。如果它们是有效的,驱动程序通常调用I/0支持例程以通知Ⅰ/0管理器设备操作正 在IRP上等待决定,并且要么将IRP放入队列,要么传递它给另一个驱动程序提供的例 程,这些例程可以访问目标设备(这里是物理设备或逻辑设备:磁盘或磁盘上的一个分 5.Ⅰ/0管理器确定目标设备的驱动程序是否正在处理另一个IRP,如果是这样的话,将IRP 放入队列,并返回。否则,I/0管理器发送IRP到驱动程序提供的例程,这个例程在它 的设备上开始Ⅰ/0操作。(在这个阶段,图2.3中的驱动程序和I/0管理器返回控 制。) 6.当设备中断时,驱动程序的中断服务例程(ISR)所作的仅仅是阻止设备中断,并保存 必要的操作环境。然后,ISR用IRP调用I/0支持例程( IoRequestDpc),等待一个驱 动程序提供的DPC(延迟过程调用)例程以在比ISR更低的硬件优先级上完成请求的操 作 7.当驱动程序的DPC获得控制,它使用环境(在ISR的调用中被传递给 IoRequestDpc)以 完成I/O操作。DPC调用支持例程将下一个IRP(如果有)取出队列,然后传递这个IRP 到驱动程序提供的例程上,这个例程在设备上开始I/0操作(见第5步)。DPC然后在 IRP的I/0状态块中设置刚刚完成的操作的状态,并使用 IoCompleteRequest将它返回 给I/0管理器 8.I/0管理器将IRP中最低层的驱动程序的I/0栈位置赋零,并用FSD分配的IRP调用文 件系统的已注册的完成例程(见第3步)。这个完成例程检查1/0状态块,以确定是否 重试请求或更新任何保存原始请求的内部状态,以及是否释放它的驱动程序分配的 IRP。文件系统能收集所有驱动程序分配的发送给低层驱动程序的IRP的状态信息,所 以它能设置I/0状态,并能完成原始IRP。当文件系统完成原始IRP,I/0管理器返回 Windows nt状态给I/0操作的原始请求者(子系统的本地函数) 图2.3也显示了原始IRP中的两个I/0栈位置,因为它显示了两个驱动程序,一个文件系 驱动程序和一个海量存储设备驱动程序。I/0管理器给分层的驱动程序链中的每个驱动15 低层的驱动程序,通过这种方法 FSD 能重用原来的 IRP,而不是象图 2.3 种所示的那样 分配额外的 IRP。 3. 对于每个驱动程序分配的 IRP,图 2.3 中的 FSD 调用一个 I/O 支持例程以注册一个 FSD 支持的完成例程。在这个完成例程中,FSD 能确定低层驱动程序是否满足请求,并能在 低层驱动程序完成任务后释放每个驱动程序分配的 IRP。不论每个驱动程序分配的 IRP 是被成功完成,还是返回一个错误状态,或者是被放弃,I/O 管理器都将调用 FSD 支持 的完成例程。更高层驱动程序负责释放 IRP,这个 IRP 是它根据自己的需求为较低层驱 动程序分配并安装的。I/O 管理器在所有驱动程序完成任务后释放它分配的 IRP。 下一步,FSD 调用一个 I/O 支持例程(IoGetIrpStackLocation)访问相邻的较低层的驱 动程序的 I/O 栈位置,从而为临近低层驱动程序设置请求。(图 2.3 种,相邻的较低层 驱动程序碰巧是最低层的驱动程序。)FSD 然后调用 I/O 支持例程(IoCallDriver)将 那个 IRP 传递给相邻的较低层驱动程序。 4. 当最低层驱动程序被使用 IRP 调用时,它检查它的 I/O 栈位置以确定它将在目标设备上 完成什么操作(通过 IRP_MJ_XXX 函数代码指定)。目标设备在它的被指定的 I/O 栈位 置中被设备对象表示,并且连带 IRP 被传送给驱动程序。最低层驱动程序假定 I/O 管理 器已经发送 IRP 到一个入口点,这个入口点是驱动程序为 IRP_MJ_XXX(这里是 IRP_MJ_READ 或 IRP_MJ_WRITE)操作定义的,并且假定高层驱动程序已经为请求检查过 其他参数的有效性。 如果没有较高层驱动程序,最低层驱动程序将检查 IRP_MJ_XXX 的输入参数是否是有效 的。如果它们是有效的,驱动程序通常调用 I/O 支持例程以通知 I/O 管理器设备操作正 在 IRP 上等待决定,并且要么将 IRP 放入队列,要么传递它给另一个驱动程序提供的例 程,这些例程可以访问目标设备(这里是物理设备或逻辑设备:磁盘或磁盘上的一个分 区)。 5. I/O 管理器确定目标设备的驱动程序是否正在处理另一个 IRP,如果是这样的话,将 IRP 放入队列,并返回。否则,I/O 管理器发送 IRP 到驱动程序提供的例程,这个例程在它 的设备上开始 I/O 操作。(在这个阶段,图 2.3 中的驱动程序和 I/O 管理器返回控 制。) 6. 当设备中断时,驱动程序的中断服务例程(ISR)所作的仅仅是阻止设备中断,并保存 必要的操作环境。然后,ISR 用 IRP 调用 I/O 支持例程(IoRequestDpc),等待一个驱 动程序提供的 DPC(延迟过程调用)例程以在比 ISR 更低的硬件优先级上完成请求的操 作。 7. 当驱动程序的 DPC 获得控制,它使用环境(在 ISR 的调用中被传递给 IoRequestDpc)以 完成 I/O 操作。DPC 调用支持例程将下一个 IRP(如果有)取出队列,然后传递这个 IRP 到驱动程序提供的例程上,这个例程在设备上开始 I/O 操作(见第 5 步)。DPC 然后在 IRP 的 I/O 状态块中设置刚刚完成的操作的状态,并使用 IoCompleteRequest 将它返回 给 I/O 管理器。 8. I/O 管理器将 IRP 中最低层的驱动程序的 I/O 栈位置赋零,并用 FSD 分配的 IRP 调用文 件系统的已注册的完成例程(见第 3 步)。这个完成例程检查 I/O 状态块,以确定是否 重试请求或更新任何保存原始请求的内部状态,以及是否释放它的驱动程序分配的 IRP。文件系统能收集所有驱动程序分配的发送给低层驱动程序的 IRP 的状态信息,所 以它能设置 I/O 状态,并能完成原始 IRP。当文件系统完成原始 IRP,I/O 管理器返回 Windows NT 状态给 I/O 操作的原始请求者(子系统的本地函数)。 图 2.3 也显示了原始 IRP 中的两个 I/O 栈位置,因为它显示了两个驱动程序,一个文件系 统驱动程序和一个海量存储设备驱动程序。I/O 管理器给分层的驱动程序链中的每个驱动
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有