共用方式為


FltCancelFileOpen 函式 (fltkernel.h)

小型篩選驅動程式可以使用 FltCancelFileOpen 例程來關閉新開啟或建立的檔案。

語法

VOID FLTAPI FltCancelFileOpen(
  [in] PFLT_INSTANCE Instance,
  [in] PFILE_OBJECT  FileObject
);

參數

[in] Instance

呼叫端的不透明實例指標。 這是必要參數,而且無法 NULL

[in] FileObject

檔案的檔案對象指標。 這是必要參數,而且無法 NULL

傳回值

沒有

言論

如果迷你篩選驅動程式判斷檔案開啟或檔案建立 (IRP_MJ_CREATE) 作業必須在文件系統完成作業且成功 NTSTATUS 值,例如 STATUS_SUCCESS 之後,小型篩選驅動程式可以從其建立後回呼例程呼叫 FltCancelFileOpen,以關閉檔案。

注意 雖然 STATUS_REPARSE 是成功的NTSTATUS值,但不需要呼叫 FltCancelFileOpen STATUS_REPARSE,因為此狀態值表示檔案未成功開啟。
 
成功呼叫 FltCancelFileOpen 有下列效果:小型篩選驅動程式和小型篩選驅動程序實例堆疊中呼叫端上方的舊版篩選,建立要求似乎失敗。 針對呼叫端下方的檔案,檔案似乎已開啟(或已建立),然後關閉。

請注意,FltCancelFileOpen 不會復原檔案的任何修改。 例如,FltCancelFileOpen 不會刪除新建立的檔案,也不會還原覆寫或取代至其先前狀態的檔案。

FltCancelFileOpen 必須先呼叫,才能為檔案建立任何句柄。 呼叫端可以檢查 旗標FILE_OBJECT 結構的成員,FileObject 參數所指向。 如果已設定FO_HANDLE_CREATED旗標,這表示已為檔案建立一或多個句柄,因此呼叫 FltCancelFileOpen並不安全。

FltCancelFileOpen 會設定 FileObject 指向之檔案物件的 Flags 成員中的FO_FILE_OPEN_CANCELLED旗標。 此旗標表示已取消建立作業,而且會針對這個檔案對象發出關閉 (IRP_MJ_CLOSE) 要求。

一旦取消建立作業,就無法重新發出。 如需詳細資訊,請參閱 FltReissueSynchronousIo

FltCancelFileOpen 只能從小型篩選驅動程式的建立後回呼例程呼叫。 從任何其他 I/O 作業類型的後置回呼 (PFLT_POST_OPERATION_CALLBACK) 例程呼叫 FltCancelFileOpen,或從預先作回呼 (PFLT_PRE_OPERATION_CALLBACK) 例程呼叫它,是程式設計錯誤。

FltCancelFileOpen 的呼叫端必須在 IRQL PASSIVE_LEVEL執行。 不過,小型篩選驅動程式可以從建立後回呼例程呼叫此例程是安全的,因為建立後回呼例程一定會在 IRQL PASSIVE_LEVEL 呼叫,因為源自IRP_MJ_CREATE要求的線程內容中,一定會呼叫後續建立回呼例程。

要求

要求 價值
目標平臺 普遍
標頭 fltkernel.h (包括 Fltkernel.h)
連結庫 FltMgr.lib
DLL Fltmgr.sys
IRQL PASSIVE_LEVEL (請參閱一節)

另請參閱

FILE_OBJECT

FLT_CALLBACK_DATA

FLT_IS_REISSUED_IO

IRP_MJ_CREATE FLT_PARAMETERS

FltReissueSynchronousIo

FltSetCallbackDataDirty

IRP_MJ_CLOSE

IRP_MJ_CREATE

IoCancelFileOpen

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK