Функция IoCancelFileOpen (ntddk.h)
Подпрограмма IoCancelFileOpen может использоваться драйвером фильтра файловой системы для закрытия файла, который был открыт драйвером файловой системы в стеке устройств драйвера фильтра.
Синтаксис
void IoCancelFileOpen(
[in] PDEVICE_OBJECT DeviceObject,
[in] PFILE_OBJECT FileObject
);
Параметры
[in] DeviceObject
Указатель на верхнюю часть стека устройств сразу под объектом устройства драйвера фильтра.
[in] FileObject
Указатель на объект файла для закрытия файла.
Возвращаемое значение
Никакой
Замечания
Если драйвер фильтра файловой системы определяет, что запрос на создание файлов или файлов должен завершиться сбоем после того, как драйверы нижнего уровня уже завершили запрос с STATUS_SUCCESS, он может использовать IoCancelFileOpen, чтобы закрыть файл, открытый драйверами нижнего уровня.
Хотя STATUS_REPARSE является значением NTSTATUS успешно, не нужно вызывать IoCancelFileOpen для операции создания, завершенной с STATUS_REPARSE, так как это значение состояния указывает на то, что файл не был успешно открыт.
Успешный вызов IoCancelFileOpen имеет следующий эффект: для минифильтров и устаревших фильтров, которые выше вызывающего объекта в стеке файловой системы, запрос на создание, как представляется, завершился сбоем. Для тех, кто ниже вызывающего объекта, файл, как представляется, был открыт (или создан), а затем закрыт.
Обратите внимание, что IoCancelFileOpen не отменяет никаких изменений в файле. Например, IoCancelFileOpen не удаляет только что созданный файл или восстанавливает файл, который был перезаписан или заменен на предыдущее состояние.
Типичный пример выглядит следующим образом:
Драйвер фильтра существует между драйвером фильтра более высокого уровня и драйвером файловой системы нижнего уровня.
Драйвер фильтра передает запрос IRP_MJ_CREATE вниз по стеку устройств драйверу файловой системы, а драйвер файловой системы завершает запрос IRP_MJ_CREATE с состоянием STATUS_SUCCESS.
Прежде чем драйвер фильтра завершит запрос на создание, он определяет, что файл должен быть закрыт.
Драйвер фильтра использует IoCancelFileOpen, чтобы закрыть файл, открытый драйвером файловой системы.
После вызова IoCancelFileOpenдрайвер фильтра должен завершить запрос на создание с соответствующим кодом ошибки, например STATUS_UNSUCCESSFUL или STATUS_ACCESS_DENIED. Кроме того, оно должно задать для поля Irp->IoStatus.Information значение нулю.
IoCancelFileOpen необходимо вызвать перед созданием всех дескрипторов для файла. Вызывающие элементы могут проверить элемент флагов структуры FILE_OBJECTFileObject. Если установлен флаг FO_HANDLE_CREATED, это означает, что для файла был создан один или несколько дескрипторов, поэтому небезопасно вызывать IoCancelFileOpen.
IoCancelFileOpen задает флаг FO_FILE_OPEN_CANCELLED в элементе флагов флагов элемента объекта файла, на который FileObject. Этот флаг указывает, что запрос IRP_MJ_CREATE отменен, а запрос IRP_MJ_CLOSE будет выдан для этого объекта файла. После отмены операции создания ее невозможно перезапустить, то есть STATUS_REPARSE невозможно вернуть устаревшим драйвером фильтра, если он вызвал подпрограмму IoCreateFileOp en.
Минифильтры должны использовать FltCancelFileOpen вместо IoCancelFileOpen.
Требования
Требование | Ценность |
---|---|
минимальные поддерживаемые клиентские | Эта подпрограмма доступна в Microsoft Windows 2000 и более поздних версиях. |
целевая платформа | Всеобщий |
заголовка | ntddk.h (include Ntddk.h, Ntifs.h, Fltkernel.h) |
библиотеки | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |