Предотвращение дисбаланса при создании и закрытии уведомлений для драйвера
Предупреждение
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 для управления тем, когда платформа автоматически перенаправит уведомления create-file, cleanup-file и close-file в следующий нижний драйвер в стеке устройств. Но так как верхний драйвер устанавливает автоматический переадресацию AutoForwardCreateCleanupClose только на уровне устройства, а не на уровне каждого файла, переадресация должна быть одинаковой для всех файлов на устройстве. Платформа обеспечивает такое поведение переадресации для уведомлений о очистке файла и закрытии файла. Если верхний драйвер реализует функцию обратного вызова IQueueCallbackCreate::OnCreateFile , он должен убедиться, что поведение переадресации одинаково для всех запросов на создание файла и соответствует поведению переадресации для уведомлений о очистке файла и закрытии файлов. Это может привести к тому, что более низкие драйверы будут получать неравное количество вызовов методов IQueueCallbackCreate::OnCreateFile и IFileCallbackCleanup::OnCleanupFile и IFileCallbackClose::OnCloseFile .
Чтобы нижние драйверы не получали неодинаковое количество уведомлений о создании и закрытии файла, верхний драйвер должен обеспечить в функции обратного вызова IQueueCallbackCreate::OnCreateFile следующее:
Его поведение переадресации одинаково для всех файлов для устройства.
Поведение переадресации согласуется с тем, как он задает параметр флага IWDFDeviceInitialize::AutoForwardCreateCleanupClose. Это означает следующее:
- Если драйвер устанавливает для флага WdfTrue, драйвер должен пересылать все запросы на создание файла в стек устройств.
- Если драйвер устанавливает для флага WdfFalse, драйвер не должен пересылать запросы на создание файла в стек.
- Если драйвер устанавливает для флага WdfUseDefault , и:
- Если драйвер является драйвером функции, он не должен пересылать запросы на создание файлов в стеке.
- Если драйвер является драйвером фильтра, он должен пересылать все запросы на создание файла в стек.
В ситуациях, когда драйвер не может переслать запрос на создание файла, драйвер по-прежнему может создать новый запрос на создание файла для более низких драйверов, вызвав метод IWDFDevice::CreateWdfFile для создания нового WDF-файла. Затем драйвер может завершить исходный запрос на создание файла на основе результатов созданного запроса на создание файла (т. е. на основе результатов CreateWdfFile).