gpt4 book ai didi

c++ - 如何删除注册表中的错误符号链接(symbolic link)

转载 作者:搜寻专家 更新时间:2023-10-31 01:40:33 24 4
gpt4 key购买 nike

我正在制作对注册表进行一些编辑的原型(prototype),以创建从一个区域到另一个区域的符号链接(symbolic link)。我使用了以下代码:

HKEY hkFS;
HKEY hkSOFTWARE;
DWORD dwDisposition;
LSTATUS result;
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE"), 0,
KEY_CREATE_SUB_KEY , &hkSOFTWARE);
if (result == 0) {
result = RegOpenKeyEx(hkSOFTWARE, _T("MyKey"), REG_OPTION_OPEN_LINK,
KEY_WRITE | KEY_CREATE_LINK | KEY_WOW64_64KEY, &hkFS);
if (result != ERROR_SUCCESS) {
_tprintf(_T("%d\n"), result);
result = RegCreateKeyEx(hkSOFTWARE, _T("MyKey"), 0, NULL,
REG_OPTION_CREATE_LINK,
KEY_WRITE | KEY_CREATE_LINK | KEY_WOW64_64KEY,
NULL, &hkFS, &dwDisposition);
_tprintf(_T("%d\n"), result);
}
if (result == ERROR_SUCCESS) {
//result = ZwDeleteKey(hkFS);
TCHAR target[] = _T("HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\MyKey");
result = RegSetValueEx(hkFS, _T("SymbolicLinkValue"), 0, REG_SZ,
(const BYTE const *)target, sizeof(target));
if (result != ERROR_SUCCESS) {
TCHAR msg[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, 0, msg,
sizeof(msg) / sizeof(TCHAR), NULL);
_tprintf(_T("Failed to write SymbolicLinkValue: %s"), msg);
}
RegCloseKey(hkFS);
}
else {
TCHAR msg[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, 0, msg,
sizeof(msg) / sizeof(TCHAR), NULL);
_putts(msg);
}
}
else {
TCHAR msg[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, 0, msg,
sizeof(msg) / sizeof(TCHAR), NULL);
_tprintf(_T("Error opening SOFTWARE: %s"), msg);
}
RegCloseKey(hkSOFTWARE);

现在我有两个问题。

  1. 我无法删除在软件下创建的 MyKey 值。
  2. 我在尝试将 SymbolicLinkValue 写入 MyKey 时遇到拒绝访问错误,即使是以管理员身份运行也是如此。

我需要帮助清理我的注册表并使此代码正常工作。

最佳答案

我在 http://www.codeproject.com/Articles/11973/Registry-Symbolic-Links 找到了代码这解决了我所有的问题。

这是它用来删除表示符号链接(symbolic link)的注册表项的代码:

typedef LONG NTSTATUS;

#if !defined(_NTSYSTEM_)
#define NTSYSAPI DECLSPEC_IMPORT
#else
#define NTSYSAPI
#endif

NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteKey(
IN HANDLE KeyHandle
);

typedef NTSYSAPI NTSTATUS (NTAPI *ZW_DELETE_KEY_PROTO)(HANDLE);
static LONG DynZwDeleteKey(HKEY hKey)
{
LONG lStatus = ERROR_SUCCESS;
HMODULE hNTDll = LoadLibraryW( L"ntdll.dll" );
if (hNTDll)
{
ZW_DELETE_KEY_PROTO lpfnZwDeleteKey = (ZW_DELETE_KEY_PROTO)GetProcAddress(hNTDll, "ZwDeleteKey");
if (lpfnZwDeleteKey)
lStatus = lpfnZwDeleteKey(hKey);
else
lStatus = GetLastError();

VERIFY(FreeLibrary(hNTDll));
}
else
lStatus = GetLastError();

return lStatus;
}

我上面的代码在创建链接时有几个问题。这些更正的行使其工作:

result = RegCreateKeyEx(hkSOFTWARE, _T("MyKey"), 0, NULL,
REG_OPTION_CREATE_LINK,
KEY_ALL_ACCESS | KEY_CREATE_LINK | KEY_WOW64_64KEY,
NULL, &hkFS, &dwDisposition);

...

result = RegSetValueExW(hkFS, L"SymbolicLinkValue", 0, REG_LINK,
(const BYTE const *)target, lstrlen(target) * sizeof(WCHAR));

关于c++ - 如何删除注册表中的错误符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29632779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com