1

我正在编写一个 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;
4

1 回答 1

0

table[0].DefaultData应该是指向 unsigned long 的指针。
table[0].DefaultLength应该是 sizeof(unsigned long)。

否则,您可能会返回 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
于 2013-08-18T15:21:37.503 回答