加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 系统 > 正文

04内核-驱动对象

发布时间:2021-03-05 09:14:53 所属栏目:系统 来源:网络整理
导读:副标题#e# 驱动对象 驱动程序:就是一个 .sys 模块, 驱动对象:则是 .sys 被加载到内核中的实例化出来的对象,用于表示这个驱动模块. Windows内核使用 DRIVER_OBJECT 结构体来描述一个驱动对象. 虽然Windows内核源码使用C语言编写,但也使用了面向对象的思想.

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

  • I/O管理器为打开请求分配内存并初始化IRP,同时也会分配IO_STACK_LOCATION数组。对于驱动程序,打开等同于“创建”请求。

  • I/O管理器调用文件系统驱动程序,将IRP传递给它。文件系统驱动程序访问其在IRP中的I/O堆栈位置,以确定它必须执行什么操作,检查参数,确定所请求的文件是否在高速缓存中,如果没有,则在IRP中设置下一级驱动程序的I/O堆栈位置。

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

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

  • I/O管理器从IRP获取I/O状态,因此它可以通过受保护的子系统向原始调用者返回状态信息。

  • 释放已经处理完成的IRP

  • 如果打开操作成功,I/O管理器将文件对象句柄返回到子系统。如果存在错误,则返回适当的状态给子系统。

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

    IRP请求处理的详细过程(例子)

    下图是在用户层中打开文件时的过程(例如打开D:1.txt)

    04内核-驱动对象

    1. I/O管理器调用文件系统驱动程序(FSD),并传递已分配给子系统的读/写请求的IRP。FSD访问在IRP中的I/O栈,以确定它应该执行什么操作。

    2. FSD通过调用I/O函数(IoAllocateIrp)一次或多次来分配额外的IRP,可以将原始请求分解为更小的请求(可能针对多个设备驱动程序)。附加的IRP返回到FSD(就是IRP栈),并为下级驱动器用零填充的I/O堆栈位置。FSD可以自行决定,通过在原始IRP中设置下一级驱动程序的I/O堆栈位置,并将其传递给较低级驱动程序,从而重用原始IRP,而不是像上图所示那样分配额外的IRP。

    3. 对于每个驱动程序分配的IRP,上一图中的FSD调用I/O支持例程来注册FSD提供的完成例程;在完成例程中,FSD可以确定较低驱动程序是否满足请求,并在较低驱动程序具有comp时释放每个驱动程序分配的IRP。让它过去吧。I/O管理器将调用FSD提供的完成例程,无论每个驱动程序分配的IRP是否成功完成、错误状态完成或取消。更高级别的驱动程序负责释放其分配的任何IRP,并为其自身设置低级别驱动程序。I/O管理器释放在所有驱动程序完成之后分配的IRP。

      接下来,FSD调用I/O支持例程(IoGetNextIrpStackLocation)来访问下一级驱动程序的I/O堆栈位置,以便设置对下一级驱动程序的请求。(在前面的图中,下一个较低级别的驱动程序碰巧是最低级别的驱动程序。)FSD然后调用I/O支持例程(IoCallDriver)将该IRP传递给下一个较低级别的驱动程序。

    4. 当用IRP调用它时,最低级别的驱动程序检查它的I/O堆栈位置,以确定应该在目标设备上执行什么操作(由IRP_MJ_XXX函数代码指示)。目标设备由设备对象在其指定的I/O堆栈位置中表示,并与IRP一起传递给驱动程序。最低级别的驱动程序可以假设I/O管理器已经将IRP路由到为IRP_MJ_XXX操作(这里是IRP_MJ_READIRP_MJ_WRITE)定义的驱动程序的入口点,并且较高级别的驱动程序已经检查了请求的其他参数的有效性。

      如果没有更高级别的驱动程序,那么最低级别的驱动程序将检查IRP_MJ_XXX操作的输入参数是否有效。如果是,则驱动程序通常调用I/O支持例程来告诉I/O管理器设备操作正在IRP上挂起,或者对IRP进行排队,或者将其传递到访问目标设备(这里是物理或逻辑设备:磁盘或分区)的另一个驱动程序提供的例程。在磁盘上)。

    5. I/O管理器确定驱动程序是否已经忙于处理目标设备的另一个IRP,如果是,则对IRP排队并返回。否则,I/O管理器将IRP路由到在其设备上启动I/O操作的驱动程序提供的例程。(在此阶段,前一个图中的两个驱动程序和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. (编辑:应用网_丽江站长网)

      【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读