Управление методами доступа к буферу в драйверах UMDF
При написании драйвера UMDF можно указать параметрыметода доступа к буферу , который платформа использует для запросов на чтение и запись, а также для запросов управления вводом-выводом устройства. Значения, предоставляемые драйвером UMDF, являются только предпочтениями и не гарантируются для использования платформой.
- Указание предпочтительного метода доступа к буферу
- Получение метода доступа для запроса ввода-вывода
- Преобразование из буферизованного ввода-вывода и прямого ввода-вывода
Указание предпочтительного метода доступа к буферу
Начиная с версии UMDF 2.0 драйвер UMDF вызывает WdfDeviceInitSetIoTypeEx для регистрации предпочтительных методов доступа для запросов на чтение и запись и для запросов управления вводом-выводом устройства.
Если драйвер не вызывает WdfDeviceInitSetIoTypeEx, UMDF использует буферизированный метод для запросов ввода-вывода к этому устройству.
Платформа использует следующие правила, чтобы определить, какой метод доступа следует использовать:
Все драйверы UMDF в стеке драйверов должны использовать один и тот же метод для доступа к буферам устройства, а платформа отдает предпочтение буферизованному вводу-выводу.
Если UMDF определяет, что некоторые драйверы предпочитают буферизацию ввода-вывода или прямой ввод-вывод для устройства, а другие драйверы предпочитают только буферизированные операции ввода-вывода для устройства, UMDF использует буферизованное ввод-вывод для всех драйверов. Если один или несколько драйверов стека предпочитают только буферизацию операций ввода-вывода, а другие предпочитают только прямой ввод-вывод, UMDF записывает событие в журнал системных событий и не запускает стек драйверов.
Драйвер может вызывать WdfDeviceGetDeviceStackIoType , чтобы определить методы доступа к буферу, назначенные UMDF запросам на чтение и запись устройства и запросам управления вводом-выводом.
В некоторых случаях UMDF назначает устройству прямой ввод-вывод, но для оптимальной производительности использует буферизированные операции ввода-вывода для одного или нескольких запросов устройства. Например, UMDF использует буферный ввод-вывод для небольших буферов, если может копировать данные в буфер драйвера быстрее, чем сопоставлять буферы для прямого доступа.
При необходимости драйвер может предоставить значение DirectTransferThreshold при вызове WdfDeviceInitSetIoTypeEx. Платформа использует это значение для определения наименьшего размера буфера, для которого платформа будет использовать прямой ввод-вывод. Как правило, это значение не требуется, так как платформа использует параметры, обеспечивающие наилучшую производительность.
UMDF использует прямой ввод-вывод только для буферного пространства, которое начинается и заканчивается на границе страницы памяти. Если начало или конец буфера не находятся на границе страницы, UMDF использует буферные операции ввода-вывода для этой части буфера. Иными словами, UMDF может использовать буферизированные операции ввода-вывода и прямые операции ввода-вывода для передачи больших данных, состоящей из нескольких запросов ввода-вывода.
Для запросов управления вводом-выводом устройства UMDF использует прямой ввод-вывод только в том случае, если код элемента управления ввода-вывода (IOCTL) указывает прямой ввод-вывод, и только если все драйверы UMDF для этого устройства вызвали WdfDeviceInitSetIoTypeEx для указания метода прямого доступа.
Получение метода доступа для запроса ввода-вывода
Драйверы используют один и тот же набор методов объекта запроса для доступа к буферам данных, независимо от метода доступа к буферу. Поэтому большинству драйверов обычно не требуется знать, использует ли UMDF буферизованное или прямое ввод-вывод для запроса ввода-вывода.
В некоторых случаях можно повысить производительность драйвера, если вы знаете метод доступа для запроса ввода-вывода. Например, рассмотрим устройство с высокой пропускной способностью, которое обычно использует прямой ввод-вывод. Когда драйвер получает запрос ввода-вывода, он копирует данные из общего буферного пространства в локальную память драйвера для проверки.
Однако драйвер может иногда получать буфер, использующий буферные операции ввода-вывода. Так как диспетчер ввода-вывода уже скопировал эти данные в промежуточный буфер, драйверу не нужно копировать параметры локально. Избегая операции копирования, драйвер повышает производительность.
Драйвер UMDF вызывает WdfRequestGetEffectiveIoType , чтобы получить метод доступа к буферу запроса ввода-вывода. Как описано выше, тип ввода-вывода для конкретного запроса может отличаться от параметров типа ввода-вывода, назначаемого платформой для устройства.
Преобразование из буферизованного ввода-вывода и прямого ввода-вывода
Драйвер UMDF не может использовать метод "нет".
Однако определения некоторых кодов управления вводом-выводом устройства (IOCTL) указывают, что запросы используют метод "ни то, ни". При необходимости драйвер UMDF может преобразовать метод доступа к буферу таких запросов управления вводом-выводом устройства в буферный или прямой ввод-вывод. Выполните указанные ниже действия.
Включите директиву UmdfMethodNeitherAction в раздел INF DDInstall INF-файла драйвера. Можно задать значение директивы, чтобы указать, что UMDF должна передавать запросы на управление вводом-выводом устройства, использующие метод доступа "ни", в драйвер. (В противном случае UMDF завершает эти запросы ввода-вывода со значением состояния ошибки.)
Получите доступ к буферам запроса ввода-вывода с помощью объектных методов, предоставляемых UMDF для буферизованного ввода-вывода или прямого ввода-вывода.
Следует включить поддержку запросов IOCTL, использующих метод "ни", только если вы уверены, что UMDF может преобразовать метод доступа в буферный или прямой ввод-вывод. Например, если IOCTL указывает настраиваемый запрос, который не соответствует правилам спецификации буфера, описанным в разделе Описания буфера для кодов управления вводом-выводом, UMDF не сможет преобразовать буферы.