从C的Windows内核驱动读取registry

我需要从registry(最好)或从文件读取设置。 该驱动程序是一个内核驱动程序,它被设置为启动types设置为SYSTEM ,所以所有的服务和WinAPI不一定可用。

我试图使用RtlQueryRegistryValues函数为了从registry中读取一个string值,但无论我做什么,我似乎得到相同的0xC0000034错误代码回翻译到STATUS_OBJECT_NAME_NOT_FOUND

根据MSDN提供的文档STATUS_OBJECT_NAME_NOT_FOUNDRtlQueryRegistryValues返回,当path参数不匹配有效的密钥,或者特定的标志被设置,特定于该标志的条件不符合。 据我所知,registry项实际上存在于我的testing机器中,而我没有使用RTL_QUERY_REGISTRY_REQUIRED标志。

我试图读取的registry值位于HKEY_LOCAL_MACHINE/SOFTWARE/company/ProjectName ,我试图读取默认值和名为parameter的REG_SZ值。 调用RtlQueryRegistryValues是在加载驱动程序的DriverEntry(…)阶段执行的。

我不知道是什么,我做错了,因为我是新的内核驱动程序和debugging过程是非常乏味,我不知道我是否只是不正确地引用registry值或如果在系统启动的这个阶段,registry是可用的。

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函数,所以您不需要对其进行硬编码。

另请参阅: 设备和驱动程序的注册表树和密钥 。