Siklus Hidup Objek

Topik ini menjelaskan "siklus hidup" objek, yaitu bagaimana objek direferensikan dan dilacak oleh manajer objek. Topik ini juga menjelaskan cara membuat objek sementara atau permanen.

Jumlah Referensi Objek

Manajer objek mempertahankan hitungan jumlah referensi ke objek. Saat objek dibuat, manajer objek mengatur jumlah referensi objek menjadi satu. Setelah penghitung itu jatuh ke nol, objek dikosongkan.

Driver harus memastikan bahwa manajer objek memiliki jumlah referensi yang akurat untuk objek apa pun yang mereka manipulasi. Objek yang dilepaskan sebelum waktunya dapat menyebabkan sistem mengalami crash. Objek yang jumlah referensinya salah tinggi tidak akan pernah dikosongkan.

Objek dapat dirujuk baik dengan handel, atau dengan penunjuk. Selain jumlah referensi, manajer objek mempertahankan hitungan jumlah handel terbuka ke objek. Setiap rutinitas yang membuka handel meningkatkan jumlah referensi objek dan jumlah handel objek satu per satu. Setiap panggilan ke rutinitas seperti itu harus dicocokkan dengan panggilan yang sesuai ke ZwClose. Untuk informasi selengkapnya, lihat Penanganan Objek.

Dalam mode kernel, objek dapat direferensikan oleh penunjuk ke objek. Rutinitas yang mengembalikan penunjuk ke objek, seperti IoGetAttachedDeviceReference, meningkatkan jumlah referensi satu per satu. Setelah driver selesai menggunakan pointer, driver harus memanggil ObDereferenceObject untuk mengurangi jumlah referensi satu per satu.

Rutinitas berikut meningkatkan jumlah referensi objek satu per satu:

ExCreateCallback

IoGetAttachedDeviceReference

IoGetDeviceObjectPointer

IoWMIOpenBlock

ObReferenceObject

ObReferenceObjectByHandle

ObReferenceObjectByPointer

Setiap panggilan yang dilakukan ke salah satu rutinitas sebelumnya harus dicocokkan dengan panggilan yang sesuai ke ObDereferenceObject.

Rutinitas ObReferenceObject dan ObReferenceObjectByPointer disediakan sehingga driver dapat meningkatkan jumlah referensi pointer objek yang diketahui satu per satu. ObReferenceObject hanya meningkatkan jumlah referensi. ObReferenceObjectByPointer melakukan pemeriksaan akses sebelum meningkatkan jumlah referensi.

Rutinitas ObReferenceObjectByHandle menerima handel objek dan memasok pointer ke objek yang mendasar. Ini juga meningkatkan jumlah referensi satu per satu.

Objek Sementara dan Permanen

Sebagian besar objek bersifat sementara; mereka ada selama mereka digunakan, dan kemudian mereka dikosongkan oleh manajer objek. Objek dapat dibuat yang permanen. Jika objek permanen, manajer objek itu sendiri memegang referensi ke objek . Dengan demikian, jumlah referensinya tetap lebih besar dari nol, dan objek tidak dikosongkan ketika tidak lagi digunakan.

Objek sementara hanya dapat diakses berdasarkan nama selama jumlah handelnya bukan nol. Setelah pengurangan jumlah handel menjadi nol, nama objek dihapus dari namespace pengelola objek. Objek tersebut masih dapat diakses oleh pointer selama jumlah referensinya tetap lebih besar dari nol. Objek permanen dapat diakses berdasarkan nama selama ada.

Objek dapat dibuat permanen pada saat pembuatannya dengan menentukan atribut OBJ_PERMANENT dalam struktur OBJECT_ATTRIBUTES untuk objek . Untuk informasi selengkapnya, lihat InitializeObjectAttributes.

Untuk membuat objek permanen bersifat sementara, gunakan rutinitas ZwMakeTemporaryObject . Rutinitas ini menyebabkan objek dihapus secara otomatis setelah tidak lagi digunakan. (Jika objek tidak memiliki handel terbuka, nama objek segera dihapus dari namespace pengelola objek. Objek itu sendiri tetap sampai jumlah referensi jatuh ke nol.)