Прочитать на английском

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


Объекты файлов платформы

Когда приложение или драйвер пытается получить доступ к устройству, как правило, путем создания или открытия файла операционная система отправляет запрос на создание файла в стек драйверов. Когда приложение или драйвер завершил работу с устройством, система отправляет очистку файлов и закрывает запросы к стеку драйверов. Типы запросов этих трех запросов : WdfRequestTypeCreate, WdfRequestTypeCleanup и WdfRequestTypeClose соответственно.

Как правило, если драйвер не вызвал WdfDeviceInitSetExclusive, ему необходимо выполнять операции, связанные с файлом, или другие операции, связанные с доступом, при получении запросов на создание, очистку и закрытие файлов, так как несколько файлов могут быть открыты одновременно или несколько приложений могут получить доступ к устройству одновременно. Поэтому драйвер должен отслеживать запросы ввода-вывода, связанные с каждым файлом или приложением.

Платформа определяет объекты файлов платформы, представляющие средства приложения или драйвера для доступа к устройству, например файл, каталог, том, почтовый слот, именованный канал или все устройство. Имя файла может быть связано с объектом файла, но значение имени файла зависит от драйвера. Дополнительные сведения о именах файлов см. в управлении доступом к пространству имен устройств.

Если драйвер должен обрабатывать операции с файлами, он должен вызывать WdfDeviceInitSetFileObjectConfig из своей функции обратного вызова EvtDriverDeviceAdd . Метод WdfDeviceInitSetFileObjectConfig получает WDF_FILEOBJECT_CONFIG структуру в качестве входных данных. Драйвер использует эту структуру для регистрации функций обратного вызова EvtDeviceFileCreate, EvtFileCleanup и EvtFileClose и, при необходимости, чтобы указать, должна ли платформа создавать объект файла платформы каждый раз, когда драйвер получает запрос на создание файла.

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

Создание или открытие файла

Когда платформа получает запрос на создание файла для драйвера функции, он:

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

  2. Вызывает функцию обратного вызова EvtDeviceFileCreate вашего драйвера, если драйвер зарегистрировал эту функцию.

Функция обратного вызова EvtDeviceFileCreate обычно получает сведения о файле, например его имя и флаги объекта файла. Драйвер обычно хранит эти сведения в пространстве контекста объекта файла платформы.

Вместо предоставления функции обратного вызова EvtDeviceFileCreate драйвер может вызвать WdfDeviceConfigureRequestDispatching , чтобы задать очередь ввода-вывода для получения всех запросов на создание файла (тип запроса WdfRequestTypeCreate ). Впоследствии драйвер получит в очереди запросы на создание файла в обработчике запросов EvtIoDefault. (Очередь ввода-вывода не может получать запросы на создание файла, если для элемента DefaultQueueWDF_IO_QUEUE_CONFIG структуры очереди задано значение TRUE.)

Если ваш драйвер не обеспечивает функцию обратного вызова EvtDeviceFileCreate и не настраивает очередь ввода-вывода для обработки запросов ввода-вывода типа WdfRequestTypeCreate, фреймворк:

  • Завершает все запросы на создание файла для драйвера со значением состояния STATUS_SUCCESS, если ваш драйвер является функциональным драйвером.

  • Пересылает все запросы на создание файла в следующий нижний драйвер, если драйвер является драйвером фильтра.

(Чтобы узнать, как изменить это поведение, см. элемент AutoForwardCleanupClose структуры WDF_FILEOBJECT_CONFIG .)

Заметка Если драйвер функции не предоставляет интерфейсы устройств , которые приложения могут использовать для доступа к устройствам драйвера, драйвер должен предоставить функцию обратного вызова EvtDeviceFileCreate , которая завершает все запросы на создание файла со значением состояния, для которого NT_SUCCESS(состояние) равно FALSE. В противном случае вредоносное приложение может попытаться получить доступ к устройству с помощью имени физического объекта устройства (PDO). (У всех PDOs есть имена.)

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

Если драйвер перенаправляет запрос на создание в целевой объект ввода-вывода, он не может установить флаг WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET, если платформа создала объект файла фреймворка для этого запроса. Таким образом, драйвер не может задать флаг WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET для запроса на создание, если не задан флаг WdfFileObjectNotRequired, так как драйвер не сможет очистить WDFFILEOBJECT в случае, если драйвер ниже в стеке отклоняет запрос на создание. Вместо этого драйвер может использовать любые другие параметры отправки, например асинхронно отправлять с помощью подпрограммы завершения или отправлять синхронно. В обоих случаях драйвер должен вызвать WdfRequestComplete при восстановлении управления.

Обратите внимание, что если драйвер завершает запрос на создание с состоянием ошибки, платформа удаляет объект файла платформы, но не вызывает функции обратного вызова EvtFileCleanup или EvtFileClose . Таким образом, если драйвер выделяет дополнительную память для конкретного объекта за пределами контекстного пространства объекта файла, он должен предоставить функцию обратного вызова EvtCleanupCallback или EvtDeskallback , которая удаляет выделенную память.

Для Windows Vista и более поздних версий запросы на создание файлов можно отменить. Более ранние версии операционной системы Windows не поддерживают отмену запросов на создание файлов.

Система всегда создает объект файла модели драйвера Windows (WDM) для каждого запроса на создание, который поступает из пользовательского приложения. Если драйвер отправляет запрос на создание, он может не создать объект WDM-файла для запроса. Как правило, платформа не создает объект файла платформы, если объект файла WDM отсутствует. Однако если драйвер вызвал WdfDeviceInitSetExclusive и если драйвер установил WdfFileObjectWdfCannotUseFsContexts в элементе FileObjectClass структуры WDF_FILEOBJECT_CONFIG, фреймворк создаст объект файла фреймворка, даже если объект файла WDM не существует.

Получение сведений о файле

Функция обратного вызова EvtDeviceFileCreate драйвера может вызывать один или несколько следующих методов объекта для получения сведений о доступе приложения или драйвера к устройству:

WdfFileObjectGetFileName
Возвращает имя файла, содержащееся в объекте файла платформы.

WdfFileObjectGetFlags
Возвращает флаги, содержащиеся в объекте файла платформы.

WdfFileObjectWdmGetFileObject
Возвращает объект WDM-файла, связанный с объектом файла платформы.

WdfRequestGetParameters
Извлекает параметры, связанные с объектом запроса платформы. Если тип запросаWdfRequestTypeCreate, элемент Parameters.Create структуры WDF_REQUEST_PARAMETERS содержит сведения о запросе на создание файла.

Как правило, драйвер сохраняет сведения о файлах в пространстве контекста объекта платформы. Когда драйвер получает запрос ввода-вывода из одной очереди ввода-вывода, драйвер может вызвать WdfRequestGetFileObject , чтобы получить дескриптор объекта файла платформы, связанного с запросом. Затем драйвер может получить сведения о файле, хранящиеся в пространстве контекста файла платформы.

Драйвер может искать очередь ввода-вывода для запросов, связанных с определенным файлом, вызвав WdfIoQueueRetrieveRequestByFileObject.

Если драйвер имеет указатель на структуру WDM DEVICE_OBJECT , драйвер может вызвать WdfDeviceGetFileObject , чтобы получить дескриптор объекта файла платформы, связанного с объектом устройства WDM.

Закрытие файла

Когда приложение или другой драйвер закрывает файл, платформа получает запрос на очистку и запрос закрытия драйвера. Платформа:

  1. Вызывает функции обратного вызова драйвера EvtFileCleanup и EvtFileClose, если драйвер зарегистрировал эти функции.

  2. Удаляет объект файла платформы, представляющий файл.

Функции обратного вызова драйвера EvtFileCleanup и EvtFileClose получают дескриптор объекта файла фреймворка. Драйвер может вызвать WdfFileObjectGetDevice , чтобы определить, какой объект устройства платформы связан с объектом файла платформы.


Дополнительные ресурсы