Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Одной из основных обязанностей стека драйверов является передача данных между приложениями в пользовательском режиме и устройствами системы. Операционная система предоставляет следующие три метода доступа к буферам данных:
Буферизованный ввод-вывод
Операционная система создает некстраничный системный буфер, равный размеру буфера приложения. Для операций записи диспетчер ввода-вывода копирует данные пользователей в системный буфер перед вызовом стека драйверов. Для операций чтения диспетчер операций ввода-вывода копирует данные из системного буфера в буфер приложения после завершения запрошенной операции стека драйверов.
Дополнительные сведения см. в разделе Использование буферизованного ввода-вывода.
Прямой ввод-вывод
Операционная система блокирует буфер приложения в памяти. Затем он создает список дескриптора памяти (MDL), который определяет заблокированные страницы памяти и передает MDL в стек драйверов. Драйверы получают доступ к заблокированным страницам через MDL.
Дополнительные сведения см. в "Использование прямого ввода-вывода".
Ни буферизованного ввода-вывода, ни прямого ввода-вывода
Операционная система передает виртуальный начальный адрес и размер буфера приложения в стек драйверов. Буфер доступен только из драйверов, которые выполняются в контексте потока приложения.
Дополнительные сведения см. в разделе "Использование ни буферизованного, ни прямого ввода-вывода".
Для запросов IRP_MJ_READ и IRP_MJ_WRITE драйверы указывают метод ввода-вывода с помощью флагов в каждой структуре DEVICE_OBJECT . Дополнительные сведения см. в инициализации объекта устройства.
Для запросов IRP_MJ_DEVICE_CONTROL и IRP_MJ_INTERNAL_DEVICE_CONTROL метод ввода-вывода определяется значением TransferType , содержащимся в каждом значении IOCTL. Дополнительные сведения см. в разделе Определение кодов управления ввода-вывода.
Все драйверы в стеке драйверов должны использовать один и тот же метод доступа к буферу для каждого запроса, за исключением драйвера верхнего уровня, который может выбрать метод "ни один из методов" независимо от метода, используемого более низкими драйверами.