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