PFLT_INSTANCE_TEARDOWN_CALLBACK回呼函式 (fltkernel.h)
minifilter 驅動程式可以註冊兩 個類型PFLT_INSTANCE_TEARDOWN_CALLBACK 為 minifilter 驅動程式的 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程的例程。
語法
PFLT_INSTANCE_TEARDOWN_CALLBACK PfltInstanceTeardownCallback;
void PfltInstanceTeardownCallback(
[in] PCFLT_RELATED_OBJECTS FltObjects,
[in] FLT_INSTANCE_TEARDOWN_FLAGS Reason
)
{...}
參數
[in] FltObjects
FLT_RELATED_OBJECTS 結構的指標,其中包含與目前 I/O 作業相關的物件不透明指標。
[in] Reason
旗標,指出迷你篩選驅動程序實例為何正在損毀。 下列其中之一:
旗標 | 意義 |
---|---|
FLTFL_INSTANCE_TEARDOWN_MANUAL (0x00000001) | 實例已中斷連結,因為使用者模式應用程式已呼叫 FilterDetach ,或核心模式元件稱為 FltDetachVolume。 |
FLTFL_INSTANCE_TEARDOWN_FILTER_UNLOAD (0x00000002) | 正在卸除迷你篩選驅動程式。 |
FLTFL_INSTANCE_TEARDOWN_MANDATORY_FILTER_UNLOAD (0x00000004) | 正在卸除迷你篩選驅動程式。 |
FLTFL_INSTANCE_TEARDOWN_VOLUME_DISMOUNT (0x00000008) | 如果設定,則會卸除磁碟區。 (或磁碟區已經卸除。或者磁碟區掛接作業失敗。或者,迷你篩選驅動程序實例或磁碟區正在中斷。或者,文件系統已將本身取消註冊為使用中的文件系統.) |
FLTFL_INSTANCE_TEARDOWN_INTERNAL_ERROR (0x00000010) | 系統發生非預期的內部錯誤。 |
傳回值
無
備註
當 minifilter 驅動程式從其 DriverEntry 例程呼叫 FltRegisterFilter 來註冊本身時,它可以註冊兩個類型為 PFLT_INSTANCE_TEARDOWN_CALLBACK 的例程做為 minifilter 驅動程式的 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程。 若要註冊這些回呼例程,minifilter 驅動程式會將類型為 PFLT_INSTANCE_TEARDOWN_CALLBACK 的兩個例程位址儲存在FLT_REGISTRATION結構之 FLT_REGISTRATION 結構的 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 成員中,迷你篩選驅動程式傳遞為 FltRegisterFilter 的 Registration 參数。
InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程是選擇性的,而且可以是 NULL。 如果 minifilter 驅動程式指定 InstanceTeardownStartCallback 或 InstanceTeardownCompleteCallback 例程的 NULL,實例仍會中斷。
當篩選管理員開始卸除迷你篩選驅動程序實例時,會呼叫 InstanceTeardownStartCallback 例程,以允許迷你篩選驅動程式完成任何畫筆 I/O 作業,並儲存狀態資訊。
InstanceTeardownStartCallback 例程必須:
- 針對迷你篩選驅動程式預先操作回呼例程中每個 I/O 作業呼叫 FltCompletePendedPreOperation ,以完成作業或將作業的控制傳回至篩選管理員。
- 未寫入任何新的 I/O 作業。 如果迷你篩選驅動程式使用回呼數據佇列,則必須呼叫 FltCbdqDisable 來停用它。
- 針對迷你篩選驅動程式的後置回呼例程中每個 I/O 作業呼叫 FltCompletePendedPostOperation ,以將作業的控制傳回至篩選管理員。
InstanceTeardownStartCallback 例程可以選擇性地執行下列動作,以允許迷你篩選驅動程式儘快卸除:
- 關閉任何已開啟的檔案。
- 請確定背景工作線程只會執行完成未完成工作項目處理所需的最低需求。
- 呼叫 FltCancelIo 以取消迷你篩選驅動程式起始的任何 I/O 作業。
- 停止佇列新的工作專案。
一旦呼叫 minifilter 驅動程式的 InstanceTeardownStartCallback 例程,就不會針對任何新的 I/O 作業呼叫迷你篩選驅動程式的預先操作和後置回呼例程。 不過,系統可能會針對在起始實例終止之前啟動的 I/O 作業呼叫它們。
當終止程式完成時,會呼叫 InstanceTeardownCompleteCallback 例程,以允許迷你篩選驅動程式關閉開啟的檔案,並執行任何其他必要的清除處理。
InstanceTeardownCompleteCallback 例程必須關閉迷你篩選驅動程式所開啟的任何檔案。
篩選管理員只會在完成或清空所有未完成的 I/O 作業之後,呼叫 minifilter 驅動程式的 InstanceTeardownCompleteCallback 例程。
警告
如果下列任一條件成立,則不會呼叫 InstanceTeardownCompleteCallback 例程:
- 有未處理的畫筆 I/O 作業。
- 迷你篩選驅動程式起始的任何未完成 I/O 作業。
如果迷你篩選驅動程序實例因為正在卸除迷你篩選驅動程式而中斷,卸除作業就會停止回應,直到 InstanceTeardownCompleteCallback 例程傳回為止。 若要對這類問題進行偵錯,您應該在迷你篩選器驅動程式上啟用 驅動程式驗證程式 。 [篩選驗證器 I/O 驗證 ] 選項可協助識別可能的原因,例如未發行的參考,以防止迷你篩選驅動程式卸除。 如需詳細資訊,請參閱 篩選驗證器。
請注意,藉由呼叫 FltObjectReference) 參考 (實例不會防止呼叫 InstanceTeardownCompleteCallback 例程。
篩選管理員會在 IRQL PASSIVE_LEVEL呼叫 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程。
規格需求
需求 | 值 |
---|---|
目標平台 | 桌面 |
標頭 | fltkernel.h (包含 Fltkernel.h) |
IRQL | 請參閱一節。 |
另請參閱
FltCompletePendedPostOperation