大连民族学院毕业设计(论文)外文文献原文及译文学院:计算机科学与工程专业:网络工程班级:网络062班学生姓名:刘安旭指导教师:王立明等待和出列的IRP因为I/O管理器支持异步多任务和多线程在一个系统,尤其是在多处理器的机器,I/O可以请求一个快于驱动程序的设备完成处理,。因此,IRP要绑定到已经忙于处理其它IRP的设备,必须在驱动程序中等待。因此,最底层的驱动程序需要具备以下条件之一:•StartIo例程,它的I/O管理器调用已经在系统提供的IRP队列中等待的I/O操作IRP驱动程序(见IoStartPacket)。•内部IRP的等待和出列机制,使用中的管理IRP驱动程序的处理速度能够满足他们。驱动程序可以使用设备队列,互锁队列,或取消安全的队列。更多信息,参阅Driver-ManagedIRPQueues。只有最底层的设备驱动程序,能够满足和完成所有的IRP派遣例程,不需要StartIo例程和IRP驱动程序管理的队列。高层次的驱动程序多数没有StartIo。大多数中间驱动程序也没有StartIo内部队列。在IRPIoCompletion例程中,中间驱动程序通常可以通过使用IRP的有效的参数进行调度和后处理.。下面的介绍,是大体而言,设计的考虑决定是否实行内在StartIo常规程序,和driver-managed等候IRP。StartIo程序驱动只有设备驱动程序能够处理电脑的外围设备的I/O操作,并可以实现StartIo常规事务。对于这些驱动程序、I/O管理器提供IoStartPacket和IoStartNextPacket程序队列和出入队IRP的system-suppliedIRP队列。更多关于StartI的信息,参阅WritingaStartIoRoutine.内部驱动IRP队列如果一个装置能支持多个并行的I/O操作,它的lowest-level设备驱动程序必须建立内部请求队列管理自己的等待IRP。例如,因为系统序列驱动支持全双工系列设备,所以它需要保持独立队列的读、写、净化等业务。高层次的驱动向一些潜在的设备驱动程序发送请求,同样也可以保持内部IRP队列。例如,文件系统驱动几乎总是有内部等候IRP。更多信息,参阅Driver-ManagedIRPQueues.内部队列同步device-dedicated思想的驱动和和最高层的驱动程序,使用executiveworker线程(包括文件系统驱动)通常都建立了自己的等待IRP。队列是共享的驱动程序思想或driver-suppliedworker-thread调用的例程和其它驱动过程IRP。一个驱动程序,实现自身的队列的结构必须确保进入队和出队是同步的的。任务驱动编写者为了使任务简单化,提供了一个标准的框架IRP队列,你可以在IRP队列中实施。更多信息,参阅Cancel-SafeIRPQueues。这是实现IRP队列最便捷的方式。驱动程序也可以实现IRP队列和取消逻辑同步。例如,一个驱动可以使用一个联锁队列。驱动程序的调度程序插入IRP队列和driver-created线程或者驱动程序的worker-thread通过调用ExInterlockedXxxList支持程序回收移除它们。举例来说,这个系统控制器驱动使用一个软盘联锁队列。它的device-dedicated线程加工处理一样,是由其他IRP的StartIo设备驱动程序和相同其他IRP的DpcForIsr设备驱动程序处理。包涵StartIo内部队列的驱动程序一个驱动程序,经营自己的内部队列也可以有一个StartIo例行程序,但不需要。大多数lowest-level驱动装置都有一个StartIo例行程序或管理自己的队列中,但不能同时适用。IRP一个例外是SCSI港,它有一个StartIo驱动程序和管理内部队列的IRP。I/O管理器队列IRP港口驱动程序的StartIo例行的设备等待联系在一起的driver-created设备对象表示一个SCSIHBA)。SCSI港口的驱动程序也设立和管理设备,每个目标为IRP队列的设备(对应)在SCSI逻辑单位HBA-drivenSCSI总线的机器。驱动程序使用它的SCSI港举行IRP队列的辅助设备发送的小型电脑标准介面类驱动在LU-specific队列在任何设备SCSI总线特别繁忙。实际上,这个驱动程序的补充,LU-specific装置队列使得SCSI港口驱动程序同步操作,通过HBA异构SCSI装置,同时保持每台设备的SCSI巴士HBA一样忙碌。完成IRP完成一个IRP”是一种速记,意思是“让所有的词的驱动程序堆栈完成一个I/O操作。”这个IRP请求后,已经完成,I/O管理器通知,要求启动应用程序的I/O操作完成。当驱动程序已经完成了处理一个IRP,它要求IoCompleteRequest(通常是在一个DpcForIsr程序)。这导致I/O管理器来确定是否建立了IoCompletion高层次驱动程序的IRP。如果是这样的话,每个IoCompletion程序被称为,反过来,直到所有的分层驱动程序在链条已完成IRP。当所有的驱动程序都完成IRP,I/O管理器的状态将原者的操作。注意到一个更高的驱动程序driver-created设立了一个IRP必须提供一个IoCompletion常规释放出的IRP。完成IRP的时机驱动程序应该启动时IRP完成下列条件:•驱动程序决定IRP处理因无效的参数不能进步或其他情况。•驱动程序能处理请求的I/O操作的IRP的驱动程序堆栈,和操作完成。•这个IRP被取消。(参阅CancelingIRPs)如果这些条件无法满足,一名驱动程序的调度程序必须通过这个IRP的next-lower驱动,或者它必须处理工艺的I/O请求。如果有一个条件,驱动程序必须IoCompleteRequest打调用。如果驱动程序完成一个请求,因为处理不能进步,或如果它完成请求处理请求的操作不存取装置,它通常称IoCompleteRequest从其分派程序。更多信息,参阅CompletingIRPsinDispatchRoutines.如果驱动程序要访问一个装置来满足要求,它通常称IoCompleteRequest从DpcForIsr例行程序。这些程序进行了广泛的服务中断。在分派程序完成IRP这节描述完成IRP在分派程序,包含以下的主题:如何完成一个IRP在分配程序什么时候完成一个IRP在分配程序如何在分配程序完成IRP如果一个输入IRP可以完成,调度程序立刻做如下:1设置变更状态和信息的成员的I/O地位IRP块与适当的价值,在一般。•分配程序集的地位要么STATUS_SUCCESS或适当的错误(STATUS_Xxx),可值的一个支持程序或,以较低的同步请求时,驱动程序。如果一个底层驱动,更高回报STATUS_PENDING驱动程序不应该叫IoCompleteRequest为IRP,只有一处例外:高等级的驱动可以用一个事件同步的IoCompletion常规和它之间分配程序,在这种情况下,IoCompletion常规信号并返回STATUS_MORE_PROCESSING_REQUIRED。调度程序的事件,然后等待调用IoCompleteRequest完成IRP。•它集信息的字节数,如果要求成功转移数据传送,如读或写的要求,是满意的。•这是一个非常有价值的信息,来设置不同的具体要求,根据它完成IRP其他STATUS_SUCCESS。•这是一个非常有价值的信息,来设置不同的具体要求,根据IRP,它警告STATUS_XXX。例如,它将信息的字节数为这样一种警告作为转移STATUS_BUFFER_OVERFLOW。•通常,它集信息到零,它为要求,以一个错误STATUS_XXX。2调用IoCompleteRequestIRP和PriorityBoost与IO_NO_INCREMENT。3在适当的STATUS_XXX返回,它已经在I/O状态。注意到一个叫IoCompleteRequest使得给定的IRP达到调用者,所以这个返回值,从调度程序不能从I/O地位阻止一个已经完成IRP遵循这实施指南,叫IoCompleteRequest与一个IRP。总是释放任何旋转锁(s)驱动程序持有IoCompleteRequest之前。它需要一个无限数量的时间来完成一个IRP,特别是在一连串的分层的驱动程序。而且,一个僵局会导致更高的IoCompletion驱动程序发送一个IRP回到较低的驱动程序,举办一个旋转锁。在分配程序完成IRP通常,驱动程序不完整,除非他们分派程序IRP请求对给定的参数,是无效的或设备驱动程序,除非特别IRP_MJ_XXX不需要设备的I/O操作。每个驱动程序在一系列分层驱动程序能查证的参数,以自己的I/O栈单元,每个IRP所收到的驱动程序的调度程序。完成IRP和无效的分配程序的参数尽可能最高的驱动程序改善I/O吞吐量为任何链的驱动程序和系统的整体。在一个高级调度程序应该完成一个IRP驱动或者把它处理低驱动,根据以下指南:•如果调度程序确定任何参数在自己的I/O栈单元是无效的,它应该完成IRP立即用适当的错误状态,如STATUS_INVALID_PARAMETER。•如果这个IRP包含函数代码IRP_MJ_CLEANUP,DispatchCleanup程序必须完成每个IRP目前排到目标设备对象,因为文件对象中指定的驱动程序的I/O栈单元,并完成清除IRP。清理要求显示申请终止或关闭了一个文件处理的文件对象代表了驱动程序的设备对象。当DispatchCleanup程序返回,通常是驱动程序的DispatchClose程序被称为下。•否则,一个高层次的驱动程序能满足要求的只有把它传递给了next-lower驱动程序在lowest-level调度程序驱动程序应该完成一个IRP根据下列指南:•如果调度程序确定任何参数在自己的I/O栈单元是无效的,或如果驱动程序不支持这个IRP,它应该完成IRP立即用适当的错误状态。在这种情况下,驱动程序必须完成IRP和一个状态值的STATUS_SUCCESS。一般情况下,任何高层次的驱动程序已经检查了参数为一个请求的操作,但lowest-level设备驱动程序应该履行自己的参数检查。•如果这个IRP包含函数代码IRP_MJ_CLEANUP,DispatchCleanup程序必须完成每个IRP目前排到目标设备对象,对给定的文件对象的I/O堆栈位置,然后完成清除IRP。清理要求显示申请终止或关闭了一个文件处理的文件对象代表了驱动程序的设备对象。当DispatchCleanup程序返回,通常是驱动程序的DispatchClose程序被称为下。•如果这个请求,不需要设备的I/O操作,调度程序应该满足要求,完成IRP。例如,一个驱动可以保存当前的游戏模式及其设备在这个设备扩展,尤其如果它很少改变装置模式初始化后。它可以满足DispatchDeviceControl程序要求查询当前设备模式将这个存储的信息。否则,调度程序必须打调用给IoMarkIRPPendingIRP队列,另一名驱动程序,为进一步的处理程序,并返回STATUS_PENDING。取消IRP驱动程序在IRP排队等候无限的间隔(这样一个用户可以取消之前提交的I/O请求)必须有一个或多个取消程序来完成user-canceledI/O请求。例如,键盘、鼠标、平行、连续、音响设备驱动程序(或驱动分层的管辖他们)和文件系统驱动程序应该取消。驱动程序对于微软视窗XP操作系统,可以使用,后来cancel-safeIRP队列,而不是实现自己的撤销程序。“取消一个IRP”是指完成IRP尽快的同时仍然保持系统的完整性。对一般的讨论后,看到完成IRPIRP。取消过程开始时,系统或驱动程序调用IoCancelIRP。这个程序要求每个IRP是联系在一起的线,尚未完全完成。这个系统取消的线程IRP若未启动I/O请求退出。驱动程序可以取消只是IRP,他们已经创造了(参阅CreatingIRPsforLower-LevelDrivers.)如果一个