Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Предупреждение
UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2.
Архивные примеры UMDF 1 можно найти в Windows 11, версии 22H2 — обновление примеров драйверов от мая 2022 года.
Дополнительные сведения см. в статье "Начало работы с UMDF".
Если драйверу необходимо создать и отправить запрос ввода-вывода, не зависящий от приложения, на следующий драйвер в стеке (целевой объект ввода-вывода по умолчанию), драйвер должен создать и закрыть собственные объекты файлов.
Создание объекта файла
Драйвер должен вызвать метод IWDFDevice::CreateWdfFile , чтобы создать объект файла для использования драйвера. Когда драйвер вызывает IWDFDevice::CreateWdfFile, платформа отправляет запрос на создание следующему драйверу в стеке. Следующий драйвер в стеке может находиться в режиме ядра или в пользовательском режиме.
Эта обработка запросов на создание файла отличается в модели драйвера Windows (WDM). В WDM вызов функции ZwCreateFile вызывает создание IRP в верхней части стека режима ядра. На следующем рисунке показана обработка запросов на создание файла в UMDF и WDM:
Вызвав IWDFDevice::CreateWdfFile, драйвер может создать файловый объект и отправить запросы ввода-вывода во время запуска устройства до начала всего стека.
Следующий драйвер в стеке должен определить, может ли он обрабатывать запрос на создание файла или пересылать запрос дальше по стеку.
После вызова IWDFDevice::CreateWdfFile драйвер не может отменить операцию создания.
Использование объекта file
Чтобы отправить асинхронный запрос на чтение следующему драйверу, расположенному в стеке под ним, ваш драйвер может использовать такую схему.
- Вызовите IWDFDevice::CreateWdfFile , чтобы создать объект файла.
- Вызовите IWDFDevice::GetDefaultIoTarget , чтобы получить интерфейс, представляющий драйвер нижнего уровня.
- Вызовите IWDFDevice::CreateRequest , чтобы создать неформатированный объект IWDFIoRequest .
- Вызовите функцию IWDFIoRequest::SetCompletionCallback, чтобы зарегистрировать интерфейс IRequestCallbackRequestCompletion для метода OnCompletion, вызываемого фреймворком при завершении запроса ввода-вывода.
- Вызовите IWDFIoTarget::FormatRequestForRead, указав указатель на интерфейс IWDFDriverCreatedFile в параметре pFile.
- Вызовите IWDFIoRequest::Send, чтобы отправить запрос.
Закрытие объекта файла
Драйвер, вызвавший IWDFDevice::CreateWdfFile, должен позже вызвать IWDFDriverCreatedFile::Close.
Как правило, ваш драйвер вызывает IWDFDriverCreatedFile::Close из своего метода обратного вызова IPnpCallbackHardware::OnReleaseHardware или IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup.
Когда драйвер вызывает IWDFDriverCreatedFile::Close, структура вызывает метод IFileCallbackCleanup::OnCleanupFile следующего драйвера. В этом методе следующий драйвер должен отменить или завершить все ожидающие запросы ввода-вывода, связанные с объектом файла. Затем платформа отменяет все запросы ввода-вывода, созданные драйвером, который называется IWDFDevice::CreateWdfFile. Платформа не отменяет никаких запросов ввода-вывода, которые ниже драйверов в стеке, возможно, связаны с объектом файла. Драйвер несет ответственность за отмену любых таких запросов. Объект файла закрывается только после завершения всех запросов ввода-вывода, связанных с ним.
Затем платформа вызывает метод IFileCallbackClose::OnCloseFile следующего драйвера. На этом этапе платформа гарантирует, что следующий драйвер не получит дополнительные запросы ввода-вывода для этого объекта файла.
После вызова платформы OnCloseFile он уничтожает интерфейс IWDFFile , представляющий объект файла.
Если созданные драйвером объекты файлов остаются после методов удаления устройства драйвера (например , IPnpCallbackHardware::OnReleaseHardware и IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup), платформа создает остановку драйвера. Сведения об устранении этой проблемы см. в разделе "Определение того, почему UMDF указывает невыполненные файлы во время удаления устройства".