bool CConEmuUpdate::CanUpdateInstallation() { if (UpdateDownloadSetup() == 1) { // Если через Setupper - то msi сам разберется и ругнется когда надо return true; } // Раз дошли сюда - значит ConEmu был просто "распакован" if (IsUserAdmin()) { // ConEmu запущен "Под администратором", проверки не нужны return true; } wchar_t szTestFile[MAX_PATH*2]; wcscpy_c(szTestFile, gpConEmu->ms_ConEmuExeDir); wcscat_c(szTestFile, L"\\ConEmuUpdate.check"); HANDLE hFile = CreateFile(szTestFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_TEMPORARY, NULL); if (hFile == INVALID_HANDLE_VALUE) { DWORD nErr = GetLastError(); wcscpy_c(szTestFile, L"Can't update installation folder!\r\n"); wcscat_c(szTestFile, gpConEmu->ms_ConEmuExeDir); DisplayLastError(szTestFile, nErr); return false; } CloseHandle(hFile); DeleteFile(szTestFile); // OK return true; }
bool ConEmuUpdateSettings::UpdatesAllowed(wchar_t (&szReason)[128]) { szReason[0] = 0; if (!*UpdateVerLocation()) { wcscpy_c(szReason, L"Update.VerLocation is empty"); return false; // Не указано расположение обновления } if (isUpdateUseBuilds != 1 && isUpdateUseBuilds != 2) { wcscpy_c(szReason, L"Update.UseBuilds is not specified"); return false; // Не указано, какие сборки можно загружать } switch (UpdateDownloadSetup()) { case 1: if (!*UpdateExeCmdLine()) { wcscpy_c(szReason, L"Update.ExeCmdLine is not specified"); return false; // Не указана строка запуска инсталлятора } break; case 2: { LPCWSTR pszCmd = UpdateArcCmdLine(); if (!*pszCmd) { wcscpy_c(szReason, L"Update.ArcCmdLine is not specified"); return false; // Не указана строка запуска архиватора } wchar_t szExe[MAX_PATH+1] = {}; NextArg(&pszCmd, szExe); pszCmd = PointToName(szExe); if (!pszCmd || !*pszCmd) { wcscpy_c(szReason, L"Update.ArcCmdLine is invalid"); return false; // Ошибка в строке запуска архиватора } if ((lstrcmpi(pszCmd, L"WinRar.exe") == 0) || (lstrcmpi(pszCmd, L"Rar.exe") == 0) || (lstrcmpi(pszCmd, L"UnRar.exe") == 0)) { // Issue 537: AutoUpdate to the version 120509x64 unpacks to the wrong folder HKEY hk; DWORD nSubFolder = 0; if (0 == RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\WinRAR\\Extraction\\Profile", 0, KEY_READ, &hk)) { DWORD nSize = sizeof(nSubFolder); if (0 != RegQueryValueEx(hk, L"UnpToSubfolders", NULL, NULL, (LPBYTE)&nSubFolder, &nSize)) nSubFolder = 0; RegCloseKey(hk); } if (nSubFolder) { wcscpy_c(szReason, L"Update.ArcCmdLine: Unwanted option\n[HKCU\\Software\\WinRAR\\Extraction\\Profile]\n\"UnpToSubfolders\"=1"); return false; // Ошибка в настройке архиватора } } } break; default: wcscpy_c(szReason, L"Update.DownloadSetup is not specified"); return false; // Не указан тип загружаемого пакета (exe/7z) } // Можно return true; }