- 使用ZwXxxKey的method來建立、開啟一個handler,接著使用這個registry,最後再以ZwClose將它關閉。
- 使用Registry Run-Time Library (RtlXxxRegistryYyy),可以省下handler的處理。
RtlXxxRegistryYyy的routine多有三個主要參數 - RelativeTo, Path, ValueName,用以指定要對哪各registry中的哪個值採取動作。
RelativeTo : 指定Path是一個registry path,相對於一個已定義的path,或是一個已開啟的registry handle。
- RTL_REGISTRY_SERVICES - 就是指Path是相對於\Registry\Machine\System\CurrentControlSet\Services。
- RTL_REGISTRY_ABSOLUTE - Path是一個絕對的registry path
- RTL_REGISTRY_HANDLE - 一個已開啟的registry handle
ValueName : 指定要作用在這個registry path中的項目名稱,空字串就是指定Default entry
兩個主要的routine:
1. RtlQueryRegistryValues - 讀取多個registry-key的值
在這個routine中,並沒有ValueName,而是以另外定義一個QueryTable來告訴他如何運作。
你可以透過指定一個QueryRoutine來處理所讀到的資料,或是直接將資料塞入指定的buffer。當採取第二種方式時,根據不同的資料型態,必須放入不同的buffer。
- null-terminated unicode string : 丟一個已經初始化過的UNICODE_STRING
- 非string(size<=sizeof(ULONG)) : 會將資料放入所指定的位址
- 非string(size>sizeof(ULONG)) : 所給的buffer必須以一個signed value開始,大小代表所給的buffer size。若為負,表示將資料放入buffer即可;若為正,表示第一個ULONG為資料大小,第二個ULONG開始才是資料。
ULONG isGood = 0;
LONG ulsize = -188;
BYTE buffer[188];
RtlCopyMemory(buffer, &ulsize, sizeof(LONG));
RTL_QUERY_REGISTRY_TABLE QueryTable[] =
{
{ NULL , RTL_QUERY_REGISTRY_DIRECT, L"", &isGood, REG_NONE, NULL, 0},
{ NULL , RTL_QUERY_REGISTRY_DIRECT, L"INFO", buffer, REG_NONE, NULL, 0},
{ NULL , 0, NULL, NULL,0,NULL,0}
};
NTSTATUS status = RtlQueryRegistryValues(RTL_REGISTRY_SERVICES, L"Test", QueryTable, NULL, NULL);
2. RtlWriteRegistryValue - 寫入一個registry-key的值
多了三個變數 : ValueType, ValueData, ValueLength。分別代表要寫入的資料的型態、值和長度。
ULONG isGood = 0;
status = RtlWriteRegistryValue(RTL_REGISTRY_SERVICES, (PCWSTR)L"Test", L"", REG_DWORD, &isGood , sizeof(ULONG));
張貼留言
注意:只有此網誌的成員可以留言。