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


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

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

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

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

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

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

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

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

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

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

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