IRP_MJ_DEVICE_CONTROL (драйверы FS и фильтров)

При отправке

Диспетчер ввода-вывода, другие компоненты операционной системы и другие драйверы, работающие в режиме ядра, отправляют запросы IRP_MJ_DEVICE_CONTROL. Обычно эта IRP отправляется от имени приложения пользовательского режима, которое вызывает функцию Win32 DeviceIoControl , или от имени компонента режима ядра, который называется ZwDeviceIoControlFile.

Операция: драйверы файловой системы

Драйвер файловой системы должен извлечь и декодировать файловый объект, чтобы определить, был ли выполнен запрос для дескриптора, открытого на томе. В этом случае драйвер файловой системы должен передать IRP драйверу устройства хранения, к которому подключен том. В противном случае драйвер должен завершиться ошибкой IRP.

Операция: устаревшие драйверы фильтров файловой системы

Драйвер фильтра должен выполнить необходимую обработку и в зависимости от характера фильтра либо завершить IRP, либо передать его следующему драйверу в стеке.

Параметры

Драйвер файловой системы или фильтра вызывает IoGetCurrentIrpStackLocation для заданного IRP, чтобы получить указатель на собственное расположение стека в IRP. В следующих параметрах Irp указывает на IRP , а IrpSpна IO_STACK_LOCATION. Драйвер может использовать сведения, заданные в следующих элементах IRP и расположении стека IRP, для обработки запроса на управление устройством.

  • DeviceObject — это указатель на целевой объект устройства.

  • Irp->AssociatedIrp.SystemBuffer указывает на предоставленный системой входной буфер, передаваемый драйверу устройства для целевого устройства. Используется для METHOD_BUFFERED или METHOD_DIRECT ввода-вывода. Является ли этот параметр обязательным, зависит от конкретного кода элемента управления вводом-выводом.

  • Irp->IoStatus указывает на структуру IO_STATUS_BLOCK , которая получает окончательное состояние завершения и сведения о запрошенной операции. Дополнительные сведения см. в описании параметра IoStatusBlock в ZwDeviceIoControlFile.

  • Irp->MdlAddress — это адрес списка дескрипторов памяти (MDL), описывающий выходной буфер, передаваемый драйверу устройства для целевого устройства. Используется для METHOD_DIRECT ввода-вывода. Является ли этот параметр обязательным, зависит от конкретного кода элемента управления вводом-выводом.

  • Irp->RequestorMode указывает режим выполнения процесса, который запросил операцию, либо KernelMode , либо UserMode.

  • Irp->UserBuffer указывает на предоставленный вызывающим объектом выходной буфер, который передается драйверу устройства для целевого устройства. Используется для METHOD_BUFFERED или METHOD_NEITHER ввода-вывода. Является ли этот параметр необязательным или обязательным, зависит от конкретного кода элемента управления вводом-выводом.

  • IrpSp->FileObject указывает на объект файла, связанный с DeviceObject.

    Параметр IrpSp-FileObject> содержит указатель на поле RelatedFileObject, которое также является FILE_OBJECT структурой. Поле RelatedFileObject структуры FILE_OBJECT недопустимо во время обработки IRP_MJ_DEVICE_CONTROL и не должно использоваться.

  • IrpSp->MajorFunction имеет значение IRP_MJ_DEVICE_CONTROL.

  • IrpSp->Parameters.DeviceIoControl.InputBufferLength — это размер буфера в байтах, на который указывает Irp-AssociatedIrp.SystemBuffer>.

  • IrpSp->Parameters.DeviceIoControl.IoControlCode — это код функции IOCTL, который передается драйверу устройства для целевого устройства.

    Подробные сведения о запросах IOCTL см. в разделах Использование кодов управления вводом-выводом и Коды управления вводом и выводом устройств в документации по Windows SDK.

  • IrpSp->Parameters.DeviceIoControl.OutputBufferLength — это размер буфера в байтах, на который указывает Irp-UserBuffer>.

  • IrpSp->Parameters.DeviceIoControl.Type3InputBuffer — это входной буфер для запросов в режиме ядра, использующих METHOD_NEITHER.

См. также раздел

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (справочник по ядру WDK)

Использование кодов элементов управления ввода-вывода

ZwDeviceIoControlFile