IRP_MJ_CREATE (фильтры FS и FS)

При отправке

Диспетчер ввода-вывода отправляет запрос IRP_MJ_CREATE в следующих случаях:

  • Создается новый файл или каталог.
  • Открывается существующий файл, устройство, каталог или том.

Обычно этот IRP отправляется от имени приложения пользовательского режима, которое вызывало функцию Microsoft Win32, например CreateFile , или от имени компонента режима ядра, который вызвал функцию, например IoCreateFile, IoCreateFileSpecifyDeviceObjectHint, ZwCreateFile или ZwOpenFile.

Если запрос на создание выполнен успешно, приложение или компонент режима ядра получает дескриптор объекта файла.

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

Если целевой объект устройства является объектом управляющего устройства файловой системы, подпрограмма диспетчеризации драйвера файловой системы должна завершить IRP и вернуть соответствующее значение NTSTATUS после установки соответствующих значений Irp-IoStatus.Status> и Irp-IoStatus.Information>.

В противном случае драйвер файловой системы должен обработать запрос на создание.

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

Если целевой объект устройства является объектом управляющего устройства драйвера фильтра, подпрограмма диспетчеризации драйвера фильтра должна завершить IRP и вернуть соответствующее значение NTSTATUS после установки соответствующих значенийIrp-IoStatus.Status> и Irp-IoStatus.Information>.

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

Как правило, драйверы фильтров не должны возвращать STATUS_PENDING в ответ на IRP_MJ_CREATE. Однако если драйвер более низкого уровня возвращает STATUS_PENDING, драйвер фильтра должен передать это значение состояния в цепочку драйверов.

Модули записи драйверов фильтров файловой системы должны отметить, что IoCreateStreamFileObject вызывает отправку запроса IRP_MJ_CLEANUP в стек драйверов файловой системы для тома. Так как файловые системы часто создают объекты потоковых файлов в качестве побочных эффектов операций, отличных от IRP_MJ_CREATE, драйверам фильтров сложно надежно обнаружить создание объекта файла потока. Таким образом, драйвер фильтра должен получать IRP_MJ_CLEANUP и IRP_MJ_CLOSE запросы для ранее невиденных файловых объектов. Для IoCreateStreamFileObjectLiteзапрос IRP_MJ_CLEANUP не отправляется.

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

Параметры

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

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

  • Irp->AssociatedIrp.SystemBuffer указывает на FILE_FULL_EA_INFORMATION структурированный буфер, если объект file представляет файл с расширенными атрибутами. В противном случае этому элементу присваивается значение NULL.

  • Irp->Для этого запроса для флагов заданы следующие флаги:

    • IRP_CREATE_OPERATION
    • IRP_DEFER_IO_COMPLETION
    • IRP_SYNCHRONOUS_API
  • Irp->RequestorMode указывает режим выполнения процесса, который запросил операцию, либо KernelMode , либо UserMode. Если установлен флаг SL_FORCE_ACCESS_CHECK, необходимо выполнить проверку доступа, даже если Irp-RequestorMode> имеет значение KernelMode.

  • Irp->IoStatus указывает на структуру IO_STATUS_BLOCK , которая получает окончательное состояние завершения и сведения о запрошенной операции. Файловая система задает элементу Information этой структуры одно из следующих значений:

    • FILE_CREATED
    • FILE_DOES_NOT_EXIST
    • FILE_EXISTS
    • FILE_OPENED
    • FILE_OVERWRITTEN
    • FILE_SUPERSEDED
  • Irp->Overlay.AllocationSize — это начальный размер выделения файла в байтах. Ненулевое значение не действует, если файл не создается, не перезаписывается или не заменяется.

  • IrpSp->FileObject указывает на файловый объект, созданный диспетчером ввода-вывода для представления создаваемого или открываемого файла. Когда файловая система обрабатывает запрос IRP_MJ_CREATE, она задает для полей FsContext и, возможно, FsContext2 в этом объекте файла значения, относящиеся к файловой системе. Таким образом, значения полей FsContext и FsContext2 нельзя считать допустимыми до тех пор, пока файловая система не обработает запрос на создание. Дополнительные сведения см. в разделах Файловые потоки, Контексты потоков и контексты Per-Stream.

    FltCancelFileOpen и IoCancelFileOpen устанавливают флаг FO_FILE_OPEN_CANCELLED в поле Флаги объекта файла. Установка этого флага означает, что запрос IRP_MJ_CREATE был отменен, и для этого объекта файла будет выдан запрос IRP_MJ_CLOSE . После отмены запроса на создание его нельзя будет повторно выпросить.

    Параметр IrpSp-FileObject> содержит указатель на поле RelatedFileObject, которое также является FILE_OBJECT структурой. Поле RelatedFileObject структуры FILE_OBJECT используется для указания того, что данный файл открыт относительно уже открытого объекта файла. Обычно это означает, что относительный файл является каталогом, но файлы на основе потока могут быть открыты относительно уже существующего потока файла. Поле RelatedFileObject структуры FILE_OBJECT допустимо только во время обработки IRP_MJ_CREATE.

  • IrpSp->Для флагов можно задать одно или несколько из следующих значений:

    Flag Значение
    SL_FORCE_ACCESS_CHECK 0x01 Если этот флаг установлен, проверка доступа должна выполняться, даже если значение IRP-RequestorMode> равно KernelMode.
    SL_OPEN_PAGING_FILE 0x02 Если этот флаг установлен, файл является файлом подкачки.
    SL_OPEN_TARGET_DIRECTORY 0x04 Если этот флаг установлен, необходимо открыть родительский каталог файла.
    SL_STOP_ON_SYMLINK 0x08 Если этот флаг установлен, автоматический обход связей и символических ссылок диспетчера ввода-вывода подавляется, что приводит к открытию соединений и символических ссылок для возврата STATUS_REPARSE.
    SL_IGNORE_READONLY_ATTRIBUTE 0x40 Если этот флаг установлен, он позволяет создать файл только для чтения с параметром FILE_DELETE_ON_CLOSE. Этот параметр приводит к удалению файла при закрытии дескриптора.
    SL_CASE_SENSITIVE 0x80 Если этот параметр задан, в сравнении имен файлов должен учитываться регистр.
  • IrpSp->MajorFunction имеет значение IRP_MJ_CREATE.

  • IrpSp->Parameters.Create.EaLength — это размер буфера в байтах в Irp-AssociatedIrp.SystemBuffer>. Если значение Irp*->AssociatedIrp.SystemBuffer равно NULL, этот элемент должен быть равен нулю.

  • IrpSp->Parameters.Create.FileAttributes — это битовая маска флагов атрибутов, применяемая при создании или открытии файла. Явно указанные атрибуты применяются только при создании, замене или перезаписи файла. По умолчанию это значение равно FILE_ATTRIBUTE_NORMAL, которое может переопределить любой другой флаг или сочетание совместимых флагов OR. Этот элемент соответствует параметру FileAttributesдля IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.Options — это битовая маска флагов, которая задает параметры, применяемые при создании или открытии файла, а также действие, которое необходимо выполнить, если файл уже существует.

    Высокие 8 бит этого параметра соответствуют параметру Disposition для IoCreateFileSpecifyDeviceObjectHint.

    Низкие 24 бита этого элемента соответствуют параметру CreateOptions для IoCreateFileSpecifyDeviceObjectHint. Драйверы фильтра файловой системы и минифильтра, выполняющие сканирование файлов (например, антивирусные программы), должны уделять особое внимание флагу FILE_COMPLETE_IF_OPLOCKED. Если этот флаг установлен, фильтр не должен блокировать или иным образом задерживать операцию IRP_MJ_CREATE.

    Если флаг FILE_COMPLETE_IF_OPLOCKED установлен в пути предварительного создания (создания диспетчеризации), фильтр не должен инициировать следующие типы операций, так как они могут привести к прерыванию блокировки:

    • IRP_MJ_CLEANUP
    • IRP_MJ_CREATE
    • IRP_MJ_FILE_SYSTEM_CONTROL
    • IRP_MJ_FLUSH_BUFFERS
    • IRP_MJ_LOCK_CONTROL
    • IRP_MJ_READ
    • IRP_MJ_SET_INFORMATION
    • IRP_MJ_WRITE

    Если фильтр или мини-фильтр не может учитывать флаг FILE_COMPLETE_IF_OPLOCKED, он должен завершить запрос IRP_MJ_CREATE с STATUS_SHARING_VIOLATION.

    Если флаг FILE_COMPLETE_IF_OPLOCKED задан в пути завершения (после создания), фильтр должен проверка, задано ли в файловой системе значение состояния STATUS_OPLOCK_BREAK_IN_PROGRESS для Irp-IoStatus.Status>. Если это значение состояния не задано, фильтр может инициировать одну из указанных выше операций с файлом. Если это значение состояния задано, операция блокировки еще не сработала, и фильтр не должен инициировать какие-либо операции, которые могут привести к разрыву блокировки. Таким образом, фильтр должен отложить все указанные выше операции с файлом до тех пор, пока не будет выполняться одно из следующих условий:

    • Владелец oplock отправляет запрос FSCTL_OPLOCK_BREAK_ACKNOWLEDGE в файловую систему.
    • Системный компонент, отличный от фильтра или минифильтра, отправляет файловой системе запрос ввода-вывода, который должен ждать завершения разрыва блокировки (например, IRP_MJ_READ или IRP_MJ_WRITE). Фильтр или минифильтр может инициировать одну из описанных выше операций из процедуры диспетчеризации (или обратного вызова перед операцией) для этой новой операции, так как подпрограмма обратного вызова диспетчеризации или перед операцией переводится в состояние ожидания, пока не завершится прерывание блокировки.
  • *IrpSp->Parameters.Create.SecurityContext-AccessState> указывает на ACCESS_STATE структуру, содержащую контекст субъекта объекта, предоставленные типы доступа и оставшиеся желаемые типы доступа.

  • IrpSp->Parameters.Create.SecurityContext-DesiredAccess> — это структура ACCESS_MASK, указывающая права доступа, запрашиваемые для файла. Дополнительные сведения см. в описании параметра DesiredAccess для IoCreateFileSpecifyDeviceObjectHint.

  • IrpSp->Parameters.Create.ShareAccess — это битовая маска прав доступа к общей папке, запрошенных для файла. Если этот член равен нулю, запрашивается монопольный доступ. Дополнительные сведения см. в описании параметра ShareAccess для IoCreateFileSpecifyDeviceObjectHint.

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

ACCESS_MASK

ACCESS_STATE

FILE_FULL_EA_INFORMATION

FltCancelFileOpen

FltReissueSynchronousIo

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCancelFileOpen

IoCheckEaBufferValidity

IoCreateFile

IoCreateFileSpecifyDeviceObjectHint

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_CLEANUP

IRP_MJ_CLOSE

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

ZwCreateFile

ZwOpenFile