彻底弄明白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)