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\");
删除字符串开头的双反斜杠后,代码按预期执行。
我正在尝试在 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\");
删除字符串开头的双反斜杠后,代码按预期执行。