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要求向下傳遞至文件系統驅動程式,而檔系統驅動程式會以狀態STATUS_SUCCESS完成IRP_MJ_CREATE要求。
在篩選驅動程式完成建立要求之前,它會判斷檔案必須關閉。
篩選驅動程式會使用 IoCancelFileOpen 來關閉檔系統驅動程式開啟的檔案。
呼叫 IoCancelFileOpen之後,篩選驅動程式應該會以適當的錯誤碼來完成建立要求,例如STATUS_UNSUCCESSFUL或STATUS_ACCESS_DENIED。 此外,它應該將 [Irp->IoStatus.Information] 字段設定為零。
IoCancelFileOpen 必須先呼叫,才能為檔案建立任何句柄。 呼叫端可以檢查 旗標FILE_OBJECT 結構的成員,FileObject 參數所指向。 如果已設定FO_HANDLE_CREATED旗標,這表示已為檔案建立一或多個句柄,因此無法安全地呼叫ioCancelFileOpen 。
IoCancelFileOpen 會在 fileObject 指向 FileObject 之檔案物件的 Flags 成員中設定FO_FILE_OPEN_CANCELLED旗標。 此旗標表示已取消IRP_MJ_CREATE要求,而且會為此檔案對象發出IRP_MJ_CLOSE要求。 一旦取消建立作業之後,就無法重新發出 ,也就是說,如果舊版篩選驅動程式已呼叫 IoCreateFileOpen 例程,就無法傳回STATUS_REPARSE。
迷你篩選工具應該使用 FltCancelFileOpen,而不是 IoCancelFileOpen。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | 此例程可在 Windows 2000 和更新版本Microsoft取得。 |
目標平臺 | 普遍 |
標頭 | ntddk.h (包括 Ntddk.h、Ntifs.h、Fltkernel.h) |
連結庫 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |