可选的 Dispatch 例程

驱动程序可能包括以下调度例程:

  • DispatchCleanup

    IRP_MJ_CLEANUP 指示正在关闭与目标设备对象关联的文件对象的最后一个句柄。 文件对象的未完成 I/O 请求可能仍然存在。 驱动程序可以实现 DispatchCleanup 例程,以执行不特定于任何特定文件句柄的清理。 驱动程序还可以将其 DispatchClose 例程用于同一目的。

  • DispatchQueryInformationDispatchSetInformation

    某些最高级别的驱动程序可能需要处理 IRP_MJ_QUERY_INFORMATIONIRP_MJ_SET_INFORMATION IRP。 此类请求指示用户模式应用程序、内核模式组件或驱动程序已请求有关文件对象长度的信息, (表示驱动程序的设备对象) 用户模式请求者具有句柄,或者用户模式请求者正在尝试在该文件对象上设置文件结尾。

    并行类和串行设备驱动程序通过将 FILE_STANDARD_INFORMATIONFILE_POSITION_INFORMATION 长度或位置设置为零来处理这些请求。 其他最高级别的设备驱动程序应支持这些请求,尤其是在用户模式应用程序或内核模式驱动程序可能调用 C 运行时函数来操作文件对象时。 文件系统驱动程序必须比这些最高级别的设备驱动程序更完全地支持这些请求。

  • DispatchFlushBuffers

    在设备中缓存数据或在驱动程序分配的内存内部缓冲数据的驱动程序可能会收到 IRP_MJ_FLUSH_BUFFERS。 收到此请求指示驱动程序应写入其缓冲数据或将缓存数据刷新到设备,或者应放弃从设备读取的缓冲或缓存数据。

    例如,系统键盘和鼠标类驱动程序(其设备输入数据具有内部环形缓冲区)支持刷新请求。 大容量存储设备的驱动程序和上面分层的驱动程序也支持此请求。

  • DispatchShutdown

    在系统关闭之前可能调用的任何驱动程序都必须处理 IRP_MJ_SHUTDOWN。 在电源管理器发送系统设置电源 IRP 以关闭系统之前, DispatchShutdown 例程应执行驱动程序确定所需的任何清理。 驱动程序可以调用 IoRegisterShutdownNotificationIoRegisterLastChanceShutdownNotification 来注册关闭通知。

大容量存储设备的驱动程序和分层在它们的中间驱动程序可以依赖于最高级别的文件系统驱动程序,以在系统即将关闭时向其发送关闭 IRP。 也就是说,FSD 负责确保将任何缓存的文件数据写出到外围设备,调用基础驱动程序从其设备缓存或 (缓冲区刷新数据(如果有任何) ),等等,然后再关闭系统。

在内部缓存数据的大容量存储设备的驱动程序必须提供 DispatchShutdownDispatchFlushBuffers 例程。 如果大容量存储驱动程序在内存中缓冲数据,但其设备没有内部缓存,则它还必须提供 DispatchShutdownDispatchFlushBuffers 例程。

处理 IRP_MJ_FLUSH_BUFFERSIRP_MJ_SHUTDOWN 请求的驱动程序之上的任何中间驱动程序也提供 DispatchShutdownDispatchFlushBuffers 例程。