微软的东东,多数是把聪明人搞晕,把晕的人搞残,把残的人搞死!
一直以来,想弄明白驱动和IRP到底是怎么回事,在驱网上也查了无数的资料,到头来,手脚抽筋也没弄明白。
从网上查到一段说明,可以说是迄今最后的解释,在家里看了N天,似同天书。
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管理器返回文件句柄给子系统。反之返回错误状态。
晕晕乎乎中,似乎有所顿悟,何不用一个具体的类比,也解释一下IRP到底是怎么回事,所以喝了二两二锅头,斗胆把上面的10段话作如下的翻译,有翻译不妥当之处,望大大们指正:
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,return ntStatus)