示例#1
0
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;
}
示例#2
0
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;
}