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

При отправке

Диспетчер ввода-вывода отправляет запрос IRP_MJ_CLOSE, чтобы указать, что количество ссылок в объекте файла достигло нуля, как правило, потому, что драйвер файловой системы или другой компонент режима ядра вызвал ObDereferenceObject в объекте файла. Обычно этот запрос следует за запросом на очистку. Однако запрос на закрытие может быть получен не сразу после запроса на очистку.

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

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

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

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

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

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

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

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

Параметры

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

  • DeviceObject

    Указатель на объект целевого устройства.

  • Флаги Irp>

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

    • IRP_CLOSE_OPERATION
    • IRP_SYNCHRONOUS_API
  • Irp-IoStatus>

    Указатель на структуру IO_STATUS_BLOCK , которая получает окончательное состояние завершения и сведения о запрошенной операции.

  • Irp-FileObject>

    Указатель на объект файла, связанный с DeviceObject.

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

  • Irp-MajorFunction>

    Задает IRP_MJ_CLOSE.

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

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

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

IRP_MJ_CLEANUP

IRP_MJ_CREATE

ObDereferenceObject