读注册表

// 初始化
HKEY hKey_return = NULL;

// 打开注册表失败
if(ERROR_SUCCESS != RegOpenKeyEx(
HKEY_LOCAL_MACHINE, // 注册表根键句柄(也可以是 HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_USERS、HKEY_CURRENT_CONFIG)
去掉第一个参数后的注册表路径, // 注册表路径(开头无'\',结尾有'\')
0, // 保留
KEY_READ, // 只读
&hKey_return // 接收打开键的指针(RegQueryValueEx 会用到)
)){
cout << "RegOpenKeyEx failed." << endl;
return false;
}

// 打开键失败
char keyValue[256];
DWORD keySzType;
DWORD keySize;
if(ERROR_SUCCESS != RegQueryValueEx(
hKey_return, // 由 RegOpenKeyEx 返回
注册表键名, // 键名
0, // 不定义值类型
&keySzType, // 接收键类型
(LPBYTE)&keyValue, // 接收键值
&keySize // 接收键值的字节大小
)){
cout << "RegQueryValueEx failed." << endl;
return false;
}

// 打印注册表键值
cout << keyValue << endl;

写注册表: 这是一个例子,有多余的代码。功能大概是遍历了某个注册表键下的所有键值,酌情修改其中的某个数据 ????

BOOL CDesktopController::CheckShellFloders()
{
std::map<std::wstring, std::wstring> mapShellFolders = {
{L"AppData", L"%USERPROFILE%\\AppData\\Roaming"},
{L"Cache", L"%USERPROFILE%\\AppData\\Local\\Microsoft\\Windows\\INetCache"},
{L"Cookies", L"%USERPROFILE%\\AppData\\Local\\Microsoft\\Windows\\INetCookies"},
{L"Desktop", L"%USERPROFILE%\\Desktop"},
{L"Favorites", L"%USERPROFILE%\\Favorites"},
{L"History", L"%USERPROFILE%\\AppData\\Local\\Microsoft\\Windows\\History"},
{L"Local AppData", L"%USERPROFILE%\\AppData\\Local"},
{L"My Music", L"%USERPROFILE%\\Music"},
{L"My Pictures", L"%USERPROFILE%\\Pictures"},
{L"My Video", L"%USERPROFILE%\\Videos"},
{L"NetHood", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Network Shortcuts"},
{L"Personal", L"%USERPROFILE%\\Documents"},
{L"PrintHood", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Printer Shortcuts"},
{L"Programs", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs"},
{L"Recent", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Recent"},
{L"SendTo", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\SendTo"},
{L"Start Menu", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu"},
{L"Startup", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"},
{L"Templates", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Templates"}
};

BOOL ret = FALSE;
BOOL needKillExplorer = FALSE;
HKEY hTestKey = NULL;
DWORD cSubKeys = 0; // 子健个数
DWORD cValues = 0; // 键值个数
TCHAR achValue[MAX_VALUE_NAME]; // 键值名
DWORD cchValue = MAX_VALUE_NAME; // 键值最大长度
TCHAR achData[MAX_VALUE_DATA]; // 键数据
DWORD cchData = MAX_VALUE_DATA; // 键数据最大长度
DWORD cbName = 0;

// 遍历 HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/User Shell Folders
if (ERROR_SUCCESS != RegOpenKeyEx(
HKEY_CURRENT_USER,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",
0,
KEY_ALL_ACCESS,
&hTestKey))
{
LOG_INFO_A("RegOpenKeyEx failed. \n");
goto end;
}
if (ERROR_SUCCESS != RegQueryInfoKey(
hTestKey,
NULL,
NULL,
NULL,
&cSubKeys,
NULL,
NULL,
&cValues,
NULL,
NULL,
NULL,
NULL
))
{
LOG_INFO_A("RegQueryInfoKey failed. \n");
goto end;
}
for (UINT i = 0; i < cValues; ++i)
{
cchValue = MAX_VALUE_NAME;
cchData = MAX_VALUE_DATA;
achValue[0] = '\0';
achValue[0] = '\0';
if (ERROR_SUCCESS != RegEnumValue(
hTestKey,
i,
achValue,
&cchValue,
NULL,
NULL,
(LPBYTE)achData,
&cchData
))
{
LOG_INFO_A("RegEnumValue failed. \n");
continue;
}

// 如果有 \\ 开头的网络路径,就恢复
if (achData[0] == '\\' && achData[1] == '\\')
{
if (mapShellFolders.find(achValue) == mapShellFolders.end())
{
continue;
}
if (ERROR_SUCCESS != RegSetValueEx(
hTestKey,
achValue,
0,
REG_EXPAND_SZ,
(const BYTE*)mapShellFolders.find(achValue)->second.c_str(),
MAX_VALUE_DATA))
{
LOG_INFO_A("[LYSM] RegSetValueEx failed. \n");
continue;
}
needKillExplorer = TRUE;
}
}

// 杀安全桌面 - explorer.exe 进程,使注册表改动生效
if (needKillExplorer)
{
if (!killSecureExplorer())
{
goto end;
}
}

ret = TRUE;
end:
if (hTestKey)
{
RegCloseKey(hTestKey);
}
return ret;
}

版权声明:本博客文章与代码均为学习时整理的笔记,文章 [均为原创] 作品,转载请 [添加出处] ,您添加出处是我创作的动力!