PFLT_INSTANCE_TEARDOWN_CALLBACK回呼函式 (fltkernel.h)
minifilter 驅動程式可以註冊兩個類型 PFLT_INSTANCE_TEARDOWN_CALLBACK 例程作為迷你篩選驅動程式的 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) | 系統發生非預期的內部錯誤。 |
傳回值
沒有
言論
當小型篩選驅動程式透過從其 DriverEntry 例程呼叫 FltRegisterFilter 來註冊自己時,它可以將兩個類型為PFLT_INSTANCE_TEARDOWN_CALLBACK類型的例程註冊為迷你篩選驅動程式的 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程。 若要註冊這些回呼例程, minifilter 驅動程式會在 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback minifilter 驅動程式傳遞的 FLT_REGISTRATION 結構成員中儲存兩個類型PFLT_INSTANCE_TEARDOWN_CALLBACK例程的位址,FltRegisterFilter的 註冊 參數。
InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程是選擇性的,而且可以 NULL。 如果 minifilter 驅動程式為 InstanceTeardownStartCallback 或 InstanceTeardownCompleteCallback 例程指定 NULL,實例仍會中斷。
InstanceTeardownStartCallback 例程會在篩選管理員開始卸除小型篩選驅動程序實例時呼叫,以允許小型篩選驅動程式完成任何畫筆 I/O 作業並儲存狀態資訊。
InstanceTeardownStartCallback 例程必須:
- 呼叫 FltCompletePendedPreOperation,以取得小型篩選驅動程式預先作回呼例程中每個 I/O 作業,以完成作業或將作業的控制傳回給篩選管理員。
- 未畫上任何新的 I/O 作業。 如果迷你篩選驅動程式使用回呼數據佇列,則必須呼叫 FltCbdqDisable 加以停用。
- 針對小型篩選驅動程式後置回呼例程中每個 I/O 作業呼叫 FltCompletePendedPostOperation,以將作業的控制傳回至篩選管理員。
InstanceTeardownStartCallback 例程可以選擇性地執行下列動作,以允許小型篩選驅動程式儘快卸除:
- 關閉任何開啟的檔案。
- 請確定背景工作線程只會執行完成未處理工作專案所需的最小值。
- 呼叫 FltCancelIo,以取消迷你篩選驅動程式所起始的任何 I/O 作業。
- 停止佇列新的工作專案。
一旦呼叫迷你篩選驅動程式的 InstanceTeardownStartCallback 例程之後,不會針對任何新的 I/O 作業呼叫迷你篩選驅動程式的預先作和後續作回呼例程。 不過,針對啟動實例卸除之前啟動的 I/O 作業,可能會呼叫它們。
當卸除程式完成時,會呼叫 InstanceTeardownCompleteCallback 例程,以允許小型篩選驅動程式關閉開啟的檔案,並執行任何其他必要的清除處理。
InstanceTeardownCompleteCallback 例程必須關閉迷你篩選驅動程式開啟的任何檔案。
篩選管理員只會在所有未完成的 I/O 作業完成或清空之後,才呼叫迷你篩選驅動程式的 InstanceTeardownCompleteCallback 例程。
警告
如果下列任一條件成立,則不會呼叫 InstanceTeardownCompleteCallback 例程:
- 有未完成的畫筆 I/O 作業。
- 迷你篩選驅動程式起始的任何未完成 I/O 作業。
如果小型篩選驅動程序實例因為正在卸除小型篩選驅動程式而中斷,卸除作業會顯示為停止回應,直到 InstanceTeardownCompleteCallback 例程傳回為止。 若要對這類問題進行偵錯,您應該在迷你篩選驅動程式上啟用 驅動程式驗證器。 篩選驗證程式 I/O 驗證 選項可協助識別可能的原因,例如未發行的參考,以防止小型篩選驅動程式卸除。 如需詳細資訊,請參閱 Filter Verifier。
請注意,參考實例(藉由呼叫 FltObjectReference),並不會防止呼叫 InstanceTeardownCompleteCallback 例程。
篩選管理員會在 IRQL PASSIVE_LEVEL 呼叫 InstanceTeardownStartCallback 和 InstanceTeardownCompleteCallback 例程。
要求
要求 | 價值 |
---|---|
目標平臺 | 桌面 |
標頭 | fltkernel.h (包括 Fltkernel.h) |
IRQL | 請參閱一節。 |
另請參閱
FltCompletePendedPostOperation