您的位置:首页 > 博客中心 > 编程语言 >

C/C++ 实现读写注册表

时间:2022-03-29 01:57

读注册表

	// 初始化
	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;
}

本类排行

今日推荐

热门手游