void CConEmuUpdate::StartCheckProcedure(BOOL abShowMessages) { //DWORD nWait = WAIT_OBJECT_0; if (InUpdate() != us_NotStarted) { // Already in update procedure if (m_UpdateStep == us_ExitAndUpdate) { if (gpConEmu) { // Повторно? gpConEmu->RequestExitUpdate(); } } else if (abShowMessages) { MBoxError(L"Checking for updates already started"); } return; } gpSet->UpdSet.dwLastUpdateCheck = GetTickCount(); // Сразу проверим, как нужно будет запускаться bNeedRunElevation = NeedRunElevation(); mb_RequestTerminate = false; //if (!mh_StopThread) // mh_StopThread = CreateEvent(NULL, TRUE/*manual*/, FALSE, NULL); //ResetEvent(mh_StopThread); // Запомнить текущие параметры обновления if (!mp_Set) mp_Set = new ConEmuUpdateSettings; mp_Set->LoadFrom(&gpSet->UpdSet); mb_ManualCallMode = abShowMessages; { MSectionLock SC; SC.Lock(mp_LastErrorSC, TRUE); SafeFree(ms_LastErrorInfo); } wchar_t szReason[128]; if (!mp_Set->UpdatesAllowed(szReason)) { wchar_t szErrMsg[255]; wcscpy_c(szErrMsg, L"Updates are not enabled in ConEmu settings\r\n"); wcscat_c(szErrMsg, szReason); DisplayLastError(szErrMsg, -1); return; } mb_InCheckProcedure = TRUE; mh_CheckThread = CreateThread(NULL, 0, CheckThreadProc, this, 0, &mn_CheckThreadId); if (!mh_CheckThread) { mb_InCheckProcedure = FALSE; DWORD nErrCode = GetLastError(); wchar_t szErrMsg[255]; wcscpy_c(szErrMsg, L"ConEmu automatic update check failed!\r\n"); if (nErrCode == ERROR_ACCESS_DENIED) wcscat_c(szErrMsg, L"Check your antivirus software\r\n"); wcscat_c(szErrMsg, L"\r\nCreateThread(CheckThreadProc) failed\r\n"); DisplayLastError(szErrMsg, nErrCode); return; } // OK }
bool CConEmuUpdate::StartLocalUpdate(LPCWSTR asDownloadedPackage) { bool bRc = false; LPCWSTR pszName, pszExt; HANDLE hTarget = NULL; wchar_t *pszLocalPackage = NULL, *pszBatchFile = NULL; DWORD nLocalCRC = 0; BOOL lbDownloadRc = FALSE, lbExecuteRc = FALSE; LPCWSTR pszPackPref = L"conemupack."; size_t lnPackPref = _tcslen(pszPackPref); LPCWSTR pszSetupPref = L"conemusetup."; size_t lnSetupPref = _tcslen(pszSetupPref); _ASSERTE(gpConEmu && gpConEmu->isMainThread()); if (InUpdate() != us_NotStarted) { MBoxError(L"Checking for updates already started"); goto wrap; } if (mb_InCheckProcedure) { Assert(mb_InCheckProcedure==FALSE); goto wrap; } DeleteBadTempFiles(); Inet.Deinit(true); pszName = PointToName(asDownloadedPackage); pszExt = PointToExt(pszName); if (!pszName || !*pszName || !pszExt || !*pszExt) { AssertMsg(L"Invalid asDownloadedPackage"); goto wrap; } // Запомнить текущие параметры обновления if (!mp_Set) mp_Set = new ConEmuUpdateSettings; mp_Set->LoadFrom(&gpSet->UpdSet); mb_ManualCallMode = TRUE; // Clear possible last error { MSectionLock SC; SC.Lock(mp_LastErrorSC, TRUE); SafeFree(ms_LastErrorInfo); } ms_NewVersion[0] = 0; if ((lstrcmpni(pszName, pszPackPref, lnPackPref) == 0) && (lstrcmpi(pszExt, L".7z") == 0) && (((pszExt - pszName) - lnPackPref + 1) < sizeof(ms_NewVersion))) { // Check it was NOT installed with "Setupper" if (mp_Set->UpdateDownloadSetup() == 1) { DontEnable de; LPCWSTR pszConfirm = L"ConEmu was installed with setup!\nAre you sure to update installation with 7zip?"; int iBtn = MessageBox(NULL, pszConfirm, ms_DefaultTitle, MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL|MB_YESNO|MB_DEFBUTTON2); if (iBtn != IDYES) { goto wrap; } } if (!Check7zipInstalled()) goto wrap; // Error already reported // Forcing usage of 7zip package! mp_Set->isUpdateDownloadSetup = 2; //if (!CanUpdateInstallation()) //{ // // Значит 7zip обломается при попытке распаковки // goto wrap; //} // OK size_t nLen = (pszExt - pszName) - lnPackPref; wmemmove(ms_NewVersion, pszName+lnPackPref, nLen); ms_NewVersion[nLen] = 0; } else if ((lstrcmpni(pszName, pszSetupPref, lnSetupPref) == 0) && (lstrcmpi(pszExt, L".exe") == 0) && (((pszExt - pszName) - lnSetupPref + 1) < sizeof(ms_NewVersion))) { // Must be installed with "Setupper" if (mp_Set->UpdateDownloadSetup() != 1) { MBoxError(L"ConEmu was not installed with setup! Can't update!"); goto wrap; } // OK size_t nLen = (pszExt - pszName) - lnSetupPref; wmemmove(ms_NewVersion, pszName+lnSetupPref, nLen); ms_NewVersion[nLen] = 0; } else { AssertMsg(L"Invalid asDownloadedPackage (2)"); goto wrap; } // Сразу проверим, как нужно будет запускаться bNeedRunElevation = NeedRunElevation(); _wsprintf(ms_CurVersion, SKIPLEN(countof(ms_CurVersion)) L"%02u%02u%02u%s", (MVV_1%100),MVV_2,MVV_3,_T(MVV_4a)); //ms_NewVersion // StartLocalUpdate - запуск обновления из локального пакета mb_InetMode = false; mb_DroppedMode = true; pszLocalPackage = CreateTempFile(mp_Set->szUpdateDownloadPath, PointToName(asDownloadedPackage), hTarget); if (!pszLocalPackage) goto wrap; lbDownloadRc = DownloadFile(asDownloadedPackage, pszLocalPackage, hTarget, nLocalCRC, TRUE); CloseHandle(hTarget); if (!lbDownloadRc) goto wrap; if (mb_RequestTerminate) goto wrap; pszBatchFile = CreateBatchFile(pszLocalPackage); if (!pszBatchFile) goto wrap; if (!QueryConfirmation(us_ConfirmUpdate)) { goto wrap; } Assert(mb_ManualCallMode==TRUE); Assert(mpsz_PendingBatchFile==NULL); mpsz_PendingPackageFile = pszLocalPackage; pszLocalPackage = NULL; mpsz_PendingBatchFile = pszBatchFile; pszBatchFile = NULL; m_UpdateStep = us_ExitAndUpdate; if (gpConEmu) gpConEmu->RequestExitUpdate(); lbExecuteRc = TRUE; wrap: _ASSERTE(mpsz_DeleteIniFile==NULL); _ASSERTE(mpsz_DeletePackageFile==NULL); mpsz_DeletePackageFile = NULL; if (pszLocalPackage) { if (*pszLocalPackage && (!lbDownloadRc || (!lbExecuteRc && !mp_Set->isUpdateLeavePackages))) mpsz_DeletePackageFile = pszLocalPackage; //DeleteFile(pszLocalPackage); else SafeFree(pszLocalPackage); } _ASSERTE(mpsz_DeleteBatchFile==NULL); mpsz_DeleteBatchFile = NULL; if (pszBatchFile) { if (*pszBatchFile && !lbExecuteRc) mpsz_DeleteBatchFile = pszBatchFile; //DeleteFile(pszBatchFile); else SafeFree(pszBatchFile); } if (!lbExecuteRc) { m_UpdateStep = us_NotStarted; mb_DroppedMode = false; } return bRc; }
IXMLDOMDocument* SettingsXML::CreateDomDocument(wchar_t* pszErr /*= NULL*/, size_t cchErrMax /*= 0*/) { HRESULT hr; IXMLDOMDocument* pFile = NULL; static HMODULE hMsXml3 = NULL; typedef HRESULT (__stdcall* DllGetClassObject_t)(REFCLSID rclsid, REFIID riid, LPVOID *ppv); static DllGetClassObject_t lpfnGetClassObject = NULL; wchar_t szDllErr[128] = {}; hr = CoInitialize(NULL); // Если в прошлый раз обломались, и загрузили "msxml3.dll" - то и не дергаться if (hMsXml3 && (hMsXml3 != (HMODULE)INVALID_HANDLE_VALUE)) hr = REGDB_E_CLASSNOTREG; else hr = CoCreateInstance(CLSID_DOMDocument30, NULL, CLSCTX_INPROC_SERVER, //-V519 IID_IXMLDOMDocument, (void**)&pFile); // Если msxml3.dll (Msxml2.DOMDocument.3.0) не зарегистрирована - будет такая ошибка if (FAILED(hr)) // (hr == REGDB_E_CLASSNOTREG) { HRESULT hFact = 0; // Попробовать грузануть ее ручками if (!hMsXml3) { wchar_t szDll[MAX_PATH+16]; struct FindPlaces { LPCWSTR sDir, sSlash; } findPlaces[] = { {gpConEmu->ms_ConEmuExeDir, L"\\"}, {gpConEmu->ms_ConEmuBaseDir, L"\\"}, {L"", L""}, {NULL}}; for (FindPlaces* fp = findPlaces; fp->sDir; fp++) { _wsprintf(szDll, SKIPLEN(countof(szDll)) L"%s%smsxml3.dll", fp->sDir, fp->sSlash); hMsXml3 = LoadLibrary(szDll); hFact = hMsXml3 ? 0 : (HRESULT)GetLastError(); if (hMsXml3) break; //if (!hMsXml3 // && (((DWORD)hFact) == ERROR_MOD_NOT_FOUND // || ((DWORD)hFact) == ERROR_BAD_EXE_FORMAT // || ((DWORD)hFact) == ERROR_FILE_NOT_FOUND)) } //_wsprintf(szDll, SKIPLEN(countof(szDll)) L"%s\\msxml3.dll", gpConEmu->ms_ConEmuExeDir); //hMsXml3 = LoadLibrary(szDll); //hFact = hMsXml3 ? 0 : (HRESULT)GetLastError(); //if (!hMsXml3 // && (((DWORD)hFact) == ERROR_MOD_NOT_FOUND // || ((DWORD)hFact) == ERROR_BAD_EXE_FORMAT // || ((DWORD)hFact) == ERROR_FILE_NOT_FOUND)) //{ // _wsprintf(szDll, SKIPLEN(countof(szDll)) L"%s\\msxml3.dll", gpConEmu->ms_ConEmuBaseDir); // hMsXml3 = LoadLibrary(szDll); // hFact = hMsXml3 ? 0 : (HRESULT)GetLastError(); //} if (!hMsXml3) { hMsXml3 = (HMODULE)INVALID_HANDLE_VALUE; _wsprintf(szDllErr, SKIPLEN(countof(szDllErr)) L"\nLoadLibrary(\"msxml3.dll\") failed\nErrCode=0x%08X", (DWORD)hFact); } } if (hMsXml3 && (hMsXml3 != (HMODULE)INVALID_HANDLE_VALUE)) { if (!lpfnGetClassObject) lpfnGetClassObject = (DllGetClassObject_t)GetProcAddress(hMsXml3, "DllGetClassObject"); if (!lpfnGetClassObject) { hFact = (HRESULT)GetLastError(); _wsprintf(szDllErr, SKIPLEN(countof(szDllErr)) L"\nGetProcAddress(\"DllGetClassObject\") failed\nErrCode=0x%08X", (DWORD)hFact); } else { IClassFactory* pFact = NULL; hFact = lpfnGetClassObject(CLSID_DOMDocument30, IID_IClassFactory, (void**)&pFact); if (SUCCEEDED(hFact) && pFact) { hFact = pFact->CreateInstance(NULL, IID_IXMLDOMDocument, (void**)&pFile); if (SUCCEEDED(hFact) && pFile) hr = hFact; else _wsprintf(szDllErr, SKIPLEN(countof(szDllErr)) L"\nCreateInstance(IID_IXMLDOMDocument) failed\nErrCode=0x%08X", (DWORD)hFact); pFact->Release(); } else { _wsprintf(szDllErr, SKIPLEN(countof(szDllErr)) L"\nGetClassObject(CLSID_DOMDocument30) failed\nErrCode=0x%08X", (DWORD)hFact); } } } } if (FAILED(hr) || !pFile) { wchar_t szErr[512]; bool bShowError = (pszErr == NULL); if (pszErr == NULL) { pszErr = szErr; cchErrMax = countof(szErr); } _wsprintf(pszErr, SKIPLEN(cchErrMax) L"XML setting file can not be used!\n" L"Dynamic libraries 'msxml3.dll'/'msxml3r.dll' were not found!\n\n" L"Can't create IID_IXMLDOMDocument!\n" L"ErrCode=0x%08X %s", (DWORD)hr, szDllErr); if (bShowError) { static bool bWarned = false; if (!bWarned) { // Не задалбывать пользователя ошибками. Один раз - и хватит bWarned = true; MBoxError(szErr); } } return NULL; } return pFile; }