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;
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; } }
if (needKillExplorer) { if (!killSecureExplorer()) { goto end; } }
ret = TRUE; end: if (hTestKey) { RegCloseKey(hTestKey); } return ret; }
|