Предварительная обработка Диспетчером ввода/вывода
На данном этапе производится не связанная с устройством подготовка запроса и его предварительная верификация.
Подсистема Win32 (ограничимся этой подсистемой) преобразует запрос в системный сервисный вызов (native system service call). Диспетчер системного сервиса переходит в режим ядра и управление передается Диспетчеру ввода/вывода.
Диспетчер ввода/вывода выделяет память под структуру данных, известную под именем I/O RequestPacket (IRP), пакет запроса на ввод/вывод (пакет IRP). В следующей главе эта структура описывается детальнее, но в первом приближении, вполне можно считать пакет IRP рабочим рецептом (предписанием), выдаваемым драйверу и, соответственно, устройству, которое тот обслуживает. Структура данных IRP заполняется необходимой информацией, включая код, которым обозначается тип запроса на ввод/вывод.
Диспетчер ввода/вывода осуществляет некоторую проверку правильности аргументов, переданных из запроса (инициированного из кода пользовательского режима). Проверка включает верификацию дескриптора файла (имеется в виду, что доступ к устройству из программного кода пользовательского режима осуществляется как доступ к файлу — по файловому дескриптору, ассоциированному с нужным устройством, например, посредством вызова ReadFile). Кроме того, выполняется проверка прав доступа к этому файловому объекту, проверка, предоставил ли драйвер процедуру для обслуживания такого типа запроса, и проверка адресов пользовательских буферных областей памяти, необходимых для обслуживания запроса.
В случае, если запрос является операцией буферизованного ввода/вывода (buffered I/O), Диспетчер ввода/вывода получает область памяти в области нестранично организованной памяти (нестраничном пуле) под создание буфера, после чего копирует данные из области пользовательского буфера в этот системный буфер. В случае, если запрос к устройству требует прямого ввода/вывода (direct I/O), производится блокирование пользовательского буфера в физической памяти и создается список дескрипторов страниц (MDL список), через которые драйвер имеет возможность доступа к этому пространству физической памяти.
Диспетчер ввода/вывода производит вызов необходимых рабочих процедур драйвера (dispatch routines).
Содержание раздела