独立的 DispatchCreate 和 DispatchClose 例程
用于IRP_MJ_CREATE和IRP_MJ_CLOSE请求的驱动程序调度例程可能只不过是使用STATUS_SUCCESS完成输入 IRP。 有关详细信息,请参阅 完成 IRP。
另一个驱动程序针对IRP_MJ_CREATE和IRP_MJ_CLOSE请求的 Dispatch 例程可能会执行更多工作,具体取决于基础设备驱动程序或基础设备。 请考虑下列情形:
收到创建请求后,类驱动程序可能会初始化内部队列,并将 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求向下发送到相应的端口驱动程序,请求设备配置信息或对控制器端口的独占访问权限。
收到IRP_MJ_CLOSE表示已删除对与目标设备对象关联的文件对象的最后一个引用。 这意味着文件对象的所有句柄都已关闭,所有未完成的 I/O 请求都已完成或取消。
收到创建请求后,不经常使用的设备的驱动程序可能会调用 MmLockPagableCodeSection ,使处理其他 IRP_MJ_XXX 请求的某些驱动程序例程常驻。 收到对等关闭请求后,驱动程序可能会调用 MmUnlockPagableImageSection ,以便在关闭此类驱动程序的设备对象的所有文件对象句柄 () 时,将其可分页图像部分分页,从而节省系统内存。
某些驱动程序仅出于对称性处理 IRP_MJ_CLOSE 请求,因为在其设备对象由受保护的子系统或更高级别驱动程序打开后,较低级别驱动程序的设备对象在系统本身关闭之前不会关闭。 例如,键盘和鼠标驱动程序设置表示在系统运行时必须正常运行的物理设备的设备对象,因此这些驱动程序可能具有最少的 DispatchClose 例程以进行对称,或者它们可能组合了 DispatchCreateClose 例程。
如果由较低级别驱动程序控制的设备必须可供系统继续运行,则通常不会调用驱动程序的 DispatchClose 例程。 例如,某些系统磁盘驱动程序没有 DispatchClose 例程,但这些驱动程序通常具有 DispatchFlushBuffers 和 DispatchShutdown 例程,用于在系统关闭之前完成任何未完成的文件 I/O 操作。
虽然你可以实现单独的 DRIVER_DISPATCH 和 DispatchClose 例程,但驱动程序有时有 一个 DispatchCreateClose 例程 来处理创建和关闭请求。