// hConWnd - HWND _реальной_ консоли BOOL LoadSrvMapping(HWND hConWnd, CESERVER_CONSOLE_MAPPING_HDR& SrvMapping) { if (!hConWnd) return FALSE; MFileMapping<CESERVER_CONSOLE_MAPPING_HDR> SrvInfoMapping; SrvInfoMapping.InitName(CECONMAPNAME, (DWORD)hConWnd); //-V205 const CESERVER_CONSOLE_MAPPING_HDR* pInfo = SrvInfoMapping.Open(); if (!pInfo) return FALSE; else if (pInfo->nProtocolVersion != CESERVER_REQ_VER) return FALSE; else { memmove(&SrvMapping, pInfo, min(pInfo->cbSize, sizeof(SrvMapping))); /*bDosBoxAllowed = pInfo->bDosBox; wcscpy_c(szBaseDir, pInfo->sConEmuBaseDir); wcscat_c(szBaseDir, L"\\"); if (pInfo->nLoggingType != glt_Processes) return NULL;*/ } SrvInfoMapping.CloseMap(); return (SrvMapping.cbSize != 0); }
BOOL LoadGuiMapping(DWORD nConEmuPID, ConEmuGuiMapping& GuiMapping) { if (!nConEmuPID) return FALSE; MFileMapping<ConEmuGuiMapping> GuiInfoMapping; GuiInfoMapping.InitName(CEGUIINFOMAPNAME, nConEmuPID); const ConEmuGuiMapping* pInfo = GuiInfoMapping.Open(); if (!pInfo) return FALSE; else if (pInfo->nProtocolVersion != CESERVER_REQ_VER) return FALSE; else { memmove(&GuiMapping, pInfo, min(pInfo->cbSize, sizeof(GuiMapping))); /*bDosBoxAllowed = pInfo->bDosBox; wcscpy_c(szBaseDir, pInfo->sConEmuBaseDir); wcscat_c(szBaseDir, L"\\"); if (pInfo->nLoggingType != glt_Processes) return NULL;*/ } GuiInfoMapping.CloseMap(); return (GuiMapping.cbSize != 0); }
BOOL CPluginBackground::LoadThSet(BOOL abFromMainThread) { if (!ghConEmuWndDC || !IsWindow(ghConEmuWndDC)) { _ASSERTE(ghConEmuWndDC!=NULL); return FALSE; } mb_ThNeedLoad = FALSE; BOOL lbRc = FALSE; MFileMapping<PanelViewSetMapping> ThSetMap; DWORD nGuiPID = 0; GetWindowThreadProcessId(ghConEmuWndDC, &nGuiPID); ThSetMap.InitName(CECONVIEWSETNAME, nGuiPID); if (ThSetMap.Open()) { lbRc = ThSetMap.GetTo(&m_ThSet) && (m_ThSet.cbSize != 0); ThSetMap.CloseMap(); if (!lbRc) { mb_ThNeedLoad = TRUE; // попробовать перечитать в следующий раз? } else { //BOOL lbNeedActivate; // Если изменились визуальные параметры CE - перерисоваться if (memcmp(&m_Default.MainFont, &m_ThSet.MainFont, sizeof(m_ThSet.MainFont))) { mn_ReqActions |= ra_UpdateBackground; m_Default.MainFont = m_ThSet.MainFont; } //TODO: AppDistinct & fade палитры if (memcmp(m_Default.crPalette, m_ThSet.crPalette, sizeof(m_ThSet.crPalette))) { mn_ReqActions |= ra_UpdateBackground; memmove(m_Default.crPalette, m_ThSet.crPalette, sizeof(m_ThSet.crPalette)); } if (mn_ReqActions && !abFromMainThread) gbNeedBgActivate = TRUE; } } return lbRc; }
BOOL FindConEmuBaseDir(wchar_t (&rsConEmuBaseDir)[MAX_PATH+1], wchar_t (&rsConEmuExe)[MAX_PATH+1], HMODULE hPluginDll /*= NULL*/) { // Сначала пробуем Mapping консоли (вдруг есть?) { MFileMapping<CESERVER_CONSOLE_MAPPING_HDR> ConMap; ConMap.InitName(CECONMAPNAME, (DWORD)myGetConsoleWindow()); //-V205 CESERVER_CONSOLE_MAPPING_HDR* p = ConMap.Open(); if (p && p->ComSpec.ConEmuBaseDir[0]) { // Успешно wcscpy_c(rsConEmuBaseDir, p->ComSpec.ConEmuBaseDir); wcscpy_c(rsConEmuExe, p->sConEmuExe); return TRUE; } } // Теперь - пробуем найти существующее окно ConEmu HWND hConEmu = FindWindow(VirtualConsoleClassMain, NULL); DWORD dwGuiPID = 0; if (hConEmu) { if (GetWindowThreadProcessId(hConEmu, &dwGuiPID) && dwGuiPID) { MFileMapping<ConEmuGuiMapping> GuiMap; GuiMap.InitName(CEGUIINFOMAPNAME, dwGuiPID); ConEmuGuiMapping* p = GuiMap.Open(); if (p && p->ComSpec.ConEmuBaseDir[0]) { wcscpy_c(rsConEmuBaseDir, p->ComSpec.ConEmuBaseDir); wcscpy_c(rsConEmuExe, p->sConEmuExe); return TRUE; } } } wchar_t szExePath[MAX_PATH+1]; HKEY hkRoot[] = {NULL,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE,HKEY_LOCAL_MACHINE}; DWORD samDesired = KEY_QUERY_VALUE; BOOL isWin64 = WIN3264TEST(IsWindows64(),TRUE); DWORD RedirectionFlag = WIN3264TEST((isWin64 ? KEY_WOW64_64KEY : 0),KEY_WOW64_32KEY); //#ifdef _WIN64 // isWin64 = TRUE; // RedirectionFlag = KEY_WOW64_32KEY; //#else // isWin64 = IsWindows64(); // RedirectionFlag = isWin64 ? KEY_WOW64_64KEY : 0; //#endif for (size_t i = 0; i < countof(hkRoot); i++) { szExePath[0] = 0; if (i == 0) { // Запущенного ConEmu.exe нет, можно поискать в каталоге текущего приложения if (!GetModuleFileName(NULL, szExePath, countof(szExePath)-20)) continue; wchar_t* pszName = wcsrchr(szExePath, L'\\'); if (!pszName) continue; *(pszName+1) = 0; // Проверяем наличие файлов // LPCWSTR szGuiExe[2] = {L"ConEmu64.exe", L"ConEmu.exe"}; if (!IsConEmuExeExist(szExePath, rsConEmuExe) && hPluginDll) { // Попробовать найти наш exe-шник от пути плагина? if (!GetModuleFileName(hPluginDll, szExePath, countof(szExePath)-1)) continue; wchar_t* pszName = wcsrchr(szExePath, L'\\'); if (!pszName) continue; *(pszName+1) = 0; int nLen = lstrlen(szExePath); LPCWSTR pszCompare = L"\\Plugins\\ConEmu\\"; if (nLen <= lstrlen(pszCompare)) continue; nLen = lstrlen(pszCompare); int iCmp = lstrcmpi(pszName-nLen+1, pszCompare); if (iCmp != 0) continue; *(pszName-nLen+2) = 0; } } else { // Остался последний шанс - если ConEmu установлен через MSI, то путь указан в реестре // [HKEY_LOCAL_MACHINE\SOFTWARE\ConEmu] // "InstallDir"="C:\\Utils\\Far180\\" if (i == (countof(hkRoot)-1)) { if (RedirectionFlag) samDesired |= RedirectionFlag; else break; } HKEY hKey; if (RegOpenKeyEx(hkRoot[i], L"Software\\ConEmu", 0, samDesired, &hKey) != ERROR_SUCCESS) continue; memset(szExePath, 0, countof(szExePath)); DWORD nType = 0, nSize = sizeof(szExePath)-20*sizeof(wchar_t); int RegResult = RegQueryValueEx(hKey, L"", NULL, &nType, (LPBYTE)szExePath, &nSize); RegCloseKey(hKey); if (RegResult != ERROR_SUCCESS) continue; } if (szExePath[0]) { // Хоть и задано в реестре - файлов может не быть. Проверяем if (szExePath[lstrlen(szExePath)-1] != L'\\') wcscat_c(szExePath, L"\\"); // Проверяем наличие файлов // LPCWSTR szGuiExe[2] = {L"ConEmu64.exe", L"ConEmu.exe"}; BOOL lbExeFound = IsConEmuExeExist(szExePath, rsConEmuExe); // Если GUI-exe найден - ищем "base" if (lbExeFound) { wchar_t* pszName = szExePath+lstrlen(szExePath); LPCWSTR szSrvExe[4] = {L"ConEmuC64.exe", L"ConEmu\\ConEmuC64.exe", L"ConEmuC.exe", L"ConEmu\\ConEmuC.exe"}; for (size_t s = 0; s < countof(szSrvExe); s++) { if ((s <=1) && !isWin64) continue; wcscpy_add(pszName, szExePath, szSrvExe[s]); if (FileExists(szExePath)) { pszName = wcsrchr(szExePath, L'\\'); if (pszName) { *pszName = 0; // БЕЗ слеша на конце! wcscpy_c(rsConEmuBaseDir, szExePath); return TRUE; } } } } } } // Не удалось return FALSE; }