Packet-Driven ввода-вывода с помощью повторно используемых irP
Диспетчер операций ввода-вывода, диспетчер Plug and Play и диспетчер питания используют пакеты запросов ввода-вывода (IRP) для взаимодействия с драйверами режима ядра и для взаимодействия драйверов друг с другом.
Диспетчер операций ввода-вывода выполняет следующие действия:
Принимает запросы ввода-вывода, которые обычно исходят из приложений в пользовательском режиме.
Создает irP для представления запросов ввода-вывода.
Направляет поставщики интеграции с соответствующими драйверами.
Отслеживает irP до их завершения.
Возвращает состояние исходному инициатору запроса каждой операции ввода-вывода.
IRP может быть перенаправлено нескольким драйверам. Например, запрос на открытие файла на диске может сначала перейти к драйверу файловой системы, через промежуточный драйвер зеркало, а в конечном итоге к драйверу диска и, возможно, драйверу аппаратной шины PnP. Этот набор драйверов называется стеком драйверов.
Таким образом, каждый IRP имеет фиксированную часть, а также одно расположение стека ввода-вывода для каждого драйвера, который управляет устройством:
В фиксированной части (или заголовке) диспетчер ввода-вывода хранит сведения об исходном запросе, такие как идентификатор потока и параметры вызывающего объекта, адрес объекта устройства, на котором открыт файл, и т. д. Фиксированная часть также содержит блок состояния ввода-вывода, в котором драйверы задают сведения о состоянии запрошенной операции ввода-вывода.
В расположении стека ввода-вывода драйвера самого высокого уровня диспетчер ввода-вывода, диспетчер Plug and Play или диспетчер управления питанием задает параметры, относящиеся к драйверу, такие как код функции запрошенной операции и контекст, который соответствующий драйвер использует для определения того, что он должен делать. В свою очередь, каждый драйвер настраивает расположение стека ввода-вывода следующего ниже драйвера в стеке драйверов.
Когда каждый драйвер обрабатывает IRP, он может получить доступ к расположению стека ввода-вывода в IRP, тем самым повторно использовать IRP на каждом этапе работы драйвера. Кроме того, драйверы более высокого уровня могут создавать (или повторно использовать) irP для отправки запросов даже к драйверам более низкого уровня.
Подробное описание irP см. в разделе Обработка irPs.