RtlQueryRegistryValues读取REG_DWORD

时间:2013-08-18 14:07:15

标签: windows drivers wdk

我正在编写一个Uart16550驱动程序,我要做的一件事就是使用RtlQueryRegistryValues从注册表中读取一些初始化参数。

(跳过很多代码......)

RTL_QUERY_REGISTRY_TABLE table[2];

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

该参数作为REG_DWORD存储在注册表中,我正在尝试设置我的表:

unsigned long buffer;

(因为在ntddk.h中没有定义DWORD,我不确定我是否破坏了包括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;

1 个答案:

答案 0 :(得分:0)

table[0].DefaultData应该是指向unsigned long的指针 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