Windows Driver Model

RtlQueryRegistryValues()使用方式


雖然司徒已經有介紹過Zw相關的Registry操作,如果使用者還想了解更多其它操作Registry的API的話,可以看看本篇介紹的RtlQueryRegistryValues() API,雖然依據Microsoft的定義,Rtl屬於Runtime Library;而Zw則是Native System(expose from Win32 subsystem in kernel mode),雖然看完還是一樣不知道在說什麼,不過記得至少還有另一種方式可以選擇就好了。

副程式:

NTSTATUS GetRegistryValue(PWCHAR wcValueName, ULONG *pReturn, PWSTR pRegistryPath)
{
  RTL_QUERY_REGISTRY_TABLE astQueryTable[2]={0};
  ULONG ulDefault=0;

  RtlZeroMemory(astQueryTable, sizeof(astQueryTable));
  astQueryTable[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
  astQueryTable[0].Name = wcValueName;
  astQueryTable[0].EntryContext = pReturn;
  astQueryTable[0].DefaultType = REG_DWORD;
  astQueryTable[0].DefaultData = REG_NONE;
  astQueryTable[0].DefaultLength = REG_NONE;
  return RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, pRegistryPath, astQueryTable, NULL, NULL);
}

上面的程式是一段很好用的副程式,使用者可以善加利用,該副程式第一個參數代表Value的名稱(Key跟Value是不一樣的東西),第二個參數則是回傳值(目前型態是REG_DWORD),第三個參數就是完整的Key路徑。

RtlQueryRegistryValues()的用法又可以分成兩種方式,第一種是有Callback調用;而第二種則是直接讀取,目前司徒給出的程式是直接讀取,而RtlQueryRegistryValues()最特別的用法就是可以多筆Value一次讀取進來。目前司徒是透過astQueryTable陣列來做儲存資料,最後一個陣列元素記得要清空,這樣RtlQueryRegistryValues()才會知道何時停止,而當每一筆Value讀取發生錯誤時,RtlQueryRegistryValues()有提供Default Value功能,目前司徒是使用REG_NONE。

呼叫範例:

ULONG ulTemp=0;

status = GetRegistryValue(L"Temp", &ulTemp, L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\firstWDM\\Parameters\\");
if(status != STATUS_SUCCESS){
  DbgPrint("GetRegistryValue Failed: 0x%X\n", status);
}
else{
  DbgPrint("GetRegistryValue Value: 0x%X\n", ulTemp);
}

上面的範例是取得Key(L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\firstWDM\\Parameters\\")下的Temp數值(REG_DWORD)。


返回上一頁