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


Методы доступа к буферам данных

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

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

Дополнительные сведения см. в разделе Использование буферизованного ввода-вывода.

Прямой ввод-вывод
Операционная система блокирует буфер приложения в памяти. Затем он создает список дескрипторов памяти (MDL), который идентифицирует заблокированные страницы памяти и передает MDL в стек драйверов. Драйверы получают доступ к заблокированным страницам через MDL.

Дополнительные сведения см. в разделе Использование прямого ввода-вывода.

Ни буферизованного, ни прямого ввода-вывода
Операционная система передает стеку драйверов виртуальный начальный адрес и размер буфера приложения. Буфер доступен только из драйверов, которые выполняются в контексте потока приложения.

Дополнительные сведения см. в разделе Использование буферизованного и прямого ввода-вывода.

Для запросов IRP_MJ_READ и IRP_MJ_WRITE драйверы задают метод ввода-вывода с помощью флагов в каждой структуре DEVICE_OBJECT . Дополнительные сведения см. в разделе Инициализация объекта устройства.

Для запросов IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL метод ввода-вывода определяется значением TransferType , содержащимся в каждом значении IOCTL. Дополнительные сведения см. в разделе Определение кодов управления вводом-выводом.

Все драйверы в стеке драйверов должны использовать один и тот же метод доступа к буферу для каждого запроса, за исключением драйвера самого высокого уровня (который может использовать метод "ни один", независимо от метода, используемого более низкими драйверами).