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

При отправке

Получение запроса IRP_MJ_CLEANUP указывает, что количество ссылок на дескриптор в объекте файла достигло нуля. (Другими словами, все дескрипторы объекта файла были закрыты.) Часто он отправляется, когда приложение в пользовательском режиме вызывает функцию Win32 CloseHandle (или когда драйвер режима ядра называется ZwClose) для последнего выдающегося дескриптора для объекта файла.

Важно отметить, что объект file может по-прежнему использоваться, если все дескрипторы для объекта файла были закрыты. Системные компоненты, такие как диспетчер кэша и диспетчер памяти, могут содержать невыполненные ссылки на файловый объект. Эти компоненты по-прежнему могут выполнять чтение или запись из файла даже после получения запроса IRP_MJ_CLEANUP.

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

Если целевой объект устройства является объектом управляющего устройства файловой системы, драйвер файловой системы должен завершить 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_CLEANUP.

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

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateStreamFileObject

IoCreateStreamFileObjectLite

IoGetCurrentIrpStackLocation

IRP

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

IRP_MJ_CLOSE

IRP_MJ_CREATE

ZwClose