Framework 物件生命週期
架構物件的「生命週期」會跨越物件建立到刪除物件的時間。 刪除物件的參考計數控制項。
建立 Framework 物件
大部分的架構物件都是由驅動程式呼叫物件的建立方法所建立。 例如,每個架構驅動程式都必須呼叫 WdfDriverCreate 來建立架構驅動程式物件。
架構會建立其他架構物件。 例如,當使用者應用程式開啟裝置以進行讀取或寫入作業時,架構會建立架構檔案物件,並將它傳遞至驅動程式的 EvtDeviceFileCreate 回呼函式。
架構或驅動程式可以建立一些架構物件。 例如,當 I/O 管理員將 I/O 要求傳遞給驅動程式時,架構會建立架構要求物件,並將它傳遞至驅動程式,通常是藉由呼叫其中一個驅動程式的要求處理常式。 驅動程式也可以建立架構要求物件,並將其傳遞給其他驅動程式。
使用參考計數
架構會維護每個物件的參考計數。 建立物件時,架構會將其參考計數設定為一個。 如果參考計數變成零,架構會刪除 物件。
驅動程式可以藉由呼叫 WdfObjectReference 來遞增參考計數或 WdfObjectDereference 來遞減參考計數來修改物件的參考計數。 (驅動程式只有在先前稱為WdfObjectReference.) 時,才能呼叫WdfObjectDereference
在大部分情況下,驅動程式不需要遞增或遞減物件的參考計數。 架構會在將物件的控制碼傳遞至驅動程式之前遞增計數,並在驅動程式不再需要物件時遞減計數。
驅動程式會呼叫 WdfObjectReference ,以確保在驅動程式完成使用之前,架構或驅動程式執行緒) 不會 (刪除物件。 如需驅動程式應該呼叫 WdfObjectReference 和 WdfObjectDereference的範例情況,請參閱 同步處理已傳送要求的取消。
刪除 Framework 物件
物件會因為驅動程式呼叫 WdfObjectDelete 或架構呼叫內部刪除常式而遭到刪除,但只有在物件的參考計數為零時才會刪除。 在驅動程式或架構嘗試刪除物件之後,物件的控制碼會維持有效狀態,直到參考計數變成零為止。 驅動程式 無法 藉由呼叫 WdfObjectDereference 將物件的參考計數遞減至零,驅動程式也必須呼叫 WdfObjectDelete來刪除物件。
如果 Framework 物件是父系的子物件,而且正在刪除父系,則架構會先嘗試刪除子物件,再刪除父物件。 物件刪除從最遠的父物件開始,並將物件階層處理到根目錄。
驅動程式可以在驅動程式或架構刪除物件時,註冊下列兩個架構所呼叫的回呼函式:
EvtCleanupCallback 回呼函式,此函式會呼叫此函式,讓驅動程式可以呼叫WdfObjectDereference,如果先前已針對要刪除的物件呼叫WdfObjectReference。
EvtDestroyCallback 回呼函式,此函式會在物件的參考計數減去為零之後呼叫。
其中一個回呼函式必須解除配置驅動程式在建立物件時配置的任何特定物件資源。
架構一律會處理某些架構物件的刪除,而驅動程式不得嘗試刪除這些物件。 如需驅動程式無法刪除的架構物件清單,請參閱 WdfObjectDelete。