彻底弄明白IRP(转载)

彻底弄明白IRP(转载)


官方解释:

  引用:

1.   子系统调用NT的IO系统服务打开命名文件。

2.   NT的IO管理器调用对象管理器,查询命名文件,并且帮助解决文件对象的符号连接。同时调用安全参照监视器,检查子系统是否具备打开文件句柄的正确权限。

3.   如果NT文件系统不认识文件对象,IO管理器挂起请求。调用多个文件系统直到识别出文件对象才继续请求。

4.   IO管理器负责为打开的请求分配内存和初始化IRP。对于NT驱动,打开请求等同于创建请求。

5.   IO管理器调用文件系统驱动,将IRP传递给它们。文件系统存取它们的IRP中本地IO栈,决定必须进行哪一种操作。检查参数,确定请求文件是否在缓存中。如果不是,设置下一个IRP中驱动的IO栈。

6.   无论是驱动处理IRP还是完成IO请求操作。都调用IO管理器和其它NT元素提供的核心态例程。

7.   驱动设置返回给IO管理器的IRP中的IO状态块表示请求操作是成功还是失败。

8.   IO管理器通过获取IRP中的IO状态,将信息同过保护子系统返回给原始调用者。

9.    IO管理器释放已完成的IRP。

10.   如果打开操作成功,IO管理器返回文件句柄给子系统。反之返回错误状态。

 上述解释看起来仍含含糊糊,于是网上找到了如下的比喻,甚觉形象的很,转载下载供大伙交流学习,不喜勿喷。

1.客人(IRP)来到大厦(驱动程序)外,该大厦有一个按人名造册的接待系统(IO管理器)。

2.客人(IRP)先到大厅,查花名册,按人名(设备对象DeviceObject,符号连接SymbolicLink)查。同时查安全薄,看这个人是不是恐怖分子、台独分子(STATUS_INVALID_DEVICE_REQUEST,SECURITY_CLIENT_CONTEXT),不是则被允许进入。如是,则不允许则禁入。

3. 如果查不到客人名,则拒绝进入。调用多本花名册(文件系统,FSD),直到识别出来人,才继续。

4.接待系统(IO管理器)为客人(IRP)分配房间、会议室,餐饮,一应俱全(RtlZeroMemory,RtlCopyMemory),并打扫一遍(初始化, KeSetEvent, KeWaitForSingleObject,IoMarkIrpPending, InitializeObjectAttributes)。

5.接待系统(IO管理器)调用管理人员,将客人的信息传递给下面各部门。各部门管理人员根据他们的子系统情况,分配资源队列(本地IO栈),并决定必须进行哪一种操作(IoGetCurrentIrpStackLocation,Irp->AssociatedIrp.SystemBuffer)。客人是否在不同级别的客人清单中。如果没有这个级别,则新建一个级别(DeviceObject->DeviceExtension),并进行登记。比如是国宾级,则一定要准备一个总统套间。

6. 不论是对于客人(Irp),还是客人的级别档次要求(IO栈),都使用模块化的规范流程。

7. 向大厦总经理报告人员进入、级别招待的请求是成功还是失败。

8.获取人员、招待的状态,将是不是超过招待能力的信息(过保护状态)返回给新来的客人。如果超出接待能力,则挂牌“客满,恕不接待”。

9.人员离开,则释放客人占有的所有资源(分配房间、会议室等)。IoCompleteRequest,DriverObject->DriverUnload,IoDeleteDevice, ZwClose

10.招待成功,返回OK或返回错误(Irp->IoStatus.Status = STATUS_SUCCESS,returnntStatus)

你可能感兴趣的:(windows操作系统,oracle转载博文未看,磁盘管理,存储系统,RAID,linux操作系统)