RegCreateKeyExW 不创建密钥

RegCreateKeyExW not creating keys

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

Registry.cpp

int createRegistryKey(HKEY hiveHandle, LPCWSTR registryKeySequence) {

    HKEY keyHandle;

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

        wchar_t buf[256];
        FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, 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, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
            buf, (sizeof(buf) / sizeof(wchar_t)), 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,但这似乎没有帮助。文档说即使它们存在密钥,也应该 return 编辑一个句柄,但据我所知,这不是发生的事情。

我试图使用处置参数来进一步了解到底发生了什么,但是即使在 VS 调试视图中,我也得到了 0x00000000 的值,与文档。 0x00000001L 用于创建,0x00000002L 用于打开密钥。我什至创建了一个 if、else if、else 语句,它首先捕获 disposition == REG_CREATED_NEW_KEY,然后捕获 disposition == REG_OPENED_EXISTING_KEY,else 语句捕获 disposition 不等于任何一个值的情况。就是我每次测试都执行的else语句。

任何人都可以告诉我我在这里缺少什么吗?

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

If the function fails, the return value is a nonzero error code defined in Winerror.h. You can use the FormatMessage function with the FORMAT_MESSAGE_FROM_SYSTEM flag to get a generic description of the error.

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

int createRegistryKey(HKEY hiveHandle, LPCWSTR registryKeySequence) {

    HKEY keyHandle;

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

        wchar_t buf[256];
        FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
            NULL, 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\");

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