c - 从 C 中的 Windows 内核驱动程序读取注册表

标签 c windows winapi kernel registry

我需要从注册表(最好)或文件中读取设置。该驱动程序是一个内核驱动程序,设置为启动类型设置为 SYSTEM ,因此所有服务和 WinAPI 不一定都可用。

我正在尝试使用 RtlQueryRegistryValues函数以便从注册表中读取单个 String 值,但无论我做什么,我似乎都得到相同的 0xC0000034转换为 STATUS_OBJECT_NAME_NOT_FOUND 的错误代码.

根据 MSDN 上提供的文档 STATUS_OBJECT_NAME_NOT_FOUNDRtlQueryRegistryValues 返回当路径参数与有效键不匹配时,或者设置了特定标志并且不满足特定于该标志的条件时。据我所知,注册表项实际上存在于我的测试机器中,我没有使用 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。功能,因此您无需对其进行硬编码。

另请参阅:Registry Trees and Keys for Devices and Drivers .

关于c - 从 C 中的 Windows 内核驱动程序读取注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675956/

相关文章:

使用 phpseclib 通过 SSH 连接到 MySQL 的 PHP 代码

c - C 中的 pow 函数

c - C 中的 JSON 解析器技巧

c++ - 奇怪的! linux 和 windows sprintf float 到文件

c++ - 在 C++ (windows) 中监控文件变化

qt - 在 Qt Creator 中创建 Win32 应用程序

c - 意外标记 fork() 附近的语法错误

c - C中字符串比较(strcmp)的问题

c# - 从 CreateFile 产生的句柄构造一个 FileStream 给出一个空流

c++ - Winapi检测按钮悬停