Rutinitas Plug and Play Registri

Manajer Plug and Play mengaitkan kunci registri tertentu dengan driver, perangkatnya, dan instans antarmuka perangkatnya. Driver dapat menggunakan kunci ini untuk menyimpan properti persisten yang terkait dengan driver, atau dengan perangkat atau instans antarmuka perangkat tertentu.

Driver tidak boleh mengakses kunci ini secara langsung. Versi Windows yang akan datang dapat menyimpan informasi di lokasi yang berbeda di registri, atau di luar registri sepenuhnya. Driver tidak boleh langsung mengakses kunci apa pun di pohon berikut:

  • HKLM\SYSTEM\CurrentControlSet\Control\Class

  • HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses

  • HKLM\SYSTEM\CurrentControlSet\Enum

  • HKLM\SYSTEM\CurrentControlSet\Hardware Profiles

Sebagai gantinya, driver menggunakan rutinitas IoOpenDeviceRegistryKey dan IopenDeviceInterfaceRegistryKey untuk mengakses kunci PnP-nya.

Manajer PnP menetapkan satu kunci untuk driver, yang dikenal sebagai kunci perangkat lunak driver, dan kunci untuk setiap perangkat, yang dikenal sebagai kunci perangkat keras perangkat. Rutinitas IoOpenDeviceRegistryKey dapat digunakan untuk membuka salah satu kunci. Nilai parameter DevInstKeyType menentukan kunci mana yang akan dibuka. Tentukan PLUGPLAY_REGKEY_DRIVER untuk membuka kunci perangkat lunak, atau PLUGPLAY_REGKEY_DEVICE ke kunci perangkat keras. Parameter DeviceObject menentukan perangkat atau driver. (Driver juga dapat mengakses kunci perangkat keras dan perangkat lunaknya relatif terhadap profil perangkat keras saat ini, dengan ANDing PLUGPLAY_REGKEY_CURRENT_HWPROFILE ke DevInstKeyType.)

IoOpenDeviceInterfaceRegistryKey membuka kunci yang terkait dengan instans antarmuka perangkat tertentu. Instans diidentifikasi dengan namanya, yang merupakan UNICODE_STRING yang dikembalikan oleh IoGetDeviceInterfaces, IoGetDeviceInterfaceAlias, atau IoRegisterDeviceInterface. String diteruskan sebagai parameter SymbolicLinkValue ke IoOpenDeviceInterfaceRegistryKey.

Kunci ini juga dapat diatur dalam file INF, atau dengan menggunakan rutinitas SetupDiXxx . Untuk informasi selengkapnya, lihat Kunci Registri untuk Driver.

IoOpenDeviceRegistryKey dan IoOpenDeviceInterfaceRegistryKey menyediakan handel kunci terbuka, dengan hak akses seperti yang ditentukan oleh parameter DesiredAccess. Driver kemudian menggunakan rutinitas registri ZwXxx , seperti ZwQueryValueKey dan ZwSetValueKey, untuk mengakses dan memanipulasi kunci. Setelah driver tidak lagi menggunakan handel, driver menutup handel dengan memanggil ZwClose. Untuk informasi selengkapnya, lihat Menggunakan Handel ke Objek Registry-Key.

Sampel kode berikut menunjukkan penggunaan IoOpenDeviceRegistryKey dan ZwSetValueKey untuk mengatur data yang terkait dengan nilai bernama "Nilai" di bawah kunci perangkat keras perangkat.

PDEVICE_OBJECT pDeviceObject; // A pointer to the PDO for the device.
HANDLE handle;
UNICODE_STRING ValueName;
ULONG Value = 109; // This is the value we're setting the key to.
NTSTATUS status;

RtlInitUnicodeString(&ValueName, L"Value");

status = IoOpenDeviceRegistryKey(pDeviceObject, PLUGPLAY_REGKEY_DEVICE, KEY_READ, &handle);

if (NTSUCCESS(status)) {
  status = ZwSetValueKey(handle, ValueName, 0, REG_DWORD, &Value, sizeof(ULONG));
  if (NTSUCCESS(status) {
    ZwClose(handle);
  } else {
    // Handle error.
  }
  // Handle error.
}

Perhatikan bahwa akses ke kunci registri dapat dibatasi, jadi panggilan ke IoOpenDeviceRegistryKey dan IoOpenDeviceInterfaceRegistryKey harus menentukan hak minimum yang diperlukan untuk DesiredAccess. Jika driver meminta hak akses yang tidak diizinkan, salah satu rutinitas mengembalikan STATUS_ACCESS_DENIED. Secara khusus, driver tidak boleh menentukan KEY_ALL_ACCESS.