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