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