我需要从注册表(最好)或文件中读取设置。该驱动程序是一个内核驱动程序,设置为启动类型设置为 SYSTEM
,因此所有服务和 WinAPI 不一定都可用。
我正在尝试使用 RtlQueryRegistryValues
函数以便从注册表中读取单个 String 值,但无论我做什么,我似乎都得到相同的 0xC0000034
转换为 STATUS_OBJECT_NAME_NOT_FOUND
的错误代码.
根据 MSDN 上提供的文档 STATUS_OBJECT_NAME_NOT_FOUND
从 RtlQueryRegistryValues
返回当路径参数与有效键不匹配时,或者设置了特定标志并且不满足特定于该标志的条件时。据我所知,注册表项实际上存在于我的测试机器中,我没有使用 RTL_QUERY_REGISTRY_REQUIRED
旗帜。
我试图读取的注册表值位于 HKEY_LOCAL_MACHINE/SOFTWARE/company/ProjectName
下,我正在尝试读取默认值和名为 parameter
的 REG_SZ 值.调用RtlQueryRegistryValues
在加载驱动程序的 DriverEntry(...) 阶段执行。
我不知道我做错了什么,因为我是内核驱动程序的新手而且调试过程非常乏味我不确定我是否只是引用注册表值不正确,或者注册表在系统启动的这个阶段是否可用。
mydriver.c
NTSTATUS DriverEntry(...) {
NTSTATUS regStatus = 0;
UNICODE_STRING data;
RTL_QUERY_REGISTRY_TABLE query[2];
WCHAR* regPath = L"\\Registry\\Machine\\SOFTWARE\\Company\\ProjectName";
RtlZeroMemory(query, sizeof(RTL_QUERY_REGISTRY_TABLE) * 2);
data.Buffer = NULL;
data.MaximumLength = 0;
data.Length = 0;
// query[0].Name = L"Parameter";
query[0].Name = L""; // L"" refers to the default value
query[0].Flags = RTL_QUERY_REGISTRY_DIRECT;
query[0].EntryContext = &data;
regStatus = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, regPath, query, NULL, NULL);
DebugPrint("regStatus: %lx\n", regStatus);
DebugPrint("data: %wZ\n", &data);
}
最佳答案
我不是 100% 确定,但我怀疑软件子树的注册表配置单元没有加载。你为什么要尝试访问它?驱动程序配置参数的正确位置是它自己的注册表项 ( \Registry\Machine\System\CurrentControlSet\Services\<DriverName>\
),它的路径甚至会传递给你的 DriverEntry
。功能,因此您无需对其进行硬编码。
关于c - 从 C 中的 Windows 内核驱动程序读取注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675956/