我需要从registry(最好)或从文件读取设置。 该驱动程序是一个内核驱动程序,它被设置为启动types设置为SYSTEM
,所以所有的服务和WinAPI不一定可用。
我试图使用RtlQueryRegistryValues
函数为了从registry中读取一个string值,但无论我做什么,我似乎得到相同的0xC0000034
错误代码回翻译到STATUS_OBJECT_NAME_NOT_FOUND
。
根据MSDN提供的文档STATUS_OBJECT_NAME_NOT_FOUND
从RtlQueryRegistryValues
返回,当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
函数,所以您不需要对其进行硬编码。
另请参阅: 设备和驱动程序的注册表树和密钥 。