Bagikan melalui


Pegangan Objek

Driver dan komponen mode pengguna mengakses sebagian besar objek yang ditentukan sistem melalui menangani. Handle diwakili oleh tipe data non-transparan HANDLE. (Perhatikan bahwa handel tidak digunakan untuk mengakses objek perangkat atau objek driver.)

Untuk sebagian besar jenis objek, rutin kernel mode yang membuat atau membuka objek menyediakan handle ke pemanggil. Pemanggil kemudian menggunakan handle tersebut dalam operasi berikutnya pada objek dimaksud.

Berikut adalah daftar jenis objek yang biasanya digunakan oleh driver, dan rutinitas yang menyediakan handle ke objek dari jenis tersebut.

Jenis objek Prosedur pembuatan/pembukaan yang sesuai

Arsip

IoCreateFile, ZwCreateFile, ZwOpenFile

Kunci registri

IoOpenDeviceInterfaceRegistryKey, IoOpenDeviceRegistryKey, ZwCreateKey, ZwOpenKey

Utsan

PsCreateSystemThread

Peristiwa

IoCreateSynchronizationEvent, IoCreateNotificationEvent

Link simbolik

ZwOpenSymbolicLinkObject

Objek direktori

ZwCreateDirectoryObject

Objek bagian

ZwOpenSection

Ketika driver tidak lagi memerlukan akses ke objek, driver memanggil ZwClose rutin untuk menutup handel. Ini berfungsi untuk semua jenis objek yang tercantum dalam tabel di atas.

Sebagian besar rutinitas yang menyediakan handle mengambil struktur OBJECT_ATTRIBUTES sebagai parameter. Struktur ini dapat digunakan untuk menentukan atribut untuk handle.

Driver dapat menentukan atribut handle berikut:

  • OBJ_KERNEL_HANDLE

    Handel hanya dapat diakses dari mode kernel.

  • OBJ_INHERIT

    Setiap anak dari proses saat ini menerima salinan handel saat dibuat.

  • OBJ_FORCE_ACCESS_CHECK

    Atribut ini menentukan bahwa sistem melakukan semua pemeriksaan akses pada pegangan. Secara default, sistem langsung melewati semua pemeriksaan akses pada objek handle yang dibuat dalam mode kernel.

Gunakan rutinitas InitializeObjectAttributes untuk mengatur atribut ini dalam struktur OBJECT_ATTRIBUTES.

Untuk informasi tentang memvalidasi penanganan objek, lihat Kegagalan Memvalidasi Penanganan Objek .

Pegangan Objek Pribadi

Setiap kali driver membuat handel objek untuk penggunaan privatnya, driver harus menentukan atribut OBJ_KERNEL_HANDLE. Ini memastikan bahwa pegangan tidak dapat diakses oleh aplikasi dalam mode pengguna.

Penanganan Objek Bersama

Driver yang berbagi handel objek antara mode kernel dan mode pengguna harus ditulis dengan hati-hati untuk menghindari pembuatan lubang keamanan secara tidak sengaja. Berikut adalah beberapa panduan:

  1. Buat pengendali dalam mode kernel dan alihkan ke mode pengguna, bukan sebaliknya. Handle yang dibuat oleh komponen moda pengguna dan diteruskan ke driver tidak boleh dipercaya.

  2. Jika driver harus memanipulasi handle atas nama aplikasi mode pengguna, gunakan atribut OBJ_FORCE_ACCESS_CHECK untuk memverifikasi bahwa aplikasi memiliki akses yang diperlukan.

  3. Gunakan ObReferenceObjectByPointer untuk menyimpan referensi mode kernel pada handel bersama. Jika tidak, maka jika komponen mode pengguna menutup handel, jumlah referensi menjadi nol, dan jika driver kemudian mencoba menggunakan atau menutup handel, maka sistem akan gagal.

Jika aplikasi mode pengguna membuat objek acara, driver dapat dengan aman menunggu acara tersebut disinyalir, tetapi hanya jika aplikasi meneruskan handle ke objek acara ke driver melalui IOCTL. Driver harus menangani IOCTL dalam konteks proses yang membuat peristiwa dan harus memvalidasi bahwa handel adalah handel peristiwa dengan memanggil ObReferenceObjectByHandle.