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


Создание и использование объектов файлов 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.

Если драйверу необходимо создать и отправить запрос ввода-вывода, не зависящий от приложения, следующему драйверу в стеке (целевому объекту ввода-вывода по умолчанию), драйвер должен создать и закрыть собственные файловые объекты.

Создание объекта file

Драйвер должен вызвать метод 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 , чтобы отправить запрос.

Закрытие объекта File

Драйвер, который вызвал 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 указывает на необработанные файлы во время удаления устройства.