隨插即用登錄常式
隨插即用管理員會將特定登錄機碼與驅動程式、其裝置及其裝置介面實例產生關聯。 驅動程式可以使用這些金鑰來儲存與驅動程式或特定裝置或裝置介面實例相關聯的持續性屬性。
驅動程式絕對不能直接存取這些金鑰。 未來的 Windows 版本可能會將資訊儲存在登錄的不同位置,或完全儲存在登錄外部。 驅動程式不得直接存取下列樹狀結構中的任何金鑰:
HKLM\SYSTEM\CurrentControlSet\Control\Class
HKLM\SYSTEM\CurrentControlSet\Control\DeviceClasses
HKLM\SYSTEM\CurrentControlSet\Enum
HKLM\SYSTEM\CurrentControlSet\Hardware Profiles
相反地,驅動程式會使用 IoOpenDeviceRegistryKey 和 IoOpenDeviceInterfaceRegistryKey 常式來存取其 PnP 金鑰。
PnP 管理員會為驅動程式指派一個金鑰,稱為驅動程式的軟體金鑰,以及每個裝置的金鑰,稱為裝置的硬體金鑰。 IoOpenDeviceRegistryKey常式可用來開啟任一金鑰。 DevInstKeyType參數的值會決定要開啟的索引鍵。 指定PLUGPLAY_REGKEY_DRIVER以開啟軟體金鑰,或PLUGPLAY_REGKEY_DEVICE硬體金鑰。 DeviceObject參數會指定裝置或驅動程式。 (驅動程式也可以透過 ANDing PLUGPLAY_REGKEY_CURRENT_HWPROFILE至 DevInstKeyType.) ,存取其相對於目前硬體設定檔的硬體和軟體金鑰
IoOpenDeviceInterfaceRegistryKey 會開啟與特定裝置介面實例相關聯的金鑰。 實例的名稱會加以識別,這是IoGetDeviceInterfaces、IoGetDeviceInterfaceAlias或IoRegisterDeviceInterface所傳回的UNICODE_STRING。 字串會當做 SymbolicLinkValue 參數傳遞至 IoOpenDeviceInterfaceRegistryKey。
這些索引鍵也可以在 INF 檔案中設定,或使用SetupDiXxx常式。 如需詳細資訊,請參閱 驅動程式的登錄機碼。
IoOpenDeviceRegistryKey和IoOpenDeviceInterfaceRegistryKey都提供開啟的金鑰控制碼,具有DesiredAccess參數所指定的存取權限。 驅動程式接著會使用ZwXxx登錄常式,例如ZwQueryValueKey和ZwSetValueKey,來存取及操作機碼。 在驅動程式不再使用控制碼之後,驅動程式會呼叫 ZwClose來關閉控制碼。 如需詳細資訊,請參閱 使用 Registry-Key 物件的控制碼。
下列程式碼範例示範如何使用 IoOpenDeviceRegistryKey 和 ZwSetValueKey 來設定與裝置硬體金鑰下名為 「Value」 值相關聯的資料。
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.
}
請注意,可以限制登錄機碼的存取權,因此呼叫 IoOpenDeviceRegistryKey 和 IoOpenDeviceInterfaceRegistryKey 應該指定 DesiredAccess所需的最低許可權。 如果驅動程式要求不允許的存取權,任一常式就會傳回STATUS_ACCESS_DENIED。 特別是,驅動程式不應該指定KEY_ALL_ACCESS。