void CConEmuUpdate::ReportBrokenIni(LPCWSTR asSection, LPCWSTR asName, LPCWSTR asIni) { wchar_t szInfo[140]; DWORD nErr = GetLastError(); _wsprintf(szInfo, SKIPLEN(countof(szInfo)) L"[%s] \"%s\"", asSection, asName); wchar_t* pszIni = (wchar_t*)asIni; int nLen = lstrlen(asIni); LPCWSTR pszSlash = (nLen > 50) ? wcschr(asIni+10, L'/') : NULL; if (pszSlash) { pszIni = (wchar_t*)malloc((nLen+3)*sizeof(*pszIni)); if (pszIni) { lstrcpyn(pszIni, asIni, (pszSlash - asIni + 2)); _wcscat_c(pszIni, nLen+3, L"\n"); _wcscat_c(pszIni, nLen+3, pszSlash+1); } } ReportError(L"Version update information is broken (not found)\n%s\n\n%s\n\nError code=%u", szInfo, pszIni?pszIni:L"<NULL>", nErr); if (pszIni && pszIni != asIni) free(pszIni); }
void RConStartArgs::AppendServerArgs(wchar_t* rsServerCmdLine, INT_PTR cchMax) { if (eConfirmation == RConStartArgs::eConfAlways) _wcscat_c(rsServerCmdLine, cchMax, L" /CONFIRM"); else if (eConfirmation == RConStartArgs::eConfNever) _wcscat_c(rsServerCmdLine, cchMax, L" /NOCONFIRM"); if (InjectsDisable == crb_On) _wcscat_c(rsServerCmdLine, cchMax, L" /NOINJECT"); }
bool CConEmuStart::GetCfgParm(LPCWSTR& cmdLineRest, CESwitch& Val, int nMaxLen, bool bExpandAndDup /*= false*/) { if (Val.Type == sw_Str || Val.Type == sw_EnvStr || Val.Type == sw_PathStr) { SafeFree(Val.Str); } else { Val.Type = bExpandAndDup ? sw_EnvStr : sw_Str; } Val.Exists = false; if (!cmdLineRest || !*cmdLineRest) { _ASSERTE(cmdLineRest && *cmdLineRest); return false; } // Сохраним, может для сообщения об ошибке понадобится LPCWSTR pszName = cmdLineRest; CmdArg szGetCfgParmTemp; if (!(cmdLineRest = NextArg(cmdLineRest, szGetCfgParmTemp))) { return false; } LPCWSTR curCommand = szGetCfgParmTemp.ms_Val; int nLen = _tcslen(curCommand); if (nLen >= nMaxLen) { int nCchSize = nLen+100+_tcslen(pszName); wchar_t* psz = (wchar_t*)calloc(nCchSize,sizeof(wchar_t)); if (psz) { swprintf_c(psz, nCchSize/*#SECURELEN*/, L"Too long %s value (%i chars).\r\n", pszName, nLen); _wcscat_c(psz, nCchSize, curCommand); MBoxA(psz); free(psz); } return false; } // We need independent absolute file paths, Working dir changes during ConEmu session if (bExpandAndDup) Val.Str = GetFullPathNameEx(curCommand); // it allocates memory else Val.SetStr(curCommand, Val.Type); // Ok Val.Exists = (Val.Str && *Val.Str); return true; }
/* ************** */ HMODULE WINAPI OnLoadLibraryWWork(FARPROC lpfn, HookItem *ph, BOOL bMainThread, const wchar_t* lpFileName) { typedef HMODULE(WINAPI* OnLoadLibraryW_t)(const wchar_t* lpFileName); HMODULE module = NULL; OnLoadLibraryLog(NULL,lpFileName); // Спрятать ExtendedConsole.dll с глаз долой, в сервисную папку "ConEmu" if (lpFileName && ((lstrcmpiW(lpFileName, L"ExtendedConsole.dll") == 0) || lstrcmpiW(lpFileName, L"ExtendedConsole64.dll") == 0)) { CESERVER_CONSOLE_MAPPING_HDR *Info = (CESERVER_CONSOLE_MAPPING_HDR*)calloc(1,sizeof(*Info)); if (Info && ::LoadSrvMapping(ghConWnd, *Info)) { size_t cchMax = countof(Info->ComSpec.ConEmuBaseDir)+64; wchar_t* pszFullPath = (wchar_t*)calloc(cchMax,sizeof(*pszFullPath)); if (pszFullPath) { _wcscpy_c(pszFullPath, cchMax, Info->ComSpec.ConEmuBaseDir); _wcscat_c(pszFullPath, cchMax, WIN3264TEST(L"\\ExtendedConsole.dll",L"\\ExtendedConsole64.dll")); module = ((OnLoadLibraryW_t)lpfn)(pszFullPath); SafeFree(pszFullPath); } } SafeFree(Info); } if (!module) module = ((OnLoadLibraryW_t)lpfn)(lpFileName); DWORD dwLoadErrCode = GetLastError(); if (gbLdrDllNotificationUsed) return module; // Issue 1079: Almost hangs with PHP if (lstrcmpi(lpFileName, L"kernel32.dll") == 0) return module; if (PrepareNewModule(module, NULL, lpFileName)) { if (ph && ph->PostCallBack) { SETARGS1(&module,lpFileName); ph->PostCallBack(&args); } } SetLastError(dwLoadErrCode); return module; }
void CSetPgDebug::debugLogShellText(wchar_t* &pszParamEx, LPCWSTR asFile) { _ASSERTE(pszParamEx!=NULL && asFile && *asFile); CEStr szBuf; DWORD cchMax = 32*1024/*32 KB*/; DWORD nRead = 0, nErrCode = (DWORD)-1; #ifdef _DEBUG LPCWSTR pszExt = PointToExt(asFile); bool bCmdBatch = ((lstrcmpi(pszExt, L".bat") == 0) && (lstrcmpi(pszExt, L".cmd") == 0)); #endif // ReadTextFile will use BOM if it exists UINT nDefCP = CP_OEMCP; if (0 == ReadTextFile(asFile, cchMax, szBuf.ms_Val, nRead, nErrCode, nDefCP)) { size_t nAll = 0; wchar_t* pszNew = NULL; nAll = (lstrlen(pszParamEx)+20) + nRead + 1 + 2*lstrlen(asFile); pszNew = (wchar_t*)realloc(pszParamEx, nAll*sizeof(wchar_t)); if (pszNew) { _wcscat_c(pszNew, nAll, L"\r\n\r\n>>>"); _wcscat_c(pszNew, nAll, asFile); _wcscat_c(pszNew, nAll, L"\r\n"); _wcscat_c(pszNew, nAll, szBuf); _wcscat_c(pszNew, nAll, L"\r\n<<<"); _wcscat_c(pszNew, nAll, asFile); pszParamEx = pszNew; } } }
LRESULT CSetPgDebug::OnActivityLogNotify(WPARAM wParam, LPARAM lParam) { switch (((NMHDR*)lParam)->code) { case LVN_ITEMCHANGED: { LPNMLISTVIEW p = (LPNMLISTVIEW)lParam; if ((p->uNewState & LVIS_SELECTED) && (p->iItem >= 0)) { HWND hList = GetDlgItem(mh_Dlg, lbActivityLog); size_t cchText = 65535; wchar_t *szText = (wchar_t*)malloc(cchText*sizeof(*szText)); if (!szText) return 0; szText[0] = 0; if (m_ActivityLoggingType == glt_Processes) { ListView_GetItemText(hList, p->iItem, lpc_App, szText, cchText); SetDlgItemText(mh_Dlg, ebActivityApp, szText); ListView_GetItemText(hList, p->iItem, lpc_Params, szText, cchText); SetDlgItemText(mh_Dlg, ebActivityParm, szText); } else if (m_ActivityLoggingType == glt_Input) { ListView_GetItemText(hList, p->iItem, lic_Type, szText, cchText); _wcscat_c(szText, cchText, L" - "); int nLen = _tcslen(szText); ListView_GetItemText(hList, p->iItem, lic_Dup, szText+nLen, cchText-nLen); SetDlgItemText(mh_Dlg, ebActivityApp, szText); ListView_GetItemText(hList, p->iItem, lic_Event, szText, cchText); SetDlgItemText(mh_Dlg, ebActivityParm, szText); } else if (m_ActivityLoggingType == glt_Commands) { ListView_GetItemText(hList, p->iItem, lcc_Pipe, szText, cchText); SetDlgItemText(mh_Dlg, ebActivityApp, szText); SetDlgItemText(mh_Dlg, ebActivityParm, L""); } else { SetDlgItemText(mh_Dlg, ebActivityApp, L""); SetDlgItemText(mh_Dlg, ebActivityParm, L""); } free(szText); } } //LVN_ITEMCHANGED break; } return 0; }
bool GetSaveDumpName(DWORD dwProcessId, bool bFull, wchar_t* dmpfile, DWORD cchMaxDmpFile) { bool bRc = false; HMODULE hCOMDLG32 = NULL; typedef BOOL (WINAPI* GetSaveFileName_t)(LPOPENFILENAMEW lpofn); GetSaveFileName_t _GetSaveFileName = NULL; if (!gpSrv->DbgInfo.bDebugProcessTree) { if (!hCOMDLG32) hCOMDLG32 = LoadLibraryW(L"COMDLG32.dll"); if (hCOMDLG32 && !_GetSaveFileName) _GetSaveFileName = (GetSaveFileName_t)GetProcAddress(hCOMDLG32, "GetSaveFileNameW"); if (_GetSaveFileName) { OPENFILENAMEW ofn; memset(&ofn,0,sizeof(ofn)); ofn.lStructSize=sizeof(ofn); ofn.hwndOwner = NULL; ofn.lpstrFilter = L"Debug dumps (*.mdmp)\0*.mdmp;*.dmp\0Debug dumps (*.dmp)\0*.dmp;*.mdmp\0\0"; ofn.nFilterIndex = bFull ? 2 : 1; ofn.lpstrFile = dmpfile; ofn.nMaxFile = cchMaxDmpFile; ofn.lpstrTitle = bFull ? L"Save debug full-dump" : L"Save debug mini-dump"; ofn.lpstrDefExt = bFull ? L"dmp" : L"mdmp"; ofn.Flags = OFN_ENABLESIZING|OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT; if (_GetSaveFileName(&ofn)) { bRc = true; } } if (hCOMDLG32) { FreeLibrary(hCOMDLG32); } } if (gpSrv->DbgInfo.bDebugProcessTree || !_GetSaveFileName) { HRESULT dwErr = SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0/*SHGFP_TYPE_CURRENT*/, dmpfile); if (FAILED(dwErr)) { memset(dmpfile, 0, cchMaxDmpFile*sizeof(*dmpfile)); if (GetTempPath(cchMaxDmpFile-32, dmpfile) && *dmpfile) dwErr = S_OK; } if (FAILED(dwErr)) { _printf("\nGetSaveDumpName called, get desktop folder failed, code=%u\n", (DWORD)dwErr); } else { if (*dmpfile && dmpfile[lstrlen(dmpfile)-1] != L'\\') _wcscat_c(dmpfile, cchMaxDmpFile, L"\\"); _wcscat_c(dmpfile, cchMaxDmpFile, L"ConEmuTrap"); CreateDirectory(dmpfile, NULL); INT_PTR nLen = lstrlen(dmpfile); wchar_t szMinor[8] = L""; lstrcpyn(szMinor, _T(MVV_4a), countof(szMinor)); _wsprintf(dmpfile+nLen, SKIPLEN(cchMaxDmpFile-nLen) L"\\Trap-%02u%02u%02u%s-%u.%s", MVV_1, MVV_2, MVV_3,szMinor, dwProcessId, bFull ? L"dmp" : L"mdmp"); bRc = true; } } return bRc; }
wchar_t* RConStartArgs::CreateCommandLine(bool abForTasks /*= false*/) const { wchar_t* pszFull = NULL; size_t cchMaxLen = (pszSpecialCmd ? (lstrlen(pszSpecialCmd) + 3) : 0); // только команда cchMaxLen += (pszStartupDir ? (lstrlen(pszStartupDir) + 20) : 0); // "-new_console:d:..." cchMaxLen += (pszIconFile ? (lstrlen(pszIconFile) + 20) : 0); // "-new_console:C:..." cchMaxLen += (pszWallpaper ? (lstrlen(pszWallpaper) + 20) : 0); // "-new_console:W:..." // Some values may contain 'invalid' symbols (like '<', '>' and so on). They will be escaped. Thats why "len*2". cchMaxLen += (pszRenameTab ? (lstrlen(pszRenameTab)*2 + 20) : 0); // "-new_console:t:..." cchMaxLen += (pszPalette ? (lstrlen(pszPalette)*2 + 20) : 0); // "-new_console:P:..." cchMaxLen += 15; if (RunAsAdministrator == crb_On) cchMaxLen++; // -new_console:a if (RunAsRestricted == crb_On) cchMaxLen++; // -new_console:r cchMaxLen += (pszUserName ? (lstrlen(pszUserName) + 32 // "-new_console:u:<user>:<pwd>" + (pszDomain ? lstrlen(pszDomain) : 0) + (szUserPassword ? lstrlen(szUserPassword) : 0)) : 0); if (ForceUserDialog == crb_On) cchMaxLen++; // -new_console:u if (BackgroundTab == crb_On) cchMaxLen++; // -new_console:b if (ForegroungTab == crb_On) cchMaxLen++; // -new_console:f if (BufHeight == crb_On) cchMaxLen += 32; // -new_console:h<lines> if (LongOutputDisable == crb_On) cchMaxLen++; // -new_console:o if (OverwriteMode == crb_On) cchMaxLen++; // -new_console:w cchMaxLen += (nPTY ? 15 : 0); // -new_console:e if (InjectsDisable == crb_On) cchMaxLen++; // -new_console:i if (ForceNewWindow == crb_On) cchMaxLen++; // -new_console:N if (eConfirmation) cchMaxLen++; // -new_console:c / -new_console:n if (ForceDosBox == crb_On) cchMaxLen++; // -new_console:x if (ForceInherit == crb_On) cchMaxLen++; // -new_console:I if (eSplit) cchMaxLen += 64; // -new_console:s[<SplitTab>T][<Percents>](H|V) pszFull = (wchar_t*)malloc(cchMaxLen*sizeof(*pszFull)); if (!pszFull) { _ASSERTE(pszFull!=NULL); return NULL; } if (pszSpecialCmd) { if ((RunAsAdministrator == crb_On) && abForTasks) _wcscpy_c(pszFull, cchMaxLen, L"*"); else *pszFull = 0; // Не окавычиваем. Этим должен озаботиться пользователь _wcscat_c(pszFull, cchMaxLen, pszSpecialCmd); //131008 - лишние пробелы не нужны wchar_t* pS = pszFull + lstrlen(pszFull); while ((pS > pszFull) && wcschr(L" \t\r\n", *(pS - 1))) *(--pS) = 0; //_wcscat_c(pszFull, cchMaxLen, L" "); } else { *pszFull = 0; } wchar_t szAdd[128] = L""; if (RunAsAdministrator == crb_On) wcscat_c(szAdd, L"a"); else if (RunAsRestricted == crb_On) wcscat_c(szAdd, L"r"); if ((ForceUserDialog == crb_On) && !(pszUserName && *pszUserName)) wcscat_c(szAdd, L"u"); if (BackgroundTab == crb_On) wcscat_c(szAdd, L"b"); else if (ForegroungTab == crb_On) wcscat_c(szAdd, L"f"); if (ForceDosBox == crb_On) wcscat_c(szAdd, L"x"); if (ForceInherit == crb_On) wcscat_c(szAdd, L"I"); if (eConfirmation == eConfAlways) wcscat_c(szAdd, L"c"); else if (eConfirmation == eConfNever) wcscat_c(szAdd, L"n"); if (LongOutputDisable == crb_On) wcscat_c(szAdd, L"o"); if (OverwriteMode == crb_On) wcscat_c(szAdd, L"w"); if (nPTY) wcscat_c(szAdd, (nPTY == 1) ? L"p1" : (nPTY == 2) ? L"p2" : L"p0"); if (InjectsDisable == crb_On) wcscat_c(szAdd, L"i"); if (ForceNewWindow == crb_On) wcscat_c(szAdd, L"N"); if (BufHeight == crb_On) { if (nBufHeight) msprintf(szAdd+lstrlen(szAdd), 16, L"h%u", nBufHeight); else wcscat_c(szAdd, L"h"); } // -new_console:s[<SplitTab>T][<Percents>](H|V) if (eSplit) { wcscat_c(szAdd, L"s"); if (nSplitPane) msprintf(szAdd+lstrlen(szAdd), 16, L"%uT", nSplitPane); if (nSplitValue > 0 && nSplitValue < 1000) { UINT iPercent = (1000-nSplitValue)/10; msprintf(szAdd+lstrlen(szAdd), 16, L"%u", max(1,min(iPercent,99))); } wcscat_c(szAdd, (eSplit == eSplitHorz) ? L"H" : L"V"); } if (szAdd[0]) { _wcscat_c(pszFull, cchMaxLen, (NewConsole == crb_On) ? L" -new_console:" : L" -cur_console:"); _wcscat_c(pszFull, cchMaxLen, szAdd); } struct CopyValues { wchar_t cOpt; bool bEscape; LPCWSTR pVal; } values[] = { {L'd', false, this->pszStartupDir}, {L't', true, this->pszRenameTab}, {L'C', false, this->pszIconFile}, {L'P', true, this->pszPalette}, {L'W', false, this->pszWallpaper}, {0} }; wchar_t szCat[32]; for (CopyValues* p = values; p->cOpt; p++) { if (p->pVal && *p->pVal) { bool bQuot = wcspbrk(p->pVal, L" \"") != NULL; if (bQuot) msprintf(szCat, countof(szCat), (NewConsole == crb_On) ? L" \"-new_console:%c:" : L" \"-cur_console:%c:", p->cOpt); else msprintf(szCat, countof(szCat), (NewConsole == crb_On) ? L" -new_console:%c:" : L" -cur_console:%c:", p->cOpt); _wcscat_c(pszFull, cchMaxLen, szCat); if (p->bEscape) { wchar_t* pD = pszFull + lstrlen(pszFull); const wchar_t* pS = p->pVal; while (*pS) { if (wcschr(L"<>()&|^\"", *pS)) *(pD++) = (*pS == L'"') ? L'"' : L'^'; *(pD++) = *(pS++); } _ASSERTE(pD < (pszFull+cchMaxLen)); *pD = 0; } else { _wcscat_c(pszFull, cchMaxLen, p->pVal); } if (bQuot) _wcscat_c(pszFull, cchMaxLen, L"\""); } } // "-new_console:u:<user>:<pwd>" if (pszUserName && *pszUserName) { _wcscat_c(pszFull, cchMaxLen, (NewConsole == crb_On) ? L" \"-new_console:u:" : L" \"-cur_console:u:"); if (pszDomain && *pszDomain) { _wcscat_c(pszFull, cchMaxLen, pszDomain); _wcscat_c(pszFull, cchMaxLen, L"\\"); } _wcscat_c(pszFull, cchMaxLen, pszUserName); if (*szUserPassword || (ForceUserDialog != crb_On)) { _wcscat_c(pszFull, cchMaxLen, L":"); } if (*szUserPassword) { _wcscat_c(pszFull, cchMaxLen, szUserPassword); } _wcscat_c(pszFull, cchMaxLen, L"\""); } return pszFull; }
INT_PTR CRecreateDlg::RecreateDlgProc(HWND hDlg, UINT messg, WPARAM wParam, LPARAM lParam) { #define UM_USER_CONTROLS (WM_USER+121) #define UM_FILL_CMDLIST (WM_USER+122) CRecreateDlg* pDlg = NULL; if (messg == WM_INITDIALOG) { pDlg = (CRecreateDlg*)lParam; pDlg->mh_Dlg = hDlg; SetWindowLongPtr(hDlg, DWLP_USER, lParam); } else { pDlg = (CRecreateDlg*)GetWindowLongPtr(hDlg, DWLP_USER); } if (!pDlg) { return FALSE; } switch (messg) { case WM_INITDIALOG: { LRESULT lbRc = FALSE; SendMessage(hDlg, WM_SETICON, ICON_BIG, (LPARAM)hClassIcon); SendMessage(hDlg, WM_SETICON, ICON_SMALL, (LPARAM)hClassIconSm); HMENU hSysMenu = GetSystemMenu(hDlg, FALSE); InsertMenu(hSysMenu, 0, MF_BYPOSITION, MF_SEPARATOR, 0); InsertMenu(hSysMenu, 0, MF_BYPOSITION | MF_STRING | MF_ENABLED | ((GetWindowLong(ghOpWnd,GWL_EXSTYLE)&WS_EX_TOPMOST) ? MF_CHECKED : 0), ID_RESETCMDHISTORY, _T("Reset command history...")); SendDlgItemMessage(hDlg, tRunAsPassword, WM_SETFONT, (LPARAM)(HFONT)GetStockObject(DEFAULT_GUI_FONT), 0); //#ifdef _DEBUG //SetWindowPos(ghOpWnd, HWND_NOTOPMOST, 0,0,0,0, SWP_NOSIZE|SWP_NOMOVE); //#endif SendMessage(hDlg, UM_FILL_CMDLIST, TRUE, 0); RConStartArgs* pArgs = pDlg->mp_Args; _ASSERTE(pArgs); LPCWSTR pszCmd = pArgs->pszSpecialCmd ? pArgs->pszSpecialCmd : gpConEmu->ActiveCon()->RCon()->GetCmd(); //int nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pszCmd); //if (nId < 0) SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, 0, (LPARAM)pszCmd); LPCWSTR pszSystem = gpSet->GetCmd(); //if (pszSystem != pszCmd && (pszSystem && pszCmd && (lstrcmpi(pszSystem, pszCmd) != 0))) //{ // nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pszSystem); // if (nId < 0) SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, pArgs->pszSpecialCmd ? -1 : 0, (LPARAM)pszSystem); //} //LPCWSTR pszHistory = gpSet->HistoryGet(); //if (pszHistory) //{ // while (*pszHistory) // { // nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pszHistory); // if (nId < 0) // SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, -1, (LPARAM)pszHistory); // pszHistory += _tcslen(pszHistory)+1; // } //} ////// Обновить группы команд ////gpSet->LoadCmdTasks(NULL); //int nGroup = 0; //const Settings::CommandTasks* pGrp = NULL; //while ((pGrp = gpSet->CmdTaskGet(nGroup++))) //{ // nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pGrp->pszName); // if (nId < 0) // SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, -1, (LPARAM)pGrp->pszName); //} if (pArgs->aRecreate == cra_RecreateTab) { SetDlgItemText(hDlg, IDC_RESTART_CMD, pszCmd); SetDlgItemText(hDlg, IDC_STARTUP_DIR, gpConEmu->ActiveCon()->RCon()->GetDir()); } else { SetDlgItemText(hDlg, IDC_RESTART_CMD, pArgs->pszSpecialCmd ? pArgs->pszSpecialCmd : pszSystem); SetDlgItemText(hDlg, IDC_STARTUP_DIR, pArgs->pszStartupDir ? pArgs->pszStartupDir : L""); } //EnableWindow(GetDlgItem(hDlg, IDC_STARTUP_DIR), FALSE); //#ifndef _DEBUG //EnableWindow(GetDlgItem(hDlg, IDC_CHOOSE_DIR), FALSE); //#endif const wchar_t *pszUser, *pszDomain; BOOL bResticted; int nChecked = rbCurrentUser; wchar_t szCurUser[MAX_PATH*2+1]; DWORD nUserNameLen = countof(szCurUser); if (!GetUserName(szCurUser, &nUserNameLen)) szCurUser[0] = 0; wchar_t szRbCaption[MAX_PATH*3]; lstrcpy(szRbCaption, L"Run as current &user: "******"UPN format" остается в pszUser lstrcpyn(szCurUser, pszUser, MAX_PATH); wcscat_c(szCurUser, L"@"); lstrcpyn(szCurUser+_tcslen(szCurUser), pszDomain, MAX_PATH); } else { // "Старая" нотация domain\user lstrcpyn(szCurUser, pszDomain, MAX_PATH); wcscat_c(szCurUser, L"\\"); lstrcpyn(szCurUser+_tcslen(szCurUser), pszUser, MAX_PATH); } } else { lstrcpyn(szCurUser, pszUser, countof(szCurUser)); } SetDlgItemText(hDlg, tRunAsPassword, L""); } } SetDlgItemText(hDlg, tRunAsUser, szCurUser); CheckRadioButton(hDlg, rbCurrentUser, rbAnotherUser, nChecked); RecreateDlgProc(hDlg, UM_USER_CONTROLS, 0, 0); if (gOSVer.dwMajorVersion < 6) { // В XP и ниже это просто RunAs - с возможностью ввода имени пользователя и пароля //apiShowWindow(GetDlgItem(hDlg, cbRunAsAdmin), SW_HIDE); SetDlgItemTextA(hDlg, cbRunAsAdmin, "&Run as..."); //GCC hack. иначе не собирается // И уменьшить длину RECT rcBox; GetWindowRect(GetDlgItem(hDlg, cbRunAsAdmin), &rcBox); SetWindowPos(GetDlgItem(hDlg, cbRunAsAdmin), NULL, 0, 0, (rcBox.right-rcBox.left)/2, rcBox.bottom-rcBox.top, SWP_NOMOVE|SWP_NOZORDER); } else if (gpConEmu->mb_IsUacAdmin || (pArgs && pArgs->bRunAsAdministrator)) { CheckDlgButton(hDlg, cbRunAsAdmin, BST_CHECKED); if (gpConEmu->mb_IsUacAdmin) // Только в Vista+ если GUI уже запущен под админом { EnableWindow(GetDlgItem(hDlg, cbRunAsAdmin), FALSE); } else if (gOSVer.dwMajorVersion < 6) { RecreateDlgProc(hDlg, WM_COMMAND, cbRunAsAdmin, 0); } } //} SetClassLongPtr(hDlg, GCLP_HICON, (LONG_PTR)hClassIcon); RECT rcBtnBox = {0}; if (pArgs->aRecreate == cra_RecreateTab) { //GCC hack. иначе не собирается SetDlgItemTextA(hDlg, IDC_RESTART_MSG, "About to recreate console"); SendDlgItemMessage(hDlg, IDC_RESTART_ICON, STM_SETICON, (WPARAM)LoadIcon(NULL,IDI_EXCLAMATION), 0); // Выровнять флажок по кнопке GetWindowRect(GetDlgItem(hDlg, IDC_START), &rcBtnBox); // Спрятать флажок "New window" ShowWindow(GetDlgItem(hDlg, cbRunInNewWindow), SW_HIDE); lbRc = TRUE; } else { //GCC hack. иначе не собирается SetDlgItemTextA(hDlg, IDC_RESTART_MSG, "Create new console"); CheckDlgButton(hDlg, cbRunInNewWindow, (pArgs->aRecreate == cra_CreateWindow) ? BST_CHECKED : BST_UNCHECKED); //if (pArgs->aRecreate == cra_CreateWindow) //{ // SetWindowText(hDlg, L"ConEmu - Create new window"); // //GCC hack. иначе не собирается // SetDlgItemTextA(hDlg, IDC_RESTART_MSG, "Create new window"); //} //else //{ // //GCC hack. иначе не собирается // SetDlgItemTextA(hDlg, IDC_RESTART_MSG, "Create new console"); //} SendDlgItemMessage(hDlg, IDC_RESTART_ICON, STM_SETICON, (WPARAM)LoadIcon(NULL,IDI_QUESTION), 0); POINT pt = {0,0}; MapWindowPoints(GetDlgItem(hDlg, IDC_TERMINATE), hDlg, &pt, 1); DestroyWindow(GetDlgItem(hDlg, IDC_TERMINATE)); SetWindowPos(GetDlgItem(hDlg, IDC_START), NULL, pt.x, pt.y, 0,0, SWP_NOSIZE|SWP_NOZORDER); SetDlgItemText(hDlg, IDC_START, L"&Start"); DestroyWindow(GetDlgItem(hDlg, IDC_WARNING)); // Выровнять флажок по кнопке GetWindowRect(GetDlgItem(hDlg, IDC_START), &rcBtnBox); SetFocus(GetDlgItem(hDlg, IDC_RESTART_CMD)); } if (rcBtnBox.left) { // Выровнять флажок по кнопке MapWindowPoints(NULL, hDlg, (LPPOINT)&rcBtnBox, 2); RECT rcBox; GetWindowRect(GetDlgItem(hDlg, cbRunAsAdmin), &rcBox); POINT pt; pt.x = rcBtnBox.left - (rcBox.right - rcBox.left) - 5; pt.y = rcBtnBox.top + ((rcBtnBox.bottom-rcBtnBox.top) - (rcBox.bottom-rcBox.top))/2; SetWindowPos(GetDlgItem(hDlg, cbRunAsAdmin), NULL, pt.x, pt.y, 0,0, SWP_NOSIZE|SWP_NOZORDER); SetFocus(GetDlgItem(hDlg, IDC_RESTART_CMD)); } if (pArgs->aRecreate != cra_RecreateTab) { POINT pt = {}; MapWindowPoints(GetDlgItem(hDlg, cbRunAsAdmin), hDlg, &pt, 1); RECT rcBox2; GetWindowRect(GetDlgItem(hDlg, cbRunInNewWindow), &rcBox2); SetWindowPos(GetDlgItem(hDlg, cbRunInNewWindow), NULL, pt.x-(rcBox2.right-rcBox2.left), pt.y, 0,0, SWP_NOSIZE); } RECT rect; GetWindowRect(hDlg, &rect); RECT rcParent; GetWindowRect(ghWnd, &rcParent); MoveWindow(hDlg, (rcParent.left+rcParent.right-rect.right+rect.left)/2, (rcParent.top+rcParent.bottom-rect.bottom+rect.top)/2, rect.right - rect.left, rect.bottom - rect.top, false); PostMessage(hDlg, (WM_APP+1), 0,0); return lbRc; } case (WM_APP+1): gpConEmu->SetSkipOnFocus(FALSE); return FALSE; case WM_CTLCOLORSTATIC: if (GetDlgItem(hDlg, IDC_WARNING) == (HWND)lParam) { SetTextColor((HDC)wParam, 255); HBRUSH hBrush = GetSysColorBrush(COLOR_3DFACE); SetBkMode((HDC)wParam, TRANSPARENT); return (INT_PTR)hBrush; } break; //case WM_GETICON: // if (wParam==ICON_BIG) // { // /*SetWindowLong(hWnd2, DWL_MSGRESULT, (LRESULT)hClassIcon); // return 1;*/ // } // else // { // SetWindowLongPtr(hDlg, DWLP_MSGRESULT, (LRESULT)hClassIconSm); // return 1; // } // return 0; case UM_FILL_CMDLIST: { RConStartArgs* pArgs = pDlg->mp_Args; _ASSERTE(pArgs); LPCWSTR pszCmd = pArgs->pszSpecialCmd ? pArgs->pszSpecialCmd : gpConEmu->ActiveCon()->RCon()->GetCmd(); int nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pszCmd); if (nId < 0) SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, 0, (LPARAM)pszCmd); LPCWSTR pszSystem = gpSet->GetCmd(); if (pszSystem != pszCmd && (pszSystem && pszCmd && (lstrcmpi(pszSystem, pszCmd) != 0))) { nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pszSystem); if (nId < 0) SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, pArgs->pszSpecialCmd ? -1 : 0, (LPARAM)pszSystem); } if (wParam) { LPCWSTR pszHistory = gpSet->HistoryGet(); if (pszHistory) { while (*pszHistory) { nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pszHistory); if (nId < 0) SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, -1, (LPARAM)pszHistory); pszHistory += _tcslen(pszHistory)+1; } } } //// Обновить группы команд //gpSet->LoadCmdTasks(NULL); int nGroup = 0; const Settings::CommandTasks* pGrp = NULL; while ((pGrp = gpSet->CmdTaskGet(nGroup++))) { nId = SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_FINDSTRINGEXACT, -1, (LPARAM)pGrp->pszName); if (nId < 0) SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_INSERTSTRING, -1, (LPARAM)pGrp->pszName); } } return 0; case UM_USER_CONTROLS: { if (SendDlgItemMessage(hDlg, rbCurrentUser, BM_GETCHECK, 0, 0)) { EnableWindow(GetDlgItem(hDlg, cbRunAsRestricted), TRUE); //BOOL lbText = SendDlgItemMessage(hDlg, cbRunAsRestricted, BM_GETCHECK, 0, 0) == 0; EnableWindow(GetDlgItem(hDlg, tRunAsUser), FALSE); EnableWindow(GetDlgItem(hDlg, tRunAsPassword), FALSE); } else { if (SendDlgItemMessage(hDlg, tRunAsUser, CB_GETCOUNT, 0, 0) == 0) { DWORD dwLevel = 3, dwEntriesRead = 0, dwTotalEntries = 0, dwResumeHandle = 0; NET_API_STATUS nStatus; USER_INFO_3 *info = NULL; nStatus = ::NetUserEnum(NULL, dwLevel, FILTER_NORMAL_ACCOUNT, (PBYTE*) & info, MAX_PREFERRED_LENGTH, &dwEntriesRead, &dwTotalEntries, &dwResumeHandle); if (nStatus == NERR_Success) { for(DWORD i = 0; i < dwEntriesRead; ++i) { // usri3_logon_server "\\*" wchar_t * if ((info[i].usri3_flags & UF_ACCOUNTDISABLE) == 0) SendDlgItemMessage(hDlg, tRunAsUser, CB_ADDSTRING, 0, (LPARAM)info[i].usri3_name); } ::NetApiBufferFree(info); } else { // Добавить хотя бы текущего wchar_t szCurUser[MAX_PATH]; if (GetWindowText(GetDlgItem(hDlg, tRunAsUser), szCurUser, countof(szCurUser))) SendDlgItemMessage(hDlg, tRunAsUser, CB_ADDSTRING, 0, (LPARAM)szCurUser); } } EnableWindow(GetDlgItem(hDlg, cbRunAsRestricted), FALSE); EnableWindow(GetDlgItem(hDlg, tRunAsUser), TRUE); EnableWindow(GetDlgItem(hDlg, tRunAsPassword), TRUE); } if (wParam == rbAnotherUser) SetFocus(GetDlgItem(hDlg, tRunAsUser)); } return 0; case WM_SYSCOMMAND: if (LOWORD(wParam) == ID_RESETCMDHISTORY) { if (IDYES == MessageBox(hDlg, L"Clear command history?", gpConEmu->GetDefaultTitle(), MB_ICONEXCLAMATION|MB_YESNO|MB_DEFBUTTON2)) { gpSet->HistoryReset(); wchar_t* pszCmd = GetDlgItemText(hDlg, IDC_RESTART_CMD); SendDlgItemMessage(hDlg, IDC_RESTART_CMD, CB_RESETCONTENT, 0,0); SendMessage(hDlg, UM_FILL_CMDLIST, FALSE, 0); if (pszCmd) { SetDlgItemText(hDlg, IDC_RESTART_CMD, pszCmd); free(pszCmd); } } SetWindowLongPtr(hDlg, DWLP_MSGRESULT, 0); return 1; } break; case WM_COMMAND: if (HIWORD(wParam) == BN_CLICKED) { switch(LOWORD(wParam)) { case IDC_CHOOSE: { wchar_t *pszFilePath = NULL; int nLen = MAX_PATH*2; pszFilePath = (wchar_t*)calloc(nLen+3,2); // +2*'"'+\0 if (!pszFilePath) return 1; OPENFILENAME ofn; memset(&ofn,0,sizeof(ofn)); ofn.lStructSize=sizeof(ofn); ofn.hwndOwner = hDlg; ofn.lpstrFilter = _T("Executables (*.exe)\0*.exe\0\0"); ofn.nFilterIndex = 1; ofn.lpstrFile = pszFilePath+1; ofn.nMaxFile = nLen; ofn.lpstrTitle = _T("Choose program to run"); ofn.Flags = OFN_ENABLESIZING|OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_HIDEREADONLY|OFN_FILEMUSTEXIST; if (GetOpenFileName(&ofn)) { LPCWSTR pszNewText = pszFilePath + 1; if (wcschr(pszFilePath, L' ')) { pszFilePath[0] = L'"'; _wcscat_c(pszFilePath, nLen+3, L"\""); pszNewText = pszFilePath; } SetDlgItemText(hDlg, IDC_RESTART_CMD, pszNewText); } SafeFree(pszFilePath); return 1; } case IDC_CHOOSE_DIR: { BROWSEINFO bi = {ghWnd}; wchar_t szFolder[MAX_PATH+1] = {0}; GetDlgItemText(hDlg, IDC_STARTUP_DIR, szFolder, countof(szFolder)); bi.pszDisplayName = szFolder; wchar_t szTitle[100]; bi.lpszTitle = wcscpy(szTitle, L"Choose startup directory"); bi.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS | BIF_VALIDATE; bi.lpfn = BrowseCallbackProc; bi.lParam = (LPARAM)szFolder; LPITEMIDLIST pRc = SHBrowseForFolder(&bi); if (pRc) { if (SHGetPathFromIDList(pRc, szFolder)) { SetDlgItemText(hDlg, IDC_STARTUP_DIR, szFolder); } CoTaskMemFree(pRc); } return 1; } case cbRunAsAdmin: { // BCM_SETSHIELD = 5644 BOOL bRunAs = SendDlgItemMessage(hDlg, cbRunAsAdmin, BM_GETCHECK, 0, 0); if (gOSVer.dwMajorVersion >= 6) { SendDlgItemMessage(hDlg, IDC_START, 5644/*BCM_SETSHIELD*/, 0, bRunAs); } if (bRunAs) { CheckRadioButton(hDlg, rbCurrentUser, rbAnotherUser, rbCurrentUser); CheckDlgButton(hDlg, cbRunAsRestricted, BST_UNCHECKED); RecreateDlgProc(hDlg, UM_USER_CONTROLS, 0, 0); } return 1; } case rbCurrentUser: case rbAnotherUser: case cbRunAsRestricted: { RecreateDlgProc(hDlg, UM_USER_CONTROLS, LOWORD(wParam), 0); return 1; } case IDC_START: { RConStartArgs* pArgs = pDlg->mp_Args; _ASSERTE(pArgs); SafeFree(pArgs->pszUserName); SafeFree(pArgs->pszDomain); //SafeFree(pArgs->pszUserPassword); if (SendDlgItemMessage(hDlg, rbAnotherUser, BM_GETCHECK, 0, 0)) { pArgs->bRunAsRestricted = FALSE; pArgs->pszUserName = GetDlgItemText(hDlg, tRunAsUser); if (pArgs->pszUserName) { //pArgs->pszUserPassword = GetDlgItemText(hDlg, tRunAsPassword); // Попытаться проверить правильность введенного пароля и возможность запуска if (!pArgs->CheckUserToken(GetDlgItem(hDlg, tRunAsPassword))) return 1; } } else { pArgs->bRunAsRestricted = SendDlgItemMessage(hDlg, cbRunAsRestricted, BM_GETCHECK, 0, 0); } // Command // pszSpecialCmd мог быть передан аргументом - умолчание для строки ввода SafeFree(pArgs->pszSpecialCmd); // GetDlgItemText выделяет память через calloc pArgs->pszSpecialCmd = GetDlgItemText(hDlg, IDC_RESTART_CMD); if (pArgs->pszSpecialCmd) gpSet->HistoryAdd(pArgs->pszSpecialCmd); // StartupDir (может быть передан аргументом) SafeFree(pArgs->pszStartupDir); wchar_t* pszDir = GetDlgItemText(hDlg, IDC_STARTUP_DIR); wchar_t* pszExpand = (pszDir && wcschr(pszDir, L'%')) ? ExpandEnvStr(pszDir) : NULL; pArgs->pszStartupDir = pszExpand ? pszExpand : pszDir; if (pszExpand) { SafeFree(pszDir) } // Vista+ (As Admin...) pArgs->bRunAsAdministrator = SendDlgItemMessage(hDlg, cbRunAsAdmin, BM_GETCHECK, 0, 0); if (pArgs->aRecreate != cra_RecreateTab) { if (SendDlgItemMessage(hDlg, cbRunInNewWindow, BM_GETCHECK, 0, 0)) pArgs->aRecreate = cra_CreateWindow; else pArgs->aRecreate = cra_CreateTab; } pDlg->mn_DlgRc = IDC_START; EndDialog(hDlg, IDC_START); return 1; } case IDC_TERMINATE: pDlg->mn_DlgRc = IDC_TERMINATE; EndDialog(hDlg, IDC_TERMINATE); return 1; case IDCANCEL: pDlg->mn_DlgRc = IDCANCEL; EndDialog(hDlg, IDCANCEL); return 1; } } break; default: return 0; } return 0; }
size_t CDefTermHk::GetSrvAddArgs(bool bGuiArgs, CmdArg& rsArgs, CmdArg& rsNewCon) { rsArgs.Empty(); rsNewCon.Empty(); if (!this) return 0; size_t cchMax = 64 + ((m_Opt.pszConfigName && *m_Opt.pszConfigName) ? lstrlen(m_Opt.pszConfigName) : 0); wchar_t* psz = rsArgs.GetBuffer(cchMax); size_t cchNew = 32; // "-new_console:ni" wchar_t* pszNew = rsNewCon.GetBuffer(cchNew); if (!psz || !pszNew) return 0; *psz = 0; *pszNew = 0; wchar_t szNewConSw[10] = L""; // Do not inject ConEmuHk in the target process? if (m_Opt.bNoInjects && !bGuiArgs) _wcscat_c(psz, cchMax, L" /NOINJECT"); else if (m_Opt.bNoInjects) wcscat_c(szNewConSw, L"i"); // New or existing window we shall use? if (m_Opt.bNewWindow && !bGuiArgs) _wcscat_c(psz, cchMax, L" /GHWND=NEW"); else if (m_Opt.bNewWindow) _wcscat_c(psz, cchMax, L" /NOSINGLE"); else if (bGuiArgs) _wcscat_c(psz, cchMax, L" /REUSE"); // Confirmations if (m_Opt.nDefaultTerminalConfirmClose == 1) { if (!bGuiArgs) _wcscat_c(psz, cchMax, L" /CONFIRM"); else wcscat_c(szNewConSw, L"c"); } else if (m_Opt.nDefaultTerminalConfirmClose == 2) { if (!bGuiArgs) _wcscat_c(psz, cchMax, L" /NOCONFIRM"); else wcscat_c(szNewConSw, L"n"); } // That switch must be processed in server too! if (m_Opt.pszConfigName && *m_Opt.pszConfigName) { _wcscat_c(psz, cchMax, L" /CONFIG \""); _wcscat_c(psz, cchMax, m_Opt.pszConfigName); _wcscat_c(psz, cchMax, L"\""); } if (*szNewConSw) { _wcscpy_c(pszNew, cchNew, L"-new_console:"); _wcscat_c(pszNew, cchNew, szNewConSw); _wcscat_c(pszNew, cchNew, L" "); } size_t cchLen = wcslen(psz) + wcslen(pszNew); return cchLen; }
void CSetPgIntegr::RegisterShell(LPCWSTR asName, LPCWSTR asMode, LPCWSTR asConfig, LPCWSTR asCmd, LPCWSTR asIcon) { if (!asName || !*asName) asName = L"ConEmu"; if (!asCmd || !*asCmd) asCmd = CONEMU_HERE_CMD; asCmd = SkipNonPrintable(asCmd); #ifdef _DEBUG CEStr szMode(asMode); _ASSERTE(szMode.IsSwitch(L"-here") || szMode.IsSwitch(L"-inside") || szMode.IsSwitch(L"-inside:")); #endif CEStr lsExta; LPCWSTR pszExtraArgs = gpConEmu->MakeConEmuStartArgs(lsExta, asConfig); size_t cchMax = _tcslen(gpConEmu->ms_ConEmuExe) + (asMode ? (_tcslen(asMode) + 3) : 0) + (pszExtraArgs ? (_tcslen(pszExtraArgs) + 1) : 0) + _tcslen(asCmd) + 32; wchar_t* pszCmd = (wchar_t*)malloc(cchMax*sizeof(*pszCmd)); if (!pszCmd) return; //[HKEY_CURRENT_USER\Software\Classes\*\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\*\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /cmd {powershell} -cur_console:n" //[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /cmd {powershell} -cur_console:n" //[HKEY_CURRENT_USER\Software\Classes\Directory\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\Directory\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /dir \"%1\" /cmd {powershell} -cur_console:n" //[HKEY_CURRENT_USER\Software\Classes\Drive\shell\ConEmu inside] //"Icon"="C:\\Program Files\\ConEmu\\ConEmu.exe,1" //[HKEY_CURRENT_USER\Software\Classes\Drive\shell\ConEmu inside\command] //@="C:\\Program Files\\ConEmu\\ConEmu.exe /inside /config shell /dir \"%1\" /cmd {powershell} -cur_console:n" int iSucceeded = 0; bool bHasLibraries = IsWindows7; for (int i = 1; i <= 6; i++) { _wcscpy_c(pszCmd, cchMax, L"\""); _wcscat_c(pszCmd, cchMax, gpConEmu->ms_ConEmuExe); _wcscat_c(pszCmd, cchMax, L"\" "); // `-here`, `-inside` or `-inside:cd ...` if (asMode && *asMode) { bool bQ = IsQuotationNeeded(asMode); if (bQ) _wcscat_c(pszCmd, cchMax, L"\""); _wcscat_c(pszCmd, cchMax, asMode); _wcscat_c(pszCmd, cchMax, bQ ? L"\" " : L" "); } // -FontDir, -LoadCfgFile, -Config, etc. if (pszExtraArgs && *pszExtraArgs) { _wcscat_c(pszCmd, cchMax, pszExtraArgs); _wcscat_c(pszCmd, cchMax, L" "); } LPCWSTR pszRoot = NULL; switch (i) { case 1: pszRoot = L"Software\\Classes\\*\\shell"; break; case 2: pszRoot = L"Software\\Classes\\Directory\\Background\\shell"; break; case 3: if (!bHasLibraries) continue; pszRoot = L"Software\\Classes\\LibraryFolder\\Background\\shell"; break; case 4: pszRoot = L"Software\\Classes\\Directory\\shell"; _wcscat_c(pszCmd, cchMax, L"-dir \"%1\" "); break; case 5: pszRoot = L"Software\\Classes\\Drive\\shell"; _wcscat_c(pszCmd, cchMax, L"-dir \"%1\" "); break; case 6: // Issue 1191: ConEmu was launched instead of explorer from taskbar pinned library icon continue; //if (!bHasLibraries) // continue; //pszRoot = L"Software\\Classes\\LibraryFolder\\shell"; //_wcscat_c(pszCmd, cchMax, L"-dir \"%1\" "); //break; } bool bCmdKeyExist = false; if (*asCmd == L'/') { CEStr lsArg; LPCWSTR pszTemp = asCmd; while (0 == NextArg(&pszTemp, lsArg)) { if (lsArg.OneOfSwitches(L"-run",L"-runlist",L"-cmd",L"-cmdlist")) { bCmdKeyExist = true; break; } } } if (!bCmdKeyExist) _wcscat_c(pszCmd, cchMax, L"-run "); _wcscat_c(pszCmd, cchMax, asCmd); HKEY hkRoot; if (0 == RegCreateKeyEx(HKEY_CURRENT_USER, pszRoot, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkRoot, NULL)) { HKEY hkConEmu; if (0 == RegCreateKeyEx(hkRoot, asName, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkConEmu, NULL)) { // Если задана "иконка" if (asIcon) RegSetValueEx(hkConEmu, L"Icon", 0, REG_SZ, (LPBYTE)asIcon, (lstrlen(asIcon)+1)*sizeof(*asIcon)); else RegDeleteValue(hkConEmu, L"Icon"); // Команда HKEY hkCmd; if (0 == RegCreateKeyEx(hkConEmu, L"command", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkCmd, NULL)) { if (0 == RegSetValueEx(hkCmd, NULL, 0, REG_SZ, (LPBYTE)pszCmd, (lstrlen(pszCmd)+1)*sizeof(*pszCmd))) iSucceeded++; RegCloseKey(hkCmd); } RegCloseKey(hkConEmu); } RegCloseKey(hkRoot); } } free(pszCmd); }
// В asDir могут быть переменные окружения. wchar_t* CConEmuUpdate::CreateTempFile(LPCWSTR asDir, LPCWSTR asFileNameTempl, HANDLE& hFile) { wchar_t szFile[MAX_PATH*2+2]; wchar_t szName[128]; if (!asDir || !*asDir) asDir = L"%TEMP%\\ConEmu"; if (!asFileNameTempl || !*asFileNameTempl) asFileNameTempl = L"ConEmu.tmp"; if (wcschr(asDir, L'%')) { DWORD nExp = ExpandEnvironmentStrings(asDir, szFile, MAX_PATH); if (!nExp || (nExp >= MAX_PATH)) { ReportError(L"CreateTempFile.ExpandEnvironmentStrings(%s) failed, code=%u", asDir, GetLastError()); return NULL; } } else { lstrcpyn(szFile, asDir, MAX_PATH); } // Checking %TEMP% for valid path LPCWSTR pszColon1, pszColon2; if ((pszColon1 = wcschr(szFile, L':')) != NULL) { if ((pszColon2 = wcschr(pszColon1+1, L':')) != NULL) { ReportError(L"Invalid download path (%%TEMP%% variable?)\n%s", szFile, 0); return NULL; } } int nLen = lstrlen(szFile); if (nLen <= 0) { ReportError(L"CreateTempFile.asDir(%s) failed, path is null", asDir, 0); return NULL; } if (szFile[nLen-1] != L'\\') { szFile[nLen++] = L'\\'; szFile[nLen] = 0; } wchar_t* pszFilePart = szFile + nLen; wchar_t* pszDirectory = lstrdup(szFile); LPCWSTR pszName = PointToName(asFileNameTempl); _ASSERTE(pszName == asFileNameTempl); if (!pszName || !*pszName || (*pszName == L'.')) { _ASSERTE(pszName && *pszName && (*pszName != L'.')); pszName = L"ConEmu"; } LPCWSTR pszExt = PointToExt(pszName); if (pszExt == NULL) { _ASSERTE(pszExt != NULL); pszExt = L".tmp"; } lstrcpyn(szName, pszName, countof(szName)-16); wchar_t* psz = wcsrchr(szName, L'.'); if (psz) *psz = 0; wchar_t* pszResult = NULL; DWORD dwErr = 0; for (UINT i = 0; i <= 9999; i++) { _wcscpy_c(pszFilePart, MAX_PATH, szName); if (i) _wsprintf(pszFilePart+_tcslen(pszFilePart), SKIPLEN(16) L"(%u)", i); _wcscat_c(pszFilePart, MAX_PATH, pszExt); hFile = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL|FILE_ATTRIBUTE_TEMPORARY, NULL); //ERROR_PATH_NOT_FOUND? if (!hFile || (hFile == INVALID_HANDLE_VALUE)) { dwErr = GetLastError(); // на первом обломе - попытаться создать директорию, может ее просто нет? if ((dwErr == ERROR_PATH_NOT_FOUND) && (i == 0)) { if (!MyCreateDirectory(pszDirectory)) { ReportError(L"CreateTempFile.asDir(%s) failed", asDir, 0); goto wrap; } } } if (hFile && hFile != INVALID_HANDLE_VALUE) { psz = lstrdup(szFile); if (!psz) { CloseHandle(hFile); hFile = NULL; ReportError(L"Can't allocate memory (%i bytes)", lstrlen(szFile)); } pszResult = psz; goto wrap; } } ReportError(L"Can't create temp file(%s), code=%u", szFile, dwErr); hFile = NULL; wrap: SafeFree(pszDirectory); return pszResult; }
static bool InitializeClink() { if (gnCmdInitialized) return true; gnCmdInitialized = 1; // Single //if (!gnAllowClinkUsage) // return false; CESERVER_CONSOLE_MAPPING_HDR* pConMap = GetConMap(); if (!pConMap /*|| !(pConMap->Flags & CECF_UseClink_Any)*/) { //gnAllowClinkUsage = 0; gnCmdInitialized = -1; return false; } // Запомнить режим //gnAllowClinkUsage = // (pConMap->Flags & CECF_UseClink_2) ? 2 : // (pConMap->Flags & CECF_UseClink_1) ? 1 : // CECF_Empty; gbAllowClinkUsage = ((pConMap->Flags & CECF_UseClink_Any) != 0); gbAllowUncPaths = (pConMap->ComSpec.isAllowUncPaths != FALSE); if (gbAllowClinkUsage) { wchar_t szClinkBat[MAX_PATH+32]; wcscpy_c(szClinkBat, pConMap->ComSpec.ConEmuBaseDir); wcscat_c(szClinkBat, L"\\clink\\clink.bat"); if (!FileExists(szClinkBat)) { gbAllowClinkUsage = false; } else { int iLen = lstrlen(szClinkBat) + 16; gszClinkCmdLine = (wchar_t*)malloc(iLen*sizeof(*gszClinkCmdLine)); if (gszClinkCmdLine) { *gszClinkCmdLine = L'"'; _wcscpy_c(gszClinkCmdLine+1, iLen-1, szClinkBat); _wcscat_c(gszClinkCmdLine, iLen, L"\" inject"); } } } return true; //BOOL bRunRc = FALSE; //DWORD nErrCode = 0; //if (gnAllowClinkUsage == 2) //{ // // New style. TODO // wchar_t szClinkDir[MAX_PATH+32], szClinkArgs[MAX_PATH+64]; // wcscpy_c(szClinkDir, pConMap->ComSpec.ConEmuBaseDir); // wcscat_c(szClinkDir, L"\\clink"); // wcscpy_c(szClinkArgs, L"\""); // wcscat_c(szClinkArgs, szClinkDir); // wcscat_c(szClinkArgs, WIN3264TEST(L"\\clink_x86.exe",L"\\clink_x64.exe")); // wcscat_c(szClinkArgs, L"\" inject"); // STARTUPINFO si = {sizeof(si)}; // PROCESS_INFORMATION pi = {}; // bRunRc = CreateProcess(NULL, szClinkArgs, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, szClinkDir, &si, &pi); // // if (bRunRc) // { // WaitForSingleObject(pi.hProcess, INFINITE); // CloseHandle(pi.hProcess); // CloseHandle(pi.hThread); // } // else // { // nErrCode = GetLastError(); // _ASSERTEX(FALSE && "Clink loader failed"); // UNREFERENCED_PARAMETER(nErrCode); // UNREFERENCED_PARAMETER(bRunRc); // } //} //else if (gnAllowClinkUsage == 1) //{ // if (!ghClinkDll) // { // wchar_t szClinkModule[MAX_PATH+30]; // _wsprintf(szClinkModule, SKIPLEN(countof(szClinkModule)) L"%s\\clink\\%s", // pConMap->ComSpec.ConEmuBaseDir, WIN3264TEST(L"clink_dll_x86.dll",L"clink_dll_x64.dll")); // // ghClinkDll = LoadLibrary(szClinkModule); // if (!ghClinkDll) // return false; // } // if (!gpfnClinkReadLine) // { // gpfnClinkReadLine = (call_readline_t)GetProcAddress(ghClinkDll, "call_readline"); // _ASSERTEX(gpfnClinkReadLine!=NULL); // } //} //return (gpfnClinkReadLine != NULL); }
wchar_t* RConStartArgs::CreateCommandLine(bool abForTasks /*= false*/) { wchar_t* pszFull = NULL; size_t cchMaxLen = (pszSpecialCmd ? (lstrlen(pszSpecialCmd) + 3) : 0); // только команда cchMaxLen += (pszStartupDir ? (lstrlen(pszStartupDir) + 20) : 0); // "-new_console:d:..." cchMaxLen += (pszRenameTab ? (lstrlen(pszRenameTab) + 20) : 0); // "-new_console:t:..." cchMaxLen += (bRunAsAdministrator ? 15 : 0); // -new_console:a cchMaxLen += (bRunAsRestricted ? 15 : 0); // -new_console:r cchMaxLen += (pszUserName ? (lstrlen(pszUserName) + 32 // "-new_console:u:<user>:<pwd>" + (pszDomain ? lstrlen(pszDomain) : 0) + (szUserPassword ? lstrlen(szUserPassword) : 0)) : 0); cchMaxLen += (bForceUserDialog ? 15 : 0); // -new_console:u cchMaxLen += (bBackgroundTab ? 15 : 0); // -new_console:b cchMaxLen += (bBufHeight ? 32 : 0); // -new_console:h<lines> cchMaxLen += (bLongOutputDisable ? 15 : 0); // -new_console:o cchMaxLen += (bOverwriteMode ? 15 : 0); // -new_console:w cchMaxLen += (nPTY ? 15 : 0); // -new_console:e cchMaxLen += (bInjectsDisable ? 15 : 0); // -new_console:i cchMaxLen += (eConfirmation ? 15 : 0); // -new_console:c / -new_console:n cchMaxLen += (bForceDosBox ? 15 : 0); // -new_console:x cchMaxLen += (eSplit ? 64 : 0); // -new_console:s[<SplitTab>T][<Percents>](H|V) pszFull = (wchar_t*)malloc(cchMaxLen*sizeof(*pszFull)); if (!pszFull) { _ASSERTE(pszFull!=NULL); return NULL; } if (pszSpecialCmd) { if (bRunAsAdministrator && abForTasks) _wcscpy_c(pszFull, cchMaxLen, L"*"); else *pszFull = 0; // Не окавычиваем. Этим должен озаботиться пользователь _wcscat_c(pszFull, cchMaxLen, pszSpecialCmd); _wcscat_c(pszFull, cchMaxLen, L" "); } else { *pszFull = 0; } wchar_t szAdd[128] = L""; if (bRunAsAdministrator) wcscat_c(szAdd, L"a"); else if (bRunAsRestricted) wcscat_c(szAdd, L"r"); if (bForceUserDialog) wcscat_c(szAdd, L"u"); if (bBackgroundTab) wcscat_c(szAdd, L"b"); if (bForceDosBox) wcscat_c(szAdd, L"x"); if (eConfirmation == eConfAlways) wcscat_c(szAdd, L"c"); else if (eConfirmation == eConfNever) wcscat_c(szAdd, L"n"); if (bLongOutputDisable) wcscat_c(szAdd, L"o"); if (bOverwriteMode) wcscat_c(szAdd, L"w"); if (nPTY) wcscat_c(szAdd, (nPTY == 1) ? L"p1" : (nPTY == 2) ? L"p2" : L"p0"); if (bInjectsDisable) wcscat_c(szAdd, L"i"); if (bBufHeight) { if (nBufHeight) _wsprintf(szAdd+lstrlen(szAdd), SKIPLEN(16) L"h%u", nBufHeight); else wcscat_c(szAdd, L"h"); } // -new_console:s[<SplitTab>T][<Percents>](H|V) if (eSplit) { wcscat_c(szAdd, L"s"); if (nSplitPane) _wsprintf(szAdd+lstrlen(szAdd), SKIPLEN(16) L"%uT", nSplitPane); if ((int)(nSplitValue/10) != 0) _wsprintf(szAdd+lstrlen(szAdd), SKIPLEN(16) L"%u", (UINT)(nSplitValue/10)); wcscat_c(szAdd, (eSplit == eSplitHorz) ? L"H" : L"V"); } if (szAdd[0]) { _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" -new_console:" : L" -cur_console:"); _wcscat_c(pszFull, cchMaxLen, szAdd); } // "-new_console:d:..." if (pszStartupDir && *pszStartupDir) { bool bQuot = wcschr(pszStartupDir, L' ') != NULL; if (bQuot) _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" \"-new_console:d:" : L" \"-cur_console:d:"); else _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" -new_console:d:" : L" -cur_console:d:"); _wcscat_c(pszFull, cchMaxLen, pszStartupDir); if (bQuot) _wcscat_c(pszFull, cchMaxLen, L"\""); } // "-new_console:t:..." if (pszRenameTab && *pszRenameTab) { bool bQuot = wcschr(pszRenameTab, L' ') != NULL; if (bQuot) _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" \"-new_console:t:" : L" \"-cur_console:t:"); else _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" -new_console:t:" : L" -cur_console:t:"); _wcscat_c(pszFull, cchMaxLen, pszRenameTab); if (bQuot) _wcscat_c(pszFull, cchMaxLen, L"\""); } // "-new_console:u:<user>:<pwd>" if (pszUserName && *pszUserName) { _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" \"-new_console:u:" : L" \"-cur_console:u:"); if (pszDomain && *pszDomain) { _wcscat_c(pszFull, cchMaxLen, pszDomain); _wcscat_c(pszFull, cchMaxLen, L"\\"); } _wcscat_c(pszFull, cchMaxLen, pszUserName); if (szUserPassword) { _wcscat_c(pszFull, cchMaxLen, L":"); _wcscat_c(pszFull, cchMaxLen, szUserPassword); } _wcscat_c(pszFull, cchMaxLen, L"\""); } return pszFull; }
DWORD CDefTermHk::StartConsoleServer(DWORD nAttachPID, bool bNewConWnd, PHANDLE phSrvProcess) { // Options must be loaded already const CEDefTermOpt* pOpt = GetOpt(); if (!pOpt || !isDefTermEnabled()) { LogHookingStatus(L"Applicatio skipped by settings"); return 0; } bool bAttachCreated = false; CmdArg szAddArgs, szAddArgs2; size_t cchAddArgLen; size_t cchMax; wchar_t* pszCmdLine; DWORD nErr = 0; STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {}; cchAddArgLen = GetSrvAddArgs(false, szAddArgs, szAddArgs2); wchar_t szExeName[MAX_PATH] = L""; if (GetModuleFileName(NULL, szExeName, countof(szExeName)) && szExeName[0]) cchAddArgLen += 20 + lstrlen(szExeName); cchMax = MAX_PATH+100+cchAddArgLen; pszCmdLine = (wchar_t*)malloc(cchMax*sizeof(*pszCmdLine)); if (pszCmdLine) { _ASSERTE(nAttachPID || bNewConWnd); msprintf(pszCmdLine, cchMax, L"\"%s\\%s\" /ATTACH %s/TRMPID=%u", pOpt->pszConEmuBaseDir, WIN3264TEST(L"ConEmuC.exe",L"ConEmuC64.exe"), bNewConWnd ? L"/CREATECON " : L"", nAttachPID); if (szExeName[0]) { _wcscat_c(pszCmdLine, cchMax, L" /ROOTEXE \""); _wcscat_c(pszCmdLine, cchMax, szExeName); _wcscat_c(pszCmdLine, cchMax, L"\""); } if (!szAddArgs.IsEmpty()) _wcscat_c(pszCmdLine, cchMax, szAddArgs); _ASSERTEX(szAddArgs2.IsEmpty()); // No "-new_console" switches are expected here! DWORD nCreateFlags = NORMAL_PRIORITY_CLASS | (bNewConWnd ? CREATE_NEW_CONSOLE : 0); if (bNewConWnd) { si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW; } LogHookingStatus(pszCmdLine); if (CreateProcess(NULL, pszCmdLine, NULL, NULL, FALSE, nCreateFlags, NULL, pOpt->pszConEmuBaseDir, &si, &pi)) { LogHookingStatus(L"Console server was successfully created"); bAttachCreated = true; if (phSrvProcess) *phSrvProcess = pi.hProcess; else CloseHandle(pi.hProcess); CloseHandle(pi.hThread); SetServerPID(pi.dwProcessId); } else { nErr = GetLastError(); wchar_t* pszErrMsg = (wchar_t*)malloc(MAX_PATH*3*sizeof(*pszErrMsg)); if (pszErrMsg) { msprintf(pszErrMsg, MAX_PATH*3, L"ConEmuHk: Failed to start attach server, Err=%u! %s\n", nErr, pszCmdLine); LogHookingStatus(pszErrMsg); wchar_t szTitle[64]; msprintf(szTitle, countof(szTitle), WIN3264TEST(L"ConEmuHk",L"ConEmuHk64") L", PID=%u", GetCurrentProcessId()); //OutputDebugString(pszErrMsg); MessageBox(NULL, pszErrMsg, szTitle, MB_ICONSTOP|MB_SYSTEMMODAL); free(pszErrMsg); } // Failed to start, pi.dwProcessId must be 0 _ASSERTEX(pi.dwProcessId==0); pi.dwProcessId = 0; } free(pszCmdLine); } return pi.dwProcessId; }
LPCWSTR GetComspecFromEnvVar(wchar_t* pszComspec, DWORD cchMax, ComSpecBits Bits/* = csb_SameOS*/) { if (!pszComspec || (cchMax < MAX_PATH)) { _ASSERTE(pszComspec && (cchMax >= MAX_PATH)); return NULL; } *pszComspec = 0; BOOL bWin64 = IsWindows64(); if (!((Bits == csb_x32) || (Bits == csb_x64))) { if (GetEnvironmentVariable(L"ComSpec", pszComspec, cchMax)) { // Не должен быть (даже случайно) ConEmuC.exe const wchar_t* pszName = PointToName(pszComspec); if (!pszName || !lstrcmpi(pszName, L"ConEmuC.exe") || !lstrcmpi(pszName, L"ConEmuC64.exe") || !FileExists(pszComspec)) // ну и существовать должен { pszComspec[0] = 0; } } } // Если не удалось определить через переменную окружения - пробуем обычный "cmd.exe" из System32 if (pszComspec[0] == 0) { int n = GetWindowsDirectory(pszComspec, cchMax - 20); if (n > 0 && (((DWORD)n) < (cchMax - 20))) { // Добавить \System32\cmd.exe // Warning! 'c:\Windows\SysNative\cmd.exe' не прокатит, т.к. доступен // только для 32битных приложений. А нам нужно в общем виде. // Если из 32битного нужно запустить 64битный cmd.exe - нужно выключать редиректор. if (!bWin64 || (Bits != csb_x32)) { _wcscat_c(pszComspec, cchMax, (pszComspec[n-1] == L'\\') ? L"System32\\cmd.exe" : L"\\System32\\cmd.exe"); } else { _wcscat_c(pszComspec, cchMax, (pszComspec[n-1] == L'\\') ? L"SysWOW64\\cmd.exe" : L"\\SysWOW64\\cmd.exe"); } } } if (pszComspec[0] && !FileExists(pszComspec)) { _ASSERTE("Comspec not found! File not exists!"); pszComspec[0] = 0; } // Last chance if (pszComspec[0] == 0) { _ASSERTE(pszComspec[0] != 0); // Уже должен был быть определен //lstrcpyn(pszComspec, L"cmd.exe", cchMax); wchar_t *psFilePart; DWORD n = SearchPathW(NULL, L"cmd.exe", NULL, cchMax, pszComspec, &psFilePart); if (!n || (n >= cchMax)) _wcscpy_c(pszComspec, cchMax, L"cmd.exe"); } return pszComspec; }
wchar_t* RConStartArgs::CreateCommandLine(bool abForTasks /*= false*/) { wchar_t* pszFull = NULL; size_t cchMaxLen = (pszSpecialCmd ? (lstrlen(pszSpecialCmd) + 3) : 0); // только команда cchMaxLen += (pszStartupDir ? (lstrlen(pszStartupDir) + 20) : 0); // "-new_console:d:..." cchMaxLen += (pszRenameTab ? (lstrlen(pszRenameTab)*2 + 20) : 0); // "-new_console:t:..." cchMaxLen += (pszIconFile ? (lstrlen(pszIconFile) + 20) : 0); // "-new_console:C:..." cchMaxLen += (pszPalette ? (lstrlen(pszPalette)*2 + 20) : 0); // "-new_console:P:..." cchMaxLen += (pszWallpaper ? (lstrlen(pszWallpaper) + 20) : 0); // "-new_console:W:..." cchMaxLen += (bRunAsAdministrator ? 15 : 0); // -new_console:a cchMaxLen += (bRunAsRestricted ? 15 : 0); // -new_console:r cchMaxLen += (pszUserName ? (lstrlen(pszUserName) + 32 // "-new_console:u:<user>:<pwd>" + (pszDomain ? lstrlen(pszDomain) : 0) + (szUserPassword ? lstrlen(szUserPassword) : 0)) : 0); cchMaxLen += (bForceUserDialog ? 15 : 0); // -new_console:u cchMaxLen += (bBackgroundTab ? 15 : 0); // -new_console:b cchMaxLen += (bForegroungTab ? 15 : 0); // -new_console:f cchMaxLen += (bBufHeight ? 32 : 0); // -new_console:h<lines> cchMaxLen += (bLongOutputDisable ? 15 : 0); // -new_console:o cchMaxLen += (bOverwriteMode ? 15 : 0); // -new_console:w cchMaxLen += (nPTY ? 15 : 0); // -new_console:e cchMaxLen += (bInjectsDisable ? 15 : 0); // -new_console:i cchMaxLen += (eConfirmation ? 15 : 0); // -new_console:c / -new_console:n cchMaxLen += (bForceDosBox ? 15 : 0); // -new_console:x cchMaxLen += (bForceInherit ? 15 : 0); // -new_console:I cchMaxLen += (eSplit ? 64 : 0); // -new_console:s[<SplitTab>T][<Percents>](H|V) pszFull = (wchar_t*)malloc(cchMaxLen*sizeof(*pszFull)); if (!pszFull) { _ASSERTE(pszFull!=NULL); return NULL; } if (pszSpecialCmd) { if (bRunAsAdministrator && abForTasks) _wcscpy_c(pszFull, cchMaxLen, L"*"); else *pszFull = 0; // Не окавычиваем. Этим должен озаботиться пользователь _wcscat_c(pszFull, cchMaxLen, pszSpecialCmd); _wcscat_c(pszFull, cchMaxLen, L" "); } else { *pszFull = 0; } wchar_t szAdd[128] = L""; if (bRunAsAdministrator) wcscat_c(szAdd, L"a"); else if (bRunAsRestricted) wcscat_c(szAdd, L"r"); if (bForceUserDialog) wcscat_c(szAdd, L"u"); if (bBackgroundTab) wcscat_c(szAdd, L"b"); else if (bForegroungTab) wcscat_c(szAdd, L"f"); if (bForceDosBox) wcscat_c(szAdd, L"x"); if (bForceInherit) wcscat_c(szAdd, L"I"); if (eConfirmation == eConfAlways) wcscat_c(szAdd, L"c"); else if (eConfirmation == eConfNever) wcscat_c(szAdd, L"n"); if (bLongOutputDisable) wcscat_c(szAdd, L"o"); if (bOverwriteMode) wcscat_c(szAdd, L"w"); if (nPTY) wcscat_c(szAdd, (nPTY == 1) ? L"p1" : (nPTY == 2) ? L"p2" : L"p0"); if (bInjectsDisable) wcscat_c(szAdd, L"i"); if (bBufHeight) { if (nBufHeight) _wsprintf(szAdd+lstrlen(szAdd), SKIPLEN(16) L"h%u", nBufHeight); else wcscat_c(szAdd, L"h"); } // -new_console:s[<SplitTab>T][<Percents>](H|V) if (eSplit) { wcscat_c(szAdd, L"s"); if (nSplitPane) _wsprintf(szAdd+lstrlen(szAdd), SKIPLEN(16) L"%uT", nSplitPane); if (nSplitValue > 0 && nSplitValue < 1000) { UINT iPercent = (1000-nSplitValue)/10; _wsprintf(szAdd+lstrlen(szAdd), SKIPLEN(16) L"%u", max(1,min(iPercent,99))); } wcscat_c(szAdd, (eSplit == eSplitHorz) ? L"H" : L"V"); } if (szAdd[0]) { _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" -new_console:" : L" -cur_console:"); _wcscat_c(pszFull, cchMaxLen, szAdd); } struct CopyValues { wchar_t cOpt; bool bEscape; LPCWSTR pVal; } values[] = { {L'd', false, this->pszStartupDir}, {L't', true, this->pszRenameTab}, {L'C', false, this->pszIconFile}, {L'P', true, this->pszPalette}, {L'W', false, this->pszWallpaper}, {0} }; wchar_t szCat[32]; for (CopyValues* p = values; p->cOpt; p++) { if (p->pVal && *p->pVal) { bool bQuot = wcspbrk(p->pVal, L" \"") != NULL; if (bQuot) msprintf(szCat, countof(szCat), bNewConsole ? L" \"-new_console:%c:" : L" \"-cur_console:%c:", p->cOpt); else msprintf(szCat, countof(szCat), bNewConsole ? L" -new_console:%c:" : L" -cur_console:%c:", p->cOpt); _wcscat_c(pszFull, cchMaxLen, szCat); if (p->bEscape) { wchar_t* pD = pszFull + lstrlen(pszFull); const wchar_t* pS = p->pVal; while (*pS) { if (wcschr(L"<>()&|^\"", *pS)) *(pD++) = (*pS == L'"') ? L'"' : L'^'; *(pD++) = *(pS++); } _ASSERTE(pD < (pszFull+cchMaxLen)); *pD = 0; } else { _wcscat_c(pszFull, cchMaxLen, p->pVal); } if (bQuot) _wcscat_c(pszFull, cchMaxLen, L"\""); } } // "-new_console:u:<user>:<pwd>" if (pszUserName && *pszUserName) { _wcscat_c(pszFull, cchMaxLen, bNewConsole ? L" \"-new_console:u:" : L" \"-cur_console:u:"); if (pszDomain && *pszDomain) { _wcscat_c(pszFull, cchMaxLen, pszDomain); _wcscat_c(pszFull, cchMaxLen, L"\\"); } _wcscat_c(pszFull, cchMaxLen, pszUserName); if (szUserPassword) { _wcscat_c(pszFull, cchMaxLen, L":"); _wcscat_c(pszFull, cchMaxLen, szUserPassword); } _wcscat_c(pszFull, cchMaxLen, L"\""); } return pszFull; }