独立的 DispatchCreate 和 DispatchClose 例程

用于IRP_MJ_CREATEIRP_MJ_CLOSE请求的驱动程序调度例程可能只不过是使用 STATUS_SUCCESS完成输入 IRP。 有关详细信息,请参阅 “完成 IRP”。

IRP_MJ_CREATEIRP_MJ_CLOSE请求的另一个驱动程序调度例程可能会执行更多工作,具体取决于基础设备驱动程序或基础设备。 请考虑下列情形:

  • 收到创建请求后,类驱动程序可能会初始化内部队列,并将 IRP_MJ_INTERNAL_DEVICE_CONTROL 请求发送到请求设备配置信息或对控制器端口的独占访问权限的相应端口驱动程序。

  • 收到 IRP_MJ_CLOSE 表示与目标设备对象关联的文件对象的最后一个引用已被移除。 这意味着与文件对象相关的所有句柄都已关闭,所有未完成的 I/O 请求已完成或取消。

  • 收到创建请求时,不常使用的设备的驱动程序可能会调用 MmLockPagableCodeSection,以使某些处理其他 IRP_MJ_XXX 请求的驱动程序例程驻留。 收到相互关闭请求后,驱动程序可能会调用 MmUnlockPagableImageSection,以便在所有针对该驱动程序设备对象的文件对象句柄关闭时,将其可分页图像部分分页出,以节省系统内存。

某些驱动程序处理 IRP_MJ_CLOSE 请求只是为了保持一致性,因为当设备对象被受保护的子系统或高层驱动程序打开后,这些较低层驱动程序的设备对象在系统关闭之前不会关闭。 例如,键盘和鼠标驱动程序设置了代表必须在系统运行时正常工作的物理设备的设备对象,因此这些驱动程序可能包含最小的 DispatchClose 例程以保持对称性,或者可能采用组合的 DispatchCreateClose 例程。

如果由较低级别的驱动程序控制的设备必须可供系统继续运行,则通常不会调用驱动程序的 DispatchClose 例程。 例如,某些系统磁盘驱动程序没有 DispatchClose 例程,但这些驱动程序通常具有 DispatchFlushBuffersDispatchShutdown 例程,以便在关闭系统之前完成任何未完成的文件 I/O作。

虽然可以实现单独的 DRIVER_DISPATCHDispatchClose 例程,但驱动程序有时具有 单个 DispatchCreateClose 例程 来处理创建和关闭请求。