2013-08-18 3 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?

EDIT:

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

Есть больше кода не хватает? Каковы остальные значения для остальных членов таблицы [0] '? И каков результат «статуса»? –

+0

'WCHAR keyname [20] =" параметр "; CHAR def [20] = "параметр"; Путь WCHAR [100] = L "\\ Реестр \\ Машина \\ SYSTEM \\ CurrentControlSet \\ Services \\ hello \\ Параметры"; unsigned long buffer [100]; таблица [0] .QueryRoutine = NULL; таблица [0] .Name = keyname; таблица [0] .Flags = RTL_QUERY_REGISTRY_DIRECT; таблица [0] .EntryContext = buffer; таблица [0] .DefaultType = REG_DWORD; таблица [0] .DefaultData = def; таблица [0].DefaultLength = StrLen (DEF) + 1; ' и статус STATUS_SUCCESS ' переключатель (статус) { случай STATUS_SUCCESS: \t DbgPrint ("! Найдено значение"); \t перерыв, ' – johnye2e

+0

К сожалению, это то, что я писал: ' неподписанных долго буфер, и 'таблица [0] .EntryContext = & буфер;' – johnye2e

ответ

0

table[0].DefaultData должен быть указателем на неподписанный долго.
table[0].DefaultLength должен быть sizeof (без знака длинный).

В противном случае вы можете вернуться назад 1634886000, который является значением по умолчанию, преобразованным в long ('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 macro': ' WCHAR keyname = L "parametru" '(румынское имя, неважно) – johnye2e