物件的生命週期
本主題描述物件的「生命週期」,也就是物件管理員如何參考和追蹤物件。 本主題也說明如何讓物件成為暫時或永久的。
物件參考計數
物件管理員會維護物件參考數目的計數。 建立物件時,物件管理員會將物件的參考計數設定為一。 一旦該計數器落為零,就會釋放物件。
驅動程式必須確定物件管理員對於所操作的任何物件都有精確的參考計數。 提前釋放的物件可能會導致系統當機。 參考計數錯誤高的物件永遠不會釋放。
物件可以透過控制碼或指標來參考。 除了參考計數之外,物件管理員還會維護物件開啟控制碼數目的計數。 開啟控制碼的每個常式都會將物件參考計數和物件控制碼計數增加一個。 對這類常式的每個呼叫都必須與 對 ZwClose的對應呼叫進行比對。 如需詳細資訊,請參閱 物件控制碼。
在核心模式中,物件的指標可以參考物件。 傳回物件指標的常式,例如 IoGetAttachedDeviceReference,將參考計數增加一個。 使用指標完成驅動程式之後,它必須呼叫 ObDereferenceObject ,以將參考計數減少一個。
下列常式會將物件的參考計數增加一個:
對上述任何常式所做的每個呼叫都必須與對 ObDereferenceObject的對應呼叫進行比對。
會提供 ObReferenceObject 和 ObReferenceObjectByPointer 常式,讓驅動程式可以增加已知物件指標的參考計數。 ObReferenceObject 只會增加參考計數。 ObReferenceObjectByPointer 會先進行存取檢查,再增加參考計數。
ObReferenceObjectByHandle常式會接收物件控制碼,並提供基礎物件的指標。 它也會增加一個參考計數。
暫存和永久物件
大部分的物件都是 暫時的;只要它們正在使用中,就會存在,然後由物件管理員釋放它們。 可以建立 永久的物件。 如果物件是永久的,物件管理員本身會保存物件的參考。 因此,它的參考計數會維持在零以上,而且當物件不再使用時,就不會釋出物件。
只要暫存物件的控制碼計數為非零,才能依名稱存取。 一旦控制碼計數遞減為零,物件的名稱就會從物件管理員的命名空間中移除。 只要這些物件的參考計數維持在零以上,就可以由指標存取。 只要永久物件存在,就可以依名稱存取。
物件建立時可以藉由在 物件的 OBJECT_ATTRIBUTES 結構中指定OBJ_PERMANENT屬性,讓物件成為永久的。 如需詳細資訊,請參閱 InitializeObjectAttributes。
若要暫存永久物件,請使用 ZwMakeTemporaryObject 常式。 此常式會導致物件在不再使用後自動刪除。 (如果物件沒有開啟的控制碼,就會立即從物件管理員的命名空間中移除物件的名稱。物件本身會維持不變,直到參考計數降到零為止。)