防止创建和关闭通知对驱动程序造成的不平衡

警告

UMDF 2 是 UMDF 的最新版本,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 不会向 UMDF 1 添加任何新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。

存档的 UMDF 1 示例可在 Windows 11 版本 22H2 - 2022 年 5 月驱动程序示例更新中找到。

有关详细信息,请参阅使用 UMDF 入门

上层 UMDF 驱动程序可以使用 IWDFDeviceInitialize::AutoForwardCreateCleanupClose 方法控制框架何时自动将 create-file、cleanup-file 和 close-file 通知转发到设备堆栈中的下一个较低驱动程序。 但是,由于上层驱动程序将 AutoForwardCreateCleanupClose 设置为仅在设备级别自动转发,而不是在每文件级别上自动转发,因此对于设备的所有文件,转发必须相同。 框架确保清理文件和关闭文件通知的此转发行为。 如果上层驱动程序实现 IQueueCallbackCreate::OnCreateFile 回调函数,则必须确保所有创建文件请求的转发行为相同,并且与 cleanup-file 和 close-file 通知的转发行为一致。 如果不这样做,可能会导致较低驱动程序收到对其 IQueueCallbackCreate::OnCreateFile 方法和 IFileCallbackCleanup::OnCleanupFileIFileCallbackClose::OnCloseFile 方法的不相等数量的调用。

若要防止较低级别的驱动程序收到不相等数量的 create-file 和 close-file 通知,上级驱动程序必须确保在其 IQueueCallbackCreate::OnCreateFile 回调函数中,满足以下条件:

  • 对于设备的所有文件,其转发行为相同。

  • 其转发行为与设置 IWDFDeviceInitialize::AutoForwardCreateCleanupClose 的标志参数的方式一致。 即:

    • 如果驱动程序将标志设置为 WdfTrue,则驱动程序必须将所有 create-file 请求向下转发设备堆栈。
    • 如果驱动程序将标志设置为 WdfFalse,则驱动程序不得在堆栈下转发任何 create-file 请求。
    • 如果驱动程序将标志设置为 WdfUseDefault ,则:
      • 如果驱动程序是函数驱动程序,则它不得在堆栈下转发任何创建文件请求。
      • 如果驱动程序是筛选器驱动程序,则必须将所有创建文件请求转发到堆栈中。

在驱动程序无法转发 create-file 请求的情况下,驱动程序仍可以通过调用 IWDFDevice::CreateWdfFile 方法来为较低级别的驱动程序生成新的 create-file 请求以创建新的 WDF 文件。 然后,驱动程序可以根据新生成的 create-file 请求 ((即从 CreateWdfFile) 的结果)完成原始创建文件请求。