Основные коды функций IRP
Каждое расположение стека ввода-вывода для конкретного драйвера (IO_STACK_LOCATION) для каждого IRP содержит основной код функции (IRP_MJ_XXX), который сообщает драйверу, какую операцию он или драйвер базового устройства должен выполнить для удовлетворения запроса ввода-вывода. Каждый драйвер режима ядра должен предоставлять подпрограммы диспетчеризации для основных кодов функций, которые он должен поддерживать.
Конкретные операции, выполняемые драйвером для заданного кода IRP_MJ_XXXX, зависят от базового устройства, особенно для IRP_MJ_DEVICE_CONTROL и запросов IRP_MJ_INTERNAL_DEVICE_CONTROL . Например, запросы, отправляемые драйверу клавиатуры, обязательно несколько отличаются от запросов, отправляемых драйверу диска. Однако диспетчер ввода-вывода определяет параметры и содержимое стека ввода-вывода для каждого определяемого системой основного кода функции.
Каждый драйвер более высокого уровня должен настроить соответствующее расположение стека ввода-вывода в IRP для драйвера следующего уровня и вызвать IoCallDriver либо с каждым входным IRP, либо с созданным драйвером IRP (если драйвер более высокого уровня удерживает входной IRP). Следовательно, каждый промежуточный драйвер должен предоставлять подпрограмму диспетчеризации для каждого основного кода функции, обрабатываемого базовым драйвером устройства. В противном случае новый промежуточный драйвер будет "разорвать цепочку" всякий раз, когда приложение или драйвер более высокого уровня пытается отправить запрос ввода-вывода в базовый драйвер устройства.
Драйверы файловой системы и устаревшие драйверы фильтров файловой системы также обрабатывают обязательное подмножество системных кодов функций IRP_MJ_XXX, некоторые из которые используют подчиненные коды функций IRP_MN_XXXX . Дополнительные сведения об обработке этих irP см. в разделе Основные коды функций IRP для драйверов файловой системы и устаревшие драйверы фильтров FS.
Драйверы обрабатывают заданные IRP с некоторыми или всеми из следующих основных кодов функций:
IRP_MJ_INTERNAL_DEVICE_CONTROL
Входные и выходные параметры, описанные в этом разделе, являются параметрами для конкретных функций в IRP.
Дополнительные сведения об IRP см. в разделе Обработка IRP.