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