????????在驅動程序的開發中,經常會用到對注冊表的操作。與Win32的API不同,DDK提供另外一套對注冊表操作的相關函數。首先明確一下注冊表里的幾個概念,避免在后面混淆。
圖1 注冊表概念
有5個概念需要重申一下:
* 注冊表項: 注冊表中的一個項目,類似目錄的概念。每個項中存儲多個二元結構,鍵名-鍵值。每個項中,可以有若干個子項。
* 注冊表子項:類似于目錄中的子目錄。
* 鍵名:通過鍵名可以尋找到相應的鍵值。
* 鍵值類別:每個鍵值存儲的時候有不同的類別,可以是整型、字符串等數據。
* 鍵值:鍵名下對應存儲的數據。
創建關閉注冊表
和文件操作類似,對注冊表操作首先要獲取一個注冊表句柄。對注冊表的操作都需要根據這個句柄進行操作。可以通過 ZwCreateKey 函數獲得打開的注冊表句柄。這個函數打開注冊表后,并返回一個操作句柄。其函數聲明如下:
NTSTATUS ZwCreateKey(OUT PHANDLE KeyHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes,IN ULONG TitleIndex,IN PUNICODE_STRING Class,IN ULONG CreateOptions,OUT PULONG Disposition);
// KeyHandle: 獲得的注冊表句柄
// DesiredAccess:訪問權限,一般設置為 KEY_ALL_ACCESS
// ObjectAttributes: OBJECT_ATTRIBUTES 數據結構
// TitleIndex: 很少用到,一般設置為0
// Class: 很少用到,一般設置為NULL
// CreateOptions:創建時的選項,一般設置為REG_OPTION_NON_VOLATILE.
// Disposition: 返回是創建成功,還是打開成功,返回值是REG_CREATED_NEW_KEY 或者是REG_OPENED_EXISTING_KEY.
// 返回值: 返回是否創建成功
如果ZwCreateKey指定的項目部存在,則直接創建這個項目,并利用Disposition參數返回 REG_CREATED_NEW_KEY。如果該項目已經存在了, Disposition參數返回 REG_OPENED_EXISTING_KEY。以下的代碼演示了如何使用ZwCreateKey函數打開注冊表。
UNICODE_STRING RegUnicodeStr;HANDLE hRegister;// 初始化 UNICODE_STRING 字符串RtlInitUnicodeString(&RegUnicodeStr, NY_REG_SOFTWARE_KEY_NAME);OBJECT_ATTRIBUTES objectAttributes;// 初始化 objectAttriInitializeObjectAttributes(&objectAttributes,&RegUnicodeStr,OBJ_CASE_INSENSITIVE,NULL,NULL);ULONG ulResult;// 創建文件NTSTATUS ntStatus = ZwCreateKey(&hRegister,KEY_ALL_ACCESS,&objectAttributes,0,NULL,REG_OPTION_NON_VOLATILE,&ulResult);if (!NT_SUCCESS(ntStatus)){// 判斷是被先創建,還是已經被創建if (ulResult == REG_CREATED_NEW_KEY){KdPrint(("The register item is created\n"));}else if (ulResult == REG_OPENED_EXISTING_KEY){KdPrint(("The register item has been created, and now is opened\n"));}}// 創建或打開某注冊表項目的子項UNICODE_STRING subRegUnicodeString;HANDLE hSubRegister;// 初始化UNICODE_STRING字符串RtlInitUnicodeString(&subRegUnicodeString, L"SubItem");OBJECT_ATTRIBUTES subObjectAttributes;// 初始化subObjectAttributesInitializeObjectAttributes(&subObjectAttributes,&subRegUnicodeString,OBJ_CASE_INSENSITIVE,hRegister,NULL);// 創建或打開注冊表項目 ZwCreateKeyntStatus = ZwCreateKey(&hSubRegister, KEY_ALL_ACCESS, &subObjectAttributes, 0, NULL, REG_OPTION_VOLATILE, &ulResult);if (NT_SUCCESS(ntStatus)){// 判斷是被新創建,還是已經被創建if (ulResult == REG_CREATED_NEW_KEY){KdPrint(("The register item is created\n"));}else if (ulResult == REG_OPENED_EXISTING_KEY){KdPrint(("The register item has been created, and now is opened\n"));}}// 關閉注冊表ZwClose(hRegister);ZwClose(hSubRegister);
?