Определение метода буферизации для операции ввода-вывода
Как и драйверы устройств, файловые системы отвечают за передачу данных между приложениями в пользовательском режиме и устройствами системы. Операционная система предоставляет следующие три метода доступа к буферам данных:
При буферизованном вводе-выводе диспетчер операций ввода-вывода выделяет системный буфер для операции из непагрегированного пула. Диспетчер ввода-вывода копирует данные из этого системного буфера в пользовательский буфер приложения и наоборот в контексте потока, который инициировал операцию ввода-вывода.
При прямом вводе-выводе диспетчер операций ввода-вывода проверяет и блокирует буфер пользователя. Затем он создает список дескрипторов памяти (MDL) для сопоставления заблокированного буфера. Диспетчер ввода-вывода обращается к буферу в контексте потока, который инициировал операцию ввода-вывода.
Ни в буферизованном, ни при прямом вводе-выводе диспетчер ввода-вывода не выделяет системный буфер, а также не блокирует и не сопоставляет буфер пользователя. Вместо этого он просто передает исходный виртуальный адрес пользовательского пространства буфера в стек файловой системы. Драйверы отвечают за то, что они выполняются в контексте инициирующего потока и что адреса буфера являются допустимыми.
Драйверы минифильтра должны проверить любой адрес в пользовательском пространстве, прежде чем пытаться использовать его. Диспетчер ввода-вывода и диспетчер фильтров не проверяют такие адреса и указатели, внедренные в буферы, передаваемые драйверам минифильтра.
Во всех стандартных файловых системах Майкрософт для большинства операций ввода-вывода не используются ни буферные, ни прямые операции ввода-вывода.
Дополнительные сведения о методах буферизации см. в разделе Методы для доступа к буферам данных.
Для операций ввода-вывода на основе IRP используемый метод буферизации зависит от конкретной операции и определяется следующими факторами:
Тип выполняемой операции ввода-вывода
Значение элемента Flags структуры DEVICE_OBJECT для тома файловой системы
Для операций управления вводом-выводом (IOCTL) и управления файловой системой (FSCTL) значение параметра TransferType , переданное в макрос CTL_CODE при определении IOCTL или FSCTL.
Быстрые операции ввода-вывода, имеющие буферы, всегда не используют ни буферный, ни прямой ввод-вывод.
Операции обратного вызова файловой системы не имеют буферов.
Этот раздел состоит из следующих частей.
Операции, которые могут быть IRP-Based или быстрым вводом-выводом
Операции ввода-вывода на основе IRP, которые подчиняются флагам объекта устройства
Операции ввода-вывода на основе IRP, которые всегда используют буферизованное ввод-вывод