微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RegCreateKeyExW 不创建密钥

如何解决RegCreateKeyExW 不创建密钥

我正在尝试在 HKEY_CURRENT_USER 配置单元下创建注册表项。我正在利用 RegCreateKeyExW 函数。我已阅读该函数Microsoft documentation,并相信我正确调用了它。但是,返回值不是 ERROR_SUCCESS,因为正在执行捕获失败的 if 语句中的代码调用 GetLastError 时,错误文本表明操作已成功执行。检查注册表时,我可以确认未创建密钥。我正在以管理权限运行代码,因为这是运行 VS 的安全上下文。这是下面的代码

Registry.cpp

int createRegistryKey(HKEY hiveHandle,LPCWSTR registryKeySequence) {

    HKEY keyHandle;

    if (RegCreateKeyExW(HKEY_CURRENT_USER,registryKeySequence,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,&keyHandle,NULL)  != ERROR_SUCCESS) {

        wchar_t buf[256];
        FormatMessageW(FORMAT_MESSAGE_FROM_SYstem | FORMAT_MESSAGE_IGnorE_INSERTS,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),buf,(sizeof(buf) / sizeof(wchar_t)),NULL);

        /* display error */
        std::wcout << "Creating key/s Failed: " << buf << std::endl;

        //return -1;

    }
    else {

        std::wcout << "Keys added successfuly" << std::endl;

    }

    RegCloseKey(keyHandle);
    RegCloseKey(hiveHandle);

    return 0;
}

下面是调用上述函数代码

fodhelperBypass.cpp

#include <iostream>
#include <Windows.h>
#include "registry.h"

int main() {

    HKEY hiveHandle;

    /* Get handle to HKCU hive*/
    if (RegOpenCurrentUser(KEY_SET_VALUE,&hiveHandle) != ERROR_SUCCESS) {

        wchar_t buf[256];
        FormatMessageW(FORMAT_MESSAGE_FROM_SYstem | FORMAT_MESSAGE_IGnorE_INSERTS,NULL);

        /* display error */
        std::wcout << "opening hive Failed: " << buf << std::endl;

        return -1;

    }
    else {

        std::wcout << "HKCU Hive opened successfully" << std::endl;

    }

    createRegistryKey(hiveHandle,L"\\SOFTWARE\\TestKey\\");
}

我相信我使用了正确的访问权限 (KEY_CREATE_SUB_KEY),但已改为使用 KEY_ALL_ACCESS,但这似乎没有帮助。文档说,即使它们存在密钥,也应该返回一个句柄,但这不是我所看到的。

我试图使用 disposition 参数来进一步了解到底发生了什么,但是即使在 VS 调试视图中,我也得到了 0x00000000 的值,与文档中规定的预期值相比,这毫无意义. 0x00000001L 用于创建,0x00000002L 用于打开的密钥。我什至创建了一个 if、else if、else 语句,它首先捕获 disposition == REG_CREATED_NEW_KEY 然后 disposition == REG_OPENED_EXISTING_KEY 和 else 语句捕获 disposition 不等于任一值的情况。这是我每次测试时执行的 else 语句。

谁能告诉我我在这里缺少什么?

解决方法

这里出现了两个问题;首先,正如@David Heffernan 所指出的,调用 GetLastError() 并没有提供有关所遇到错误的有意义的信息。最初阅读微软文档时,我没有正确阅读有关错误代码的信息。

如果函数失败,则返回值是 Winerror.h 中定义的非零错误代码。您可以使用带有 FORMAT_MESSAGE_FROM_SYSTEM 标志的 FormatMessage 函数来获取错误的一般描述。

更改错误处理代码,并将 RegCreateKeyExW 的返回值提供给 FormatMessage(),而不是来自 GetLastError() 的错误代码,产生了一个更有意义的错误:ERROR_BAD_PATHNAME (代码 161)。

int createRegistryKey(HKEY hiveHandle,LPCWSTR registryKeySequence) {

    HKEY keyHandle;

    LSTATUS result;
    result = RegCreateKeyExW(hiveHandle,registryKeySequence,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,&keyHandle,NULL);
    
    if (result != ERROR_SUCCESS) {

        wchar_t buf[256];
        FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,result,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),buf,(sizeof(buf) / sizeof(wchar_t)),NULL);

        /* Display error */
        std::wcout << "Creating key/s failed: " << buf << std::endl;

        return -1;

    }
    else {

        std::wcout << "Keys added successfuly" << std::endl;

    }

    RegCloseKey(keyHandle);

    return 0;

}

经过一些测试后发现,在向 lpSubKey 提供数据时,前面的反斜杠存在问题:

createRegistryKey(hiveHandle,L"\\SOFTWARE\\TestKey\\");

删除字符串开头的双反斜杠后,代码按预期执行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。