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


Создание и использование объектов файлов Driver-Created

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

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:

Обработка запросов create-file в umdf и wdm.

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

Следующий драйвер в стеке должен определить, может ли он обрабатывать запрос на создание файла или пересылать запрос дальше по стеку.

После вызова IWDFDevice::CreateWdfFile драйвер не может отменить операцию создания.

Использование объекта file

Чтобы отправить асинхронный запрос на чтение следующему драйверу, расположенному в стеке под ним, ваш драйвер может использовать такую схему.

  1. Вызовите IWDFDevice::CreateWdfFile , чтобы создать объект файла.
  2. Вызовите IWDFDevice::GetDefaultIoTarget , чтобы получить интерфейс, представляющий драйвер нижнего уровня.
  3. Вызовите IWDFDevice::CreateRequest , чтобы создать неформатированный объект IWDFIoRequest .
  4. Вызовите функцию IWDFIoRequest::SetCompletionCallback, чтобы зарегистрировать интерфейс IRequestCallbackRequestCompletion для метода OnCompletion, вызываемого фреймворком при завершении запроса ввода-вывода.
  5. Вызовите IWDFIoTarget::FormatRequestForRead, указав указатель на интерфейс IWDFDriverCreatedFile в параметре pFile.
  6. Вызовите 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 указывает невыполненные файлы во время удаления устройства".