Поделиться через


Предотвращение дисбаланса при создании и закрытии уведомлений к драйверу

Предупреждение

UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.

Архивные примеры UMDF 1 можно найти в Windows 11, версии 22H2 — обновление примеров драйверов от мая 2022 года.

Дополнительные сведения см. в статье "Начало работы с UMDF".

Верхний драйвер UMDF может использовать метод IWDFDeviceInitialize::AutoForwardCreateCleanupClose, чтобы управлять тем, когда платформа автоматически перенаправляет уведомления о создании файла, очистке файла и закрытии файла к следующему нижнему драйверу в стеке устройств. Однако, поскольку верхний драйвер задает AutoForwardCreateCleanupClose автоматически переадресацию только на уровне устройства, а не на уровне каждого файла, переадресация должна быть одинаковой для всех файлов для устройства. Платформа обеспечивает это поведение пересылки для уведомлений о очистке файла и закрытии файлов. Если верхний драйвер реализует функцию обратного вызова IQueueCallbackCreate::OnCreateFile , необходимо убедиться, что ее поведение пересылки одинаково для всех запросов на создание файла и соответствует поведению пересылки для уведомлений о очистке файла и закрытии файлов. Если этого не сделать, это может привести к тому, что низкоуровневые драйверы получат неравное количество вызовов метода IQueueCallbackCreate::OnCreateFile и методов IFileCallbackCleanup::OnCleanupFile и IFileCallbackClose::OnCloseFile.

Чтобы нижние драйверы не получали неравномерное количество уведомлений о создании и закрытии файлов, верхний драйвер должен гарантированно обеспечить это в функции обратного вызова IQueueCallbackCreate::OnCreateFile.

  • Его поведение пересылки одинаково для всех файлов устройства.

  • Его поведение при пересылке согласуется с тем, как установлен параметр флага IWDFDeviceInitialize::AutoForwardCreateCleanupClose. То есть:

    • Если драйвер задал флаг WdfTrue, драйвер должен перенаправлять все запросы на создание файла вниз стека устройств.
    • Если драйвер задал флаг WdfFalse, драйвер не должен пересылать запросы на создание файла вниз стека.
    • Если драйвер задал флаг WdfUseDefault и:
      • Если драйвер является драйвером функции, он не должен пересылать запросы на создание файла вниз стека.
      • Если драйвер является драйвером фильтра, он должен пересылать все запросы на создание файла вниз стека.

В ситуациях, когда драйвер не может пересылать запрос на создание файла, драйвер по-прежнему может создать новый запрос файла создания для более низких драйверов, вызвав метод IWDFDevice::CreateWdfFile для создания нового WDF-файла. Затем драйвер может завершить исходный запрос на создание файла на основе результатов только что созданного запроса на создание файла (т. е. из результатов CreateWdfFile).