2013-08-18 40 views
1

我在寫一個Uart16550驅動程序,我必須做的事情之一就是使用RtlQueryRegistryValues從註冊表中讀取一些初始化參數。RtlQueryRegistryValues read REG_DWORD

(大量的代碼跳過......)

RTL_QUERY_REGISTRY_TABLE table[2]; 

table[1].QueryRoutine = NULL; 
table[1].Name = NULL; 

的參數存儲在註冊表中的REG_DWORD,我試圖把我的表:

unsigned long buffer; 

(因爲DWORD未在規定ntddk.h中,我不知道如果我打破任何東西,包括WINDEF.H) 和

table[0].EntryContext = &buffer; 

調用RtlQueryRegistryValues的狀態是STATUS_SUCCESS

status = RtlQueryRegistryValues(
    RTL_REGISTRY_ABSOLUTE, 
    path, 
    table, 
    NULL, 
    NULL); 

,但是當我嘗試

DbgPrint("registry: %lu", buffer) 

我得到太大了數字(我期望得到的結果是1或2)。

我在做錯誤的DbgPrint,或我的參數設置不正確的查詢表?

RED_DWORD數據類型定義在哪裏?

編輯:

WCHAR keyname[20] = "parameter"; 
CHAR def[20] = "parameter"; 
WCHAR path[100] = L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\hello\\Parameters"; 
unsigned long buffer; 
table[0].QueryRoutine = NULL; 
table[0].Name = keyname; 
table[0].Flags = RTL_QUERY_REGISTRY_DIRECT; 
table[0].EntryContext = &buffer; 
table[0].DefaultType = REG_DWORD; 
table[0].DefaultData = def; 
table[0].DefaultLength = strlen(def) + 1; 
+0

定義是否有更多的代碼不見了?其他'table [0]'成員的其他值是什麼? 'status'的結果是什麼? –

+0

'WCHAR keyname [20] =「參數」; CHAR def [20] =「參數」; WCHAR路徑[100] = L「\\ Registry \\ Machine \\ SYSTEM \\ CurrentControlSet \\ Services \\ hello \\ Parameters」; unsigned long buffer [100]; table [0] .QueryRoutine = NULL; table [0] .Name = keyname; table [0] .Flags = RTL_QUERY_REGISTRY_DIRECT; table [0] .EntryContext = buffer; table [0] .DefaultType = REG_DWORD; table [0] .DefaultData = def; 表[0]。DefaultLength = strlen的(DEF)+ 1;' ,狀態爲STATUS_SUCCESS '開關(狀態) { 情況STATUS_SUCCESS: \t DbgPrint( 「!實測值的值」); \t突破;' – johnye2e

+0

對不起,這是我寫的: 'unsigned long類型緩衝區;'和'表[0] .EntryContext =緩存;' – johnye2e

回答

0

table[0].DefaultData應該是一個指針,指向一個無符號長。
table[0].DefaultLength應該是sizeof(無符號長整數)。

否則,您可能會收回1634886000,這是您的默認值轉換爲長('para')。其他一切看起來都應該起作用(假設關鍵和價值實際存在)。


REG_DWORD在WINNT.H

#define REG_DWORD     (4) // 32-bit number 
#define REG_DWORD_LITTLE_ENDIAN  (4) // 32-bit number (same as REG_DWORD) 
#define REG_DWORD_BIG_ENDIAN  (5) // 32-bit number 
+0

這是正確的。而且我也應該使用'L宏': 'WCHAR keyname = L「parametru」'(羅馬尼亞名字,沒關係) – johnye2e