bool IsNeedCmd(BOOL bRootCmd, LPCWSTR asCmdLine, CmdArg &szExe, LPCWSTR* rsArguments /*= NULL*/, BOOL* rpbNeedCutStartEndQuot /*= NULL*/, BOOL* rpbRootIsCmdExe /*= NULL*/, BOOL* rpbAlwaysConfirmExit /*= NULL*/, BOOL* rpbAutoDisableConfirmExit /*= NULL*/) { _ASSERTE(asCmdLine && *asCmdLine); bool rbNeedCutStartEndQuot = false; bool rbRootIsCmdExe = true; bool rbAlwaysConfirmExit = false; bool rbAutoDisableConfirmExit = false; if (rsArguments) *rsArguments = NULL; bool lbRc = false; int iRc = 0; BOOL lbFirstWasGot = FALSE; LPCWSTR pwszCopy; int nLastChar; #ifdef _DEBUG // Это минимальные проверки, собственно к коду - не относятся CmdArg szDbgFirst; bool bIsBatch = false; { LPCWSTR psz = asCmdLine; NextArg(&psz, szDbgFirst); psz = PointToExt(szDbgFirst); if (lstrcmpi(psz, L".cmd")==0 || lstrcmpi(psz, L".bat")==0) bIsBatch = true; } #endif if (!szExe.GetBuffer(MAX_PATH)) { _ASSERTE(FALSE && "Failed to allocate MAX_PATH"); lbRc = true; goto wrap; } szExe.Empty(); if (!asCmdLine || *asCmdLine == 0) { _ASSERTE(asCmdLine && *asCmdLine); lbRc = true; goto wrap; } pwszCopy = asCmdLine; // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" nLastChar = lstrlenW(pwszCopy) - 1; if (pwszCopy[0] == L'"' && pwszCopy[nLastChar] == L'"') { //if (pwszCopy[1] == L'"' && pwszCopy[2]) //{ // pwszCopy ++; // Отбросить первую кавычку в командах типа: ""c:\program files\arc\7z.exe" -?" // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} //else // глючила на ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" //if (wcschr(pwszCopy+1, L'"') == (pwszCopy+nLastChar)) { // LPCWSTR pwszTemp = pwszCopy; // // Получим первую команду (исполняемый файл?) // if ((iRc = NextArg(&pwszTemp, szArg)) != 0) { // //Parsing command line failed // lbRc = true; goto wrap; // } // pwszCopy ++; // Отбросить первую кавычку в командах типа: "c:\arc\7z.exe -?" // lbFirstWasGot = TRUE; // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} else { // Will be dequoted in 'NextArg' function. Examples // "C:\GCC\msys\bin\make.EXE -f "makefile" COMMON="../../../plugins/common"" // ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" // ""cmd"" // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" LPCWSTR pwszTemp = pwszCopy; // Получим первую команду (исполняемый файл?) if ((iRc = NextArg(&pwszTemp, szExe)) != 0) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } LPCWSTR pwszQ = pwszCopy + 1 + lstrlen(szExe); wchar_t* pszExpand = NULL; if (*pwszQ != L'"' && IsExecutable(szExe, &pszExpand)) { pwszCopy ++; // отбрасываем lbFirstWasGot = TRUE; if (pszExpand) { szExe.Set(pszExpand); SafeFree(pszExpand); if (rsArguments) *rsArguments = pwszQ; } rbNeedCutStartEndQuot = true; } } } // Получим первую команду (исполняемый файл?) if (!lbFirstWasGot) { szExe.Empty(); // 17.10.2010 - поддержка переданного исполняемого файла без параметров, но с пробелами в пути LPCWSTR pchEnd = pwszCopy + lstrlenW(pwszCopy); while (pchEnd > pwszCopy && *(pchEnd-1) == L' ') pchEnd--; if ((pchEnd - pwszCopy) < MAX_PATH) { szExe.Set(pwszCopy, (pchEnd - pwszCopy)); _ASSERTE(szExe[(pchEnd - pwszCopy)] == 0); if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } // Обработка переменных окружения и поиск в PATH if (FileExistsSearch((LPCWSTR)szExe, szExe)) { if (rsArguments) *rsArguments = pchEnd; } else { szExe.Empty(); } } if (szExe[0] == 0) { if ((iRc = NextArg(&pwszCopy, szExe)) != 0) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } // Обработка переменных окружения и поиск в PATH if (FileExistsSearch((LPCWSTR)szExe, szExe)) { if (rsArguments) *rsArguments = pwszCopy; } } } if (!*szExe) { _ASSERTE(szExe[0] != 0); } else { // Если юзеру нужен редирект - то он должен явно указать ком.процессор // Иначе нереально (или достаточно сложно) определить, является ли символ // редиректом, или это просто один из аргументов команды... // "Левые" символы в имени файла (а вот в "первом аргументе" все однозначно) if (wcspbrk(szExe, L"?*<>|")) { rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } // если "путь" не указан if (wcschr(szExe, L'\\') == NULL) { bool bHasExt = (wcschr(szExe, L'.') != NULL); // Проверим, может это команда процессора (типа "DIR")? if (!bHasExt) { bool bIsCommand = false; wchar_t* pszUppr = lstrdup(szExe); if (pszUppr) { // избежать линковки на user32.dll //CharUpperBuff(pszUppr, lstrlen(pszUppr)); for (wchar_t* p = pszUppr; *p; p++) { if (*p >= L'a' && *p <= 'z') *p -= 0x20; } const wchar_t* pszFind = gsInternalCommands; while (*pszFind) { if (lstrcmp(pszUppr, pszFind) == 0) { bIsCommand = true; break; } pszFind += lstrlen(pszFind)+1; } free(pszUppr); } if (bIsCommand) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } } // Пробуем найти "по путям" соответствующий exe-шник. INT_PTR nCchMax = szExe.mn_MaxLen; // выделить память, длинее чем szExe вернуть не сможем wchar_t* pszSearch = (wchar_t*)malloc(nCchMax*sizeof(wchar_t)); if (pszSearch) { #ifndef CONEMU_MINIMAL MWow64Disable wow; wow.Disable(); // Отключить редиректор! #endif wchar_t *pszName = NULL; INT_PTR nRc = SearchPath(NULL, szExe, bHasExt ? NULL : L".exe", (DWORD)nCchMax, pszSearch, &pszName); if (nRc && (nRc < nCchMax)) { // Нашли, возвращаем что нашли szExe.Set(pszSearch); } free(pszSearch); } } // end: if (wcschr(szExe, L'\\') == NULL) } // Если szExe не содержит путь к файлу - запускаем через cmd // "start "" C:\Utils\Files\Hiew32\hiew32.exe C:\00\Far.exe" if (!IsFilePath(szExe)) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } //pwszCopy = wcsrchr(szArg, L'\\'); if (!pwszCopy) pwszCopy = szArg; else pwszCopy ++; pwszCopy = PointToName(szExe); //2009-08-27 wchar_t *pwszEndSpace = szExe.ms_Arg + lstrlenW(szExe) - 1; while ((*pwszEndSpace == L' ') && (pwszEndSpace > szExe)) { *(pwszEndSpace--) = 0; } #ifndef __GNUC__ #pragma warning( push ) #pragma warning(disable : 6400) #endif if (lstrcmpiW(pwszCopy, L"cmd")==0 || lstrcmpiW(pwszCopy, L"cmd.exe")==0 || lstrcmpiW(pwszCopy, L"tcc")==0 || lstrcmpiW(pwszCopy, L"tcc.exe")==0) { rbRootIsCmdExe = TRUE; // уже должен быть выставлен, но проверим rbAlwaysConfirmExit = TRUE; rbAutoDisableConfirmExit = FALSE; _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан командный процессор, cmd.exe в начало добавлять не нужно } // Issue 1211: Decide not to do weird heuristic. // If user REALLY needs redirection (root command, huh?) // - he must call "cmd /c ..." directly // Если есть одна из команд перенаправления, или слияния - нужен CMD.EXE if (!bRootCmd) { if (wcschr(asCmdLine, L'&') || wcschr(asCmdLine, L'>') || wcschr(asCmdLine, L'<') || wcschr(asCmdLine, L'|') || wcschr(asCmdLine, L'^') // или экранирования ) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } } //if (lstrcmpiW(pwszCopy, L"far")==0 || lstrcmpiW(pwszCopy, L"far.exe")==0) if (IsFarExe(pwszCopy)) { bool bFound = (wcschr(pwszCopy, L'.') != NULL); // Если указали при запуске просто "far" - это может быть батник, расположенный в %PATH% if (!bFound) { wchar_t szSearch[MAX_PATH+1], *pszPart = NULL; DWORD n = SearchPath(NULL, pwszCopy, L".exe", countof(szSearch), szSearch, &pszPart); if (n && (n < countof(szSearch))) { if (lstrcmpi(PointToExt(pszPart), L".exe") == 0) bFound = true; } } if (bFound) { rbAutoDisableConfirmExit = TRUE; rbRootIsCmdExe = FALSE; // FAR! _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан исполняемый файл, cmd.exe в начало добавлять не нужно } } if (IsExecutable(szExe)) { rbRootIsCmdExe = FALSE; // Для других программ - буфер не включаем _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // Запускается конкретная консольная программа. cmd.exe не требуется } //Можно еще Доделать поиски с: SearchPath, GetFullPathName, добавив расширения .exe & .com //хотя фар сам формирует полные пути к командам, так что можно не заморачиваться #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; #ifndef __GNUC__ #pragma warning( pop ) #endif lbRc = true; wrap: if (rpbNeedCutStartEndQuot) *rpbNeedCutStartEndQuot = rbNeedCutStartEndQuot; if (rpbRootIsCmdExe) *rpbRootIsCmdExe = rbRootIsCmdExe; if (rpbAlwaysConfirmExit) *rpbAlwaysConfirmExit = rbAlwaysConfirmExit; if (rpbAutoDisableConfirmExit) *rpbAutoDisableConfirmExit = rbAutoDisableConfirmExit; return lbRc; }
void PrintPosition (POSITION position, STRING playersName, BOOLEAN usersTurn) { int n, row, i, col; char* board; char horizchar; board = (char*)SafeMalloc((possize)*sizeof(char)); generic_hash_unhash(position, board); if(swapmode == SWAP_DIRECTION || swapmode == SWAP_BOTH) horizchar = board[possize - 1]; else horizchar = (DEFAULT_HORIZPLAYER == WHITEPLAYER ? WHITECHAR : BLACKCHAR); printf("\n\n\n\n"); printf(" %s's turn (%c):\n\n", playersName, generic_hash_turn(position) == 1 ? WHITECHAR : BLACKCHAR); printf(" %c: horizontal\n", horizchar); printf(" %c: vertical\n\n", horizchar == WHITECHAR ? BLACKCHAR : WHITECHAR); printf(" "); for(i = 0; i < boardcols; i++) { printf("/ \\ "); } printf("\n"); for(row = 0; row < boardrows; row++) { for(i = 0; i < row; i++) printf(" "); printf(" %c |", '0'+row); for(col = 0; col < boardcols; col++) printf(" %c |", board[row*boardcols+col]); printf("\n "); for(i = 0; i < row; i++) { printf(" "); } for(i = 0; i < boardcols; i++) printf("\\ / "); if(row != boardrows-1) printf("\\"); printf("\n"); } printf(" "); for(col = 0; col < boardrows; col++) printf(" "); printf(" "); for(n = 0; n < boardcols; n++) printf("%c ", 'a'+n); printf("\n\n"); printf(GetPrediction(position, playersName, usersTurn)); printf("\n\n"); SafeFree(board); }
bool SettingsINI::OpenKey(const wchar_t *regPath, uint access, BOOL abSilent /*= FALSE*/) { _ASSERTE(!gpConEmu->IsResetBasicSettings() || ((access & KEY_WRITE)!=KEY_WRITE)); SafeFree(mpsz_Section); if (!regPath || !*regPath) { mpsz_IniFile = NULL; return false; } if (m_Storage.pszFile && *m_Storage.pszFile) { mpsz_IniFile = m_Storage.pszFile; } else { _ASSERTE(m_Storage.pszFile && *m_Storage.pszFile); m_Storage.pszFile = mpsz_IniFile = gpConEmu->ConEmuIni(); } if (!mpsz_IniFile || !*mpsz_IniFile) { mpsz_IniFile = NULL; return false; } HANDLE hFile = CreateFile(mpsz_IniFile, ((access & KEY_WRITE) == KEY_WRITE) ? GENERIC_WRITE : GENERIC_READ, FILE_SHARE_READ, NULL, ((access & KEY_WRITE) == KEY_WRITE) ? OPEN_ALWAYS : OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) { mpsz_IniFile = NULL; return false; } CloseHandle(hFile); wchar_t* pszDup = lstrdup(regPath); if (!pszDup) { mpsz_IniFile = NULL; return FALSE; } // Замена символов wchar_t* psz = pszDup; while ((psz = wcspbrk(psz, L" ?"))) *psz = L'_'; psz = pszDup; while ((psz = wcspbrk(psz, L"/\\"))) *psz = L' '; size_t cchMax = (_tcslen(pszDup)*3)+1; char* pszSectionA = (char*)malloc(cchMax); if (!pszSectionA) { mpsz_IniFile = NULL; SafeFree(pszDup); return false; } int nLen = WideCharToMultiByte(CP_UTF8, 0, pszDup, -1, pszSectionA, cchMax, 0,0); mpsz_Section = (wchar_t*)malloc((nLen+1)*sizeof(*mpsz_Section)); if (!mpsz_Section) { SafeFree(pszSectionA); SafeFree(pszDup); return false; } MultiByteToWideChar(CP_ACP, 0, pszSectionA, -1, mpsz_Section, nLen+1); SafeFree(pszSectionA); SafeFree(pszDup); return true; }
void ConEmuUpdateSettings::SetUpdateVerLocation(LPCWSTR asNewIniLocation) { SafeFree(szUpdateVerLocation); if (asNewIniLocation && *asNewIniLocation && (lstrcmp(asNewIniLocation, L"-") != 0)) szUpdateVerLocation = lstrdup(asNewIniLocation); }
/* * SendMailMessage: hDlg is filled in with mail message info; build up message * and ask server to validate recipient names. * Return True if message successfully sent. */ Bool SendMailMessage(HWND hDlg) { char line[MAX_LINE + 1], *ptr, *temp; int i, j, k; info = (MailInfo *) SafeMalloc(sizeof(MailInfo)); info->num_recipients = 0; // Read recipients GetDlgItemText(hDlg, IDC_RECIPIENTS, line, MAX_LINE); ptr = strtok(line, ","); while (ptr != NULL) { if (info->num_recipients >= MAX_RECIPIENTS) { if (!AreYouSure(hInst, hDlg, NO_BUTTON, IDS_TOOMANYRECIPIENTS, MAX_RECIPIENTS)) { SafeFree(info); info = NULL; return False; } break; } // Skip leading spaces while (*ptr == ' ') ptr++; // Skip trailing spaces temp = ptr + strlen(ptr) - 1; while (temp > ptr && *temp == ' ') temp--; *(temp + 1) = 0; strncpy(info->recipients[info->num_recipients], ptr, MAXUSERNAME); info->recipients[info->num_recipients][MAXUSERNAME - 1] = 0; info->num_recipients++; ptr = strtok(NULL, ","); } /* Must have >= 1 recipient */ if (info->num_recipients == 0) { ClientError(hInst, hDlg, IDS_NORECIPIENTS); return False; } // Remove duplicate recipients for (i = 0; i < info->num_recipients; i++) for (j = i + 1; j < info->num_recipients; j++) if (!stricmp(info->recipients[i], info->recipients[j])) { // Move everyone else up one slot for (k = j; k < info->num_recipients - 1; k++) strcpy(info->recipients[k], info->recipients[k + 1]); info->num_recipients--; j--; } // Translate names into object numbers line[0] = 0; for (i=0; i < info->num_recipients; i++) { if (i != 0) strcat(line, ","); strcat(line, info->recipients[i]); } RequestLookupNames(info->num_recipients, line); // Disable OK button, so that only one lookup happens at once EnableWindow(GetDlgItem(hDlg, IDC_OK), FALSE); SetDlgItemText(hDlg, IDC_SENDMAILMSG, GetString(hInst, IDS_CHECKNAMES)); return True; }
BOOL LoadPanelInfoW1900(BOOL abActive) { if (!InfoW1900) return FALSE; CeFullPanelInfo* pcefpi = NULL; PanelInfo pi = {sizeof(pi)}; HANDLE hPanel = abActive ? PANEL_ACTIVE : PANEL_PASSIVE; INT_PTR nRc = InfoW1900->PanelControl(hPanel, FCTL_GETPANELINFO, 0, &pi); if (!nRc) { TODO("Показать информацию об ошибке"); return FALSE; } // Даже если невидима - обновить информацию! //// Проверим, что панель видима. Иначе - сразу выходим. //if (!pi.Visible) { // TODO("Показать информацию об ошибке"); // return NULL; //} if (pi.Flags & PFLAGS_PANELLEFT) pcefpi = &pviLeft; else pcefpi = &pviRight; pcefpi->cbSize = sizeof(*pcefpi); //pcefpi->hPanel = hPanel; // Если элементов на панели стало больше, чем выделено в (pviLeft/pviRight) if (pcefpi->ItemsNumber < (INT_PTR)pi.ItemsNumber) { if (!pcefpi->ReallocItems(pi.ItemsNumber)) return FALSE; } // Копируем что нужно pcefpi->bLeftPanel = (pi.Flags & PFLAGS_PANELLEFT) == PFLAGS_PANELLEFT; pcefpi->bPlugin = (pi.Flags & PFLAGS_PLUGIN) == PFLAGS_PLUGIN; pcefpi->PanelRect = pi.PanelRect; pcefpi->ItemsNumber = pi.ItemsNumber; pcefpi->CurrentItem = pi.CurrentItem; pcefpi->TopPanelItem = pi.TopPanelItem; pcefpi->Visible = (pi.PanelType == PTYPE_FILEPANEL) && ((pi.Flags & PFLAGS_VISIBLE) == PFLAGS_VISIBLE); pcefpi->ShortNames = (pi.Flags & PFLAGS_ALTERNATIVENAMES) == PFLAGS_ALTERNATIVENAMES; pcefpi->Focus = (pi.Flags & PFLAGS_FOCUS) == PFLAGS_FOCUS; pcefpi->Flags = pi.Flags; // CEPANELINFOFLAGS pcefpi->PanelMode = pi.ViewMode; pcefpi->IsFilePanel = (pi.PanelType == PTYPE_FILEPANEL); // Настройки интерфейса LoadFarSettingsW1900(&pcefpi->FarInterfaceSettings, &pcefpi->FarPanelSettings); // Цвета фара INT_PTR nColorSize = InfoW1900->AdvControl(&guid_ConEmuTh, ACTL_GETARRAYCOLOR, 0, NULL); #ifdef _DEBUG INT_PTR nDefColorSize = COL_LASTPALETTECOLOR; _ASSERTE(nColorSize==nDefColorSize); #endif FarColor* pColors = (FarColor*)calloc(nColorSize, sizeof(*pColors)); if (pColors) nColorSize = InfoW1900->AdvControl(&guid_ConEmuTh, ACTL_GETARRAYCOLOR, (int)nColorSize, pColors); WARNING("Поддержка более 4бит цветов"); if (pColors && nColorSize > 0) { pcefpi->nFarColors[col_PanelText] = FarColor_3_2(pColors[COL_PANELTEXT]); pcefpi->nFarColors[col_PanelSelectedCursor] = FarColor_3_2(pColors[COL_PANELSELECTEDCURSOR]); pcefpi->nFarColors[col_PanelSelectedText] = FarColor_3_2(pColors[COL_PANELSELECTEDTEXT]); pcefpi->nFarColors[col_PanelCursor] = FarColor_3_2(pColors[COL_PANELCURSOR]); pcefpi->nFarColors[col_PanelColumnTitle] = FarColor_3_2(pColors[COL_PANELCOLUMNTITLE]); pcefpi->nFarColors[col_PanelBox] = FarColor_3_2(pColors[COL_PANELBOX]); pcefpi->nFarColors[col_HMenuText] = FarColor_3_2(pColors[COL_HMENUTEXT]); pcefpi->nFarColors[col_WarnDialogBox] = FarColor_3_2(pColors[COL_WARNDIALOGBOX]); pcefpi->nFarColors[col_DialogBox] = FarColor_3_2(pColors[COL_DIALOGBOX]); pcefpi->nFarColors[col_CommandLineUserScreen] = FarColor_3_2(pColors[COL_COMMANDLINEUSERSCREEN]); pcefpi->nFarColors[col_PanelScreensNumber] = FarColor_3_2(pColors[COL_PANELSCREENSNUMBER]); pcefpi->nFarColors[col_KeyBarNum] = FarColor_3_2(pColors[COL_KEYBARNUM]); } else { _ASSERTE(pColors!=NULL && nColorSize>0); memset(pcefpi->nFarColors, 7, countof(pcefpi->nFarColors)*sizeof(*pcefpi->nFarColors)); } SafeFree(pColors); //int nColorSize = InfoW1900->AdvControl(&guid_ConEmuTh, ACTL_GETARRAYCOLOR, 0, NULL); //if ((pcefpi->nFarColors == NULL) || (nColorSize > pcefpi->nMaxFarColors)) //{ // if (pcefpi->nFarColors) free(pcefpi->nFarColors); // pcefpi->nFarColors = (BYTE*)calloc(nColorSize,1); // pcefpi->nMaxFarColors = nColorSize; //} ////nColorSize = InfoW1900->AdvControl(&guid_ConEmuTh, ACTL_GETARRAYCOLOR, 0, pcefpi->nFarColors); //FarColor* pColors = (FarColor*)calloc(nColorSize, sizeof(*pColors)); // //if (pColors) // nColorSize = InfoW1900->AdvControl(&guid_ConEmuTh, ACTL_GETARRAYCOLOR, nColorSize, pColors); // //WARNING("Поддержка более 4бит цветов"); //if (pColors && nColorSize > 0) //{ // for (int i = 0; i < nColorSize; i++) // pcefpi->nFarColors[i] = FarColor_3_2(pColors[i]); //} //else //{ // memset(pcefpi->nFarColors, 7, pcefpi->nMaxFarColors*sizeof(*pcefpi->nFarColors)); //} //SafeFree(pColors); // Текущая папка панели size_t nSize = InfoW1900->PanelControl(hPanel, FCTL_GETPANELDIRECTORY, 0, 0); if (nSize) { if ((pcefpi->pFarPanelDirectory == NULL) || (nSize > pcefpi->nMaxPanelGetDir)) { pcefpi->nMaxPanelGetDir = nSize + 1024; // + выделим немножко заранее pcefpi->pFarPanelDirectory = calloc(pcefpi->nMaxPanelGetDir,1); } ((FarPanelDirectory*)pcefpi->pFarPanelDirectory)->StructSize = sizeof(FarPanelDirectory); nSize = InfoW1900->PanelControl(hPanel, FCTL_GETPANELDIRECTORY, nSize, pcefpi->pFarPanelDirectory); if ((pcefpi->pszPanelDir == NULL) || (nSize > pcefpi->nMaxPanelDir)) { pcefpi->nMaxPanelDir = nSize + MAX_PATH; // + выделим немножко заранее SafeFree(pcefpi->pszPanelDir); pcefpi->pszPanelDir = (wchar_t*)calloc(pcefpi->nMaxPanelDir,2); } lstrcpyn(pcefpi->pszPanelDir, ((FarPanelDirectory*)pcefpi->pFarPanelDirectory)->Name, pcefpi->nMaxPanelDir); if (!nSize) { SafeFree(pcefpi->pszPanelDir); pcefpi->nMaxPanelDir = 0; } } else { SafeFree(pcefpi->pszPanelDir); } // Готовим буфер для информации об элементах pcefpi->ReallocItems(pcefpi->ItemsNumber); //if ((pcefpi->ppItems == NULL) || (pcefpi->nMaxItemsNumber < pcefpi->ItemsNumber)) //{ // if (pcefpi->ppItems) free(pcefpi->ppItems); // pcefpi->nMaxItemsNumber = pcefpi->ItemsNumber+32; // + немножно про запас // pcefpi->ppItems = (CePluginPanelItem**)calloc(pcefpi->nMaxItemsNumber, sizeof(LPVOID)); //} // и буфер для загрузки элемента из FAR nSize = sizeof(PluginPanelItem)+6*MAX_PATH; if ((pcefpi->pFarTmpBuf == NULL) || (pcefpi->nFarTmpBuf < nSize)) { if (pcefpi->pFarTmpBuf) free(pcefpi->pFarTmpBuf); pcefpi->nFarTmpBuf = nSize; pcefpi->pFarTmpBuf = malloc(pcefpi->nFarTmpBuf); } return TRUE; }
//------------------------------------------------------------------------ ///| Parsing the command line |/////////////////////////////////////////// //------------------------------------------------------------------------ // Returns: // true - continue normal startup // false - exit process with iResult code bool CConEmuStart::ParseCommandLine(LPCWSTR pszCmdLine, int& iResult) { bool bRc = false; iResult = 100; _ASSERTE(pszCmdLine!=NULL); opt.cmdLine.Set(pszCmdLine ? pszCmdLine : L""); // pszCmdLine *may* or *may not* start with our executable or full path to our executable LPCWSTR pszTemp = opt.cmdLine; LPCWSTR cmdLineRest = SkipNonPrintable(opt.cmdLine); LPCWSTR pszName, pszArgStart; LPCWSTR psUnknown = NULL; CEStr szArg, szNext; CEStr szExeName, szExeNameOnly; // Set %ConEmuArgs% env var // It may be usefull if we need to restart ConEmu // from batch/script with the same arguments (selfupdate etc.) LPCWSTR pszCopyToEnvStart = NULL; // Have to get our exectuable name and name without extension szExeName.Set(PointToName(gpConEmu->ms_ConEmuExe)); szExeNameOnly.Set(szExeName); wchar_t* pszDot = (wchar_t*)PointToExt(szExeNameOnly.ms_Val); _ASSERTE(pszDot); if (pszDot) *pszDot = 0; // Check the first argument in the command line (most probably it will be our executable path/name) if (NextArg(&pszTemp, szArg) != 0) { _ASSERTE(FALSE && "GetCommandLine() is empty"); // Treat as empty command line, allow to start bRc = true; iResult = 0; goto wrap; } pszName = PointToName(szArg); if ((lstrcmpi(pszName, szExeName) == 0) || (lstrcmpi(pszName, szExeNameOnly) == 0)) { // OK, our executable was specified properly in the command line _ASSERTE(*pszTemp != L' '); cmdLineRest = SkipNonPrintable(pszTemp); } // Must be empty at the moment _ASSERTE(opt.runCommand.IsEmpty()); // Does the command line contain our switches? // Or we need to append all switches to starting shell? if (cmdLineRest && *cmdLineRest) { pszTemp = cmdLineRest; if (NextArg(&pszTemp, szArg) == 0) { if ((*szArg.ms_Val != L'/') && (*szArg.ms_Val != L'-') /*&& !wcschr(szArg.ms_Val, L'/')*/ ) { // Save it for further use opt.runCommand.Set(cmdLineRest); // And do not process it (no switches at all) cmdLineRest = NULL; opt.params = -1; } } } // Let parse the reset szArg.Empty(); szNext.Empty(); // Processing loop begin if (cmdLineRest && *cmdLineRest) { pszCopyToEnvStart = cmdLineRest; opt.cfgSwitches.Set(pszCopyToEnvStart); while (NextArg(&cmdLineRest, szArg, &pszArgStart) == 0) { bool lbNotFound = false; // ':' removed from checks because otherwise it will not warn // on invalid usage of "-new_console:a" for example if (szArg.ms_Val[0] == L'-' && szArg.ms_Val[1] && !wcspbrk(szArg.ms_Val+1, L"\\//|.&<>^")) { // Seems this is to be the "switch" too // Use both notations ('-' and '/') *szArg.ms_Val = L'/'; } LPCWSTR curCommand = szArg.ms_Val; #define NeedNextArg() \ if (NextArg(&cmdLineRest, szNext) != 0) { iResult = 101; goto wrap; } \ curCommand = szNext.ms_Val; if (*curCommand != L'/') { continue; // Try next switch? } else { opt.params++; if (!klstricmp(curCommand, _T("/autosetup"))) { BOOL lbTurnOn = TRUE; NeedNextArg(); if (*curCommand == _T('0')) { lbTurnOn = FALSE; } else { NeedNextArg(); DWORD dwAttr = GetFileAttributes(curCommand); if (dwAttr == (DWORD)-1 || (dwAttr & FILE_ATTRIBUTE_DIRECTORY)) { iResult = 102; goto wrap; } } HKEY hk = NULL; DWORD dw; int nSetupRc = 100; if (0 != RegCreateKeyEx(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Command Processor"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hk, &dw)) { iResult = 103; goto wrap; } if (lbTurnOn) { size_t cchMax = _tcslen(curCommand); LPCWSTR pszArg1 = NULL; if (*cmdLineRest) { // May be ‘/GHWND=NEW’ or smth else pszArg1 = cmdLineRest; cchMax += _tcslen(pszArg1); } cchMax += 16; // + quotations, spaces and so on wchar_t* pszCmd = (wchar_t*)calloc(cchMax, sizeof(*pszCmd)); _wsprintf(pszCmd, SKIPLEN(cchMax) L"\"%s\"%s%s%s", curCommand, pszArg1 ? L" \"" : L"", pszArg1 ? pszArg1 : L"", pszArg1 ? L"\"" : L""); if (0 == RegSetValueEx(hk, _T("AutoRun"), 0, REG_SZ, (LPBYTE)pszCmd, (DWORD)sizeof(*pszCmd)*(_tcslen(pszCmd)+1))) nSetupRc = 1; free(pszCmd); } else { if (0==RegDeleteValue(hk, _T("AutoRun"))) nSetupRc = 1; } RegCloseKey(hk); // сбросить CreateInNewEnvironment для ConMan ResetConman(); iResult = nSetupRc; goto wrap; } else if (!klstricmp(curCommand, _T("/bypass")) || !klstricmp(curCommand, _T("/apparent")) || !klstricmp(curCommand, _T("/system")) || !klstricmp(curCommand, _T("/interactive")) || !klstricmp(curCommand, _T("/demote"))) { // -bypass // Этот ключик был придуман для прозрачного запуска консоли // в режиме администратора // (т.е. чтобы окно UAC нормально всплывало, но не мелькало консольное окно) // Но не получилось, пока требуются хэндлы процесса, а их не получается // передать в НЕ приподнятый процесс (исходный ConEmu GUI). // -apparent // Same as -bypass, but run the process as SW_SHOWNORMAL // -demote // Запуск процесса (ком.строка после "/demote") в режиме простого юзера, // когда текущий процесс уже запущен "под админом". "Понизить" текущие // привилегии просто так нельзя, поэтому запуск идет через TaskSheduler. // -system // Non-interactive process, started as System account // It's used when starting consoles, our server works fine as non-interactive // -interactive // Used when ConEmu.exe is started under System account, // but we need to give starting process interactive capabilities. _ASSERTE(opt.runCommand.IsEmpty()); pszTemp = cmdLineRest; if ((NextArg(&pszTemp, szNext) == 0) && (szNext.ms_Val[0] == L'-' || szNext.ms_Val[0] == L'/') && (lstrcmpi(szNext.ms_Val+1, L"cmd") == 0)) { opt.runCommand.Set(pszTemp); } else { opt.runCommand.Set(cmdLineRest); } if (opt.runCommand.IsEmpty()) { CEStr lsMsg(L"Invalid cmd line. '", curCommand, L"' exists, command line is empty"); DisplayLastError(lsMsg, -1); goto wrap; } // Information #ifdef _DEBUG STARTUPINFO siOur = {sizeof(siOur)}; GetStartupInfo(&siOur); #endif STARTUPINFO si = {sizeof(si)}; PROCESS_INFORMATION pi = {}; si.dwFlags = STARTF_USESHOWWINDOW; // Only `-demote` and `-apparent` switches were implemented to start application visible // All others are intended to run our server process, without blinking of course if ((0 == klstricmp(curCommand, _T("/demote"))) || (0 == klstricmp(curCommand, _T("/apparent")))) si.wShowWindow = SW_SHOWNORMAL; else si.wShowWindow = SW_HIDE; wchar_t szCurDir[MAX_PATH+1] = L""; GetCurrentDirectory(countof(szCurDir), szCurDir); BOOL b; DWORD nErr = 0; // if we were started from TaskScheduler, it would be nice to wait a little // to let parent (creator of the scheduler task) know we were started successfully bool bFromScheduler = false; // Log the command to be started { CEStr lsLog( L"Starting process", L": ", curCommand, L" `", opt.runCommand.ms_Val, L"`"); LogString(lsLog); } if (!klstricmp(curCommand, _T("/demote"))) { b = CreateProcessDemoted(opt.runCommand.ms_Val, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, szCurDir, &si, &pi, &nErr); } else if (!klstricmp(curCommand, _T("/system"))) { b = CreateProcessSystem(opt.runCommand.ms_Val, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, szCurDir, &si, &pi); } else if (!klstricmp(curCommand, _T("/interactive"))) { b = CreateProcessInteractive((DWORD)-1, NULL, opt.runCommand.ms_Val, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, szCurDir, &si, &pi, &nErr); bFromScheduler = true; } else // -bypass, -apparent { b = CreateProcess(NULL, opt.runCommand.ms_Val, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); nErr = b ? 0 : GetLastError(); bFromScheduler = true; } // Log the result { CEStr lsLog; wchar_t szExtra[32] = L""; if (b) { if (pi.dwProcessId) _wsprintf(szExtra, SKIPCOUNT(szExtra) L", PID=%u", pi.dwProcessId); lsLog = lstrmerge( L"Process was created successfully", szExtra); } else { _wsprintf(szExtra, SKIPCOUNT(szExtra) L", ErrorCode=%u", nErr); lsLog = lstrmerge( L"Failed to start process", szExtra); } LogString(lsLog); } // If the error was not shown yet if (nErr) DisplayLastError(opt.runCommand, nErr); // if we were started from TaskScheduler, it would be nice to wait a little // to let parent (creator of the scheduler task) know we were started successfully if (bFromScheduler) { LogString(L"Sleeping for 5 seconds"); Sleep(5*1000); } // Success? if (b) { iResult = 0; } // Done, close handles, if they were opened SafeCloseHandle(pi.hProcess); SafeCloseHandle(pi.hThread); goto wrap; } else if (!klstricmp(curCommand, _T("/multi"))) { gpConEmu->AppendExtraArgs(curCommand); gpConEmu->opt.MultiConValue = true; } else if (!klstricmp(curCommand, _T("/nomulti"))) { gpConEmu->AppendExtraArgs(curCommand); gpConEmu->opt.MultiConValue = false; } else if (!klstricmp(curCommand, _T("/visible"))) { gpConEmu->opt.VisValue = true; } else if (!klstricmp(curCommand, _T("/ct")) || !klstricmp(curCommand, _T("/cleartype")) || !klstricmp(curCommand, _T("/ct0")) || !klstricmp(curCommand, _T("/ct1")) || !klstricmp(curCommand, _T("/ct2"))) { switch (curCommand[3]) { case L'0': gpConEmu->opt.ClearTypeVal = NONANTIALIASED_QUALITY; break; case L'1': gpConEmu->opt.ClearTypeVal = ANTIALIASED_QUALITY; break; default: gpConEmu->opt.ClearTypeVal = CLEARTYPE_NATURAL_QUALITY; } } // Interface language else if (!klstricmp(curCommand, _T("/lng"))) { NeedNextArg(); if (!gpConEmu->opt.Language.Exists) { gpConEmu->opt.Language = curCommand; gpConEmu->AppendExtraArgs(L"/lng", curCommand); } } // Optional specific "ConEmu.l10n" else if (!klstricmp(curCommand, _T("/lngfile"))) { NeedNextArg(); if (!gpConEmu->opt.LanguageFile.Exists) { gpConEmu->opt.LanguageFile = curCommand; gpConEmu->AppendExtraArgs(L"/lngfile", curCommand); } } // имя шрифта else if (!klstricmp(curCommand, _T("/font"))) { NeedNextArg(); if (!gpConEmu->opt.FontVal.Exists) { gpConEmu->opt.FontVal = curCommand; gpConEmu->AppendExtraArgs(L"/font", curCommand); } } // Высота шрифта else if (!klstricmp(curCommand, _T("/size"))) { NeedNextArg(); if (!gpConEmu->opt.SizeVal.Exists) { gpConEmu->opt.SizeVal.SetInt(curCommand); } } // ADD fontname; by Mors else if (!klstricmp(curCommand, _T("/fontfile"))) { CESwitch szFile(sw_Str); if (!GetCfgParm(cmdLineRest, szFile, MAX_PATH)) { goto wrap; } gpConEmu->AppendExtraArgs(L"/fontfile", szFile.GetStr()); gpFontMgr->RegisterFont(szFile.GetStr(), TRUE); } // Register all fonts from specified directory else if (!klstricmp(curCommand, _T("/fontdir"))) { CESwitch szDir(sw_Str); if (!GetCfgParm(cmdLineRest, szDir, MAX_PATH)) { goto wrap; } gpConEmu->AppendExtraArgs(L"/fontdir", szDir.GetStr()); gpFontMgr->RegisterFontsDir(szDir.GetStr()); } else if (!klstricmp(curCommand, _T("/fs"))) { gpConEmu->opt.WindowModeVal = wmFullScreen; } else if (!klstricmp(curCommand, _T("/max"))) { gpConEmu->opt.WindowModeVal = wmMaximized; } else if (!klstricmp(curCommand, _T("/min")) || !klstricmp(curCommand, _T("/mintsa")) || !klstricmp(curCommand, _T("/starttsa"))) { gpConEmu->WindowStartMinimized = true; if (klstricmp(curCommand, _T("/min")) != 0) { gpConEmu->WindowStartTsa = true; gpConEmu->WindowStartNoClose = (klstricmp(curCommand, _T("/mintsa")) == 0); } } else if (!klstricmp(curCommand, _T("/tsa")) || !klstricmp(curCommand, _T("/tray"))) { gpConEmu->ForceMinimizeToTray = true; } else if (!klstricmp(curCommand, _T("/detached"))) { gpConEmu->m_StartDetached = crb_On; } else if (!klstricmp(curCommand, _T("/here"))) { gpConEmu->mb_ConEmuHere = true; gpConEmu->StoreWorkDir(); } else if (!klstricmp(curCommand, _T("/update"))) { gpConEmu->opt.AutoUpdateOnStart = true; } else if (!klstricmp(curCommand, _T("/noupdate"))) { // This one has more weight than AutoUpdateOnStart gpConEmu->opt.DisableAutoUpdate = true; } else if (!klstricmp(curCommand, _T("/nokeyhook")) || !klstricmp(curCommand, _T("/nokeyhooks")) || !klstricmp(curCommand, _T("/nokeybhook")) || !klstricmp(curCommand, _T("/nokeybhooks"))) { gpConEmu->DisableKeybHooks = true; } else if (!klstricmp(curCommand, _T("/nocloseconfirm"))) { gpConEmu->DisableCloseConfirm = true; } else if (!klstricmp(curCommand, _T("/nomacro"))) { gpConEmu->DisableAllMacro = true; } else if (!klstricmp(curCommand, _T("/nohotkey")) || !klstricmp(curCommand, _T("/nohotkeys"))) { gpConEmu->DisableAllHotkeys = true; } else if (!klstricmp(curCommand, _T("/nodeftrm")) || !klstricmp(curCommand, _T("/nodefterm"))) { gpConEmu->DisableSetDefTerm = true; } else if (!klstricmp(curCommand, _T("/noregfont")) || !klstricmp(curCommand, _T("/noregfonts"))) { gpConEmu->DisableRegisterFonts = true; } else if (!klstricmp(curCommand, _T("/inside")) || !lstrcmpni(curCommand, _T("/inside="), 8)) { bool bRunAsAdmin = isPressed(VK_SHIFT); bool bSyncDir = false; LPCWSTR pszSyncFmt = NULL; gpConEmu->mb_ConEmuHere = true; gpConEmu->StoreWorkDir(); if (curCommand[7] == _T('=')) { bSyncDir = true; pszSyncFmt = curCommand+8; // \eCD /d %1 - \e - ESC, \b - BS, \n - ENTER, %1 - "dir", %2 - "bash dir" } CConEmuInside::InitInside(bRunAsAdmin, bSyncDir, pszSyncFmt, 0, NULL); } else if (!klstricmp(curCommand, _T("/insidepid"))) { NeedNextArg(); bool bRunAsAdmin = isPressed(VK_SHIFT); wchar_t* pszEnd; // Здесь указывается PID, в который нужно внедриться. DWORD nInsideParentPID = wcstol(curCommand, &pszEnd, 10); if (nInsideParentPID) { CConEmuInside::InitInside(bRunAsAdmin, false, NULL, nInsideParentPID, NULL); } } else if (!klstricmp(curCommand, _T("/insidewnd"))) { NeedNextArg(); if (curCommand[0] == L'0' && (curCommand[1] == L'x' || curCommand[1] == L'X')) curCommand += 2; else if (curCommand[0] == L'x' || curCommand[0] == L'X') curCommand ++; bool bRunAsAdmin = isPressed(VK_SHIFT); wchar_t* pszEnd; // Здесь указывается HWND, в котором нужно создаваться. HWND hParent = (HWND)(DWORD_PTR)wcstoul(curCommand, &pszEnd, 16); if (hParent && IsWindow(hParent)) { CConEmuInside::InitInside(bRunAsAdmin, false, NULL, 0, hParent); } } else if (!klstricmp(curCommand, _T("/icon"))) { NeedNextArg(); if (!gpConEmu->opt.IconPrm.Exists && *curCommand) { gpConEmu->opt.IconPrm = true; gpConEmu->mps_IconPath = ExpandEnvStr(curCommand); } } else if (!klstricmp(curCommand, _T("/dir"))) { NeedNextArg(); if (*curCommand) { // Например, "%USERPROFILE%" wchar_t* pszExpand = NULL; if (wcschr(curCommand, L'%') && ((pszExpand = ExpandEnvStr(curCommand)) != NULL)) { gpConEmu->StoreWorkDir(pszExpand); SafeFree(pszExpand); } else { gpConEmu->StoreWorkDir(curCommand); } } } else if (!klstricmp(curCommand, _T("/updatejumplist"))) { // Copy current Task list to Win7 Jump list (Taskbar icon) gpConEmu->mb_UpdateJumpListOnStartup = true; } else if (!klstricmp(curCommand, L"/log") || !klstricmp(curCommand, L"/log0") || !klstricmp(curCommand, L"/log1") || !klstricmp(curCommand, L"/log2") || !klstricmp(curCommand, L"/log3") || !klstricmp(curCommand, L"/log4")) { if (!klstricmp(curCommand, L"/log") || !klstricmp(curCommand, L"/log0")) gpConEmu->opt.AdvLogging.SetInt(1); else gpConEmu->opt.AdvLogging.SetInt((BYTE)(curCommand[4] - L'0')); // 1..4 // Do create logging service DEBUGSTRSTARTUP(L"Creating log file"); gpConEmu->CreateLog(); } else if (!klstricmp(curCommand, _T("/single")) || !klstricmp(curCommand, _T("/reuse"))) { // "/reuse" switch to be remastered gpConEmu->AppendExtraArgs(curCommand); gpSetCls->SingleInstanceArg = sgl_Enabled; } else if (!klstricmp(curCommand, _T("/nosingle"))) { gpConEmu->AppendExtraArgs(curCommand); gpSetCls->SingleInstanceArg = sgl_Disabled; } else if (!klstricmp(curCommand, _T("/DesktopMode"))) { gpConEmu->opt.DesktopMode = true; } else if (!klstricmp(curCommand, _T("/quake")) || !klstricmp(curCommand, _T("/quakeauto")) || !klstricmp(curCommand, _T("/noquake"))) { if (!klstricmp(curCommand, _T("/quake"))) gpConEmu->opt.QuakeMode = 1; else if (!klstricmp(curCommand, _T("/quakeauto"))) gpConEmu->opt.QuakeMode = 2; else { gpConEmu->opt.QuakeMode = 0; if (gpSetCls->SingleInstanceArg == sgl_Default) gpSetCls->SingleInstanceArg = sgl_Disabled; } } else if (!klstricmp(curCommand, _T("/showhide")) || !klstricmp(curCommand, _T("/showhideTSA"))) { gpSetCls->SingleInstanceArg = sgl_Enabled; gpSetCls->SingleInstanceShowHide = !klstricmp(curCommand, _T("/showhide")) ? sih_ShowMinimize : sih_ShowHideTSA; } else if (!klstricmp(curCommand, _T("/reset")) || !klstricmp(curCommand, _T("/resetdefault")) || !klstricmp(curCommand, _T("/basic"))) { gpConEmu->opt.ResetSettings = true; if (!klstricmp(curCommand, _T("/resetdefault"))) { gpSetCls->isFastSetupDisabled = true; } else if (!klstricmp(curCommand, _T("/basic"))) { gpSetCls->isFastSetupDisabled = true; gpSetCls->isResetBasicSettings = true; } } else if (!klstricmp(curCommand, _T("/nocascade")) || !klstricmp(curCommand, _T("/dontcascade"))) { gpConEmu->AppendExtraArgs(curCommand); gpSetCls->isDontCascade = true; } else if (!klstricmp(curCommand, _T("/WndX")) || !klstricmp(curCommand, _T("/WndY")) || !klstricmp(curCommand, _T("/WndW")) || !klstricmp(curCommand, _T("/WndWidth")) || !klstricmp(curCommand, _T("/WndH")) || !klstricmp(curCommand, _T("/WndHeight"))) { TCHAR ch = curCommand[4]; CharUpperBuff(&ch, 1); CESwitch psz(sw_Str); bool bParm = false; if (!GetCfgParm(cmdLineRest, bParm, psz, 32)) { goto wrap; } gpConEmu->opt.SizePosPrm = true; // Direct X/Y implies /nocascade if (ch == _T('X') || ch == _T('Y')) { // TODO: isDontCascade must be in our opt struct !!! gpSetCls->isDontCascade = true; } switch (ch) { case _T('X'): gpConEmu->opt.sWndX.SetStr(psz.Str, sw_Str); break; case _T('Y'): gpConEmu->opt.sWndY.SetStr(psz.Str, sw_Str); break; case _T('W'): gpConEmu->opt.sWndW.SetStr(psz.Str, sw_Str); break; case _T('H'): gpConEmu->opt.sWndH.SetStr(psz.Str, sw_Str); break; } } else if (!klstricmp(curCommand, _T("/Monitor"))) { CESwitch psz(sw_Str); bool bParm = false; if (!GetCfgParm(cmdLineRest, bParm, psz, 64)) { goto wrap; } if ((gpConEmu->opt.Monitor.Mon = MonitorFromParam(psz.Str)) != NULL) { gpConEmu->opt.Monitor.Exists = true; gpConEmu->opt.Monitor.Type = sw_Int; gpStartEnv->hStartMon = gpConEmu->opt.Monitor.Mon; } } else if (!klstricmp(curCommand, _T("/Buffer")) || !klstricmp(curCommand, _T("/BufferHeight"))) { NeedNextArg(); if (!gpConEmu->opt.BufferHeightVal.Exists) { gpConEmu->opt.BufferHeightVal.SetInt(curCommand); if (gpConEmu->opt.BufferHeightVal.GetInt() < 0) { //setParent = true; -- Maximus5 - нефиг, все ручками gpConEmu->opt.BufferHeightVal = -gpConEmu->opt.BufferHeightVal.GetInt(); } if (gpConEmu->opt.BufferHeightVal.GetInt() < LONGOUTPUTHEIGHT_MIN) gpConEmu->opt.BufferHeightVal = LONGOUTPUTHEIGHT_MIN; else if (gpConEmu->opt.BufferHeightVal.GetInt() > LONGOUTPUTHEIGHT_MAX) gpConEmu->opt.BufferHeightVal = LONGOUTPUTHEIGHT_MAX; } } else if (!klstricmp(curCommand, _T("/Config"))) { // -- используем последний из параметров, если их несколько if (!GetCfgParm(cmdLineRest, gpConEmu->opt.ConfigVal, 127)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/Palette"))) { // -- используем последний из параметров, если их несколько if (!GetCfgParm(cmdLineRest, gpConEmu->opt.PaletteVal, MAX_PATH)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/LoadRegistry"))) { gpConEmu->AppendExtraArgs(curCommand); gpConEmu->opt.ForceUseRegistryPrm = true; } else if (!klstricmp(curCommand, _T("/LoadCfgFile")) || !klstricmp(curCommand, _T("/LoadXmlFile"))) { // -- используем последний из параметров, если их несколько if (!GetCfgParm(cmdLineRest, gpConEmu->opt.LoadCfgFile, MAX_PATH, true)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/SaveCfgFile")) || !klstricmp(curCommand, _T("/SaveXmlFile"))) { // -- используем последний из параметров, если их несколько if (!GetCfgParm(cmdLineRest, gpConEmu->opt.SaveCfgFile, MAX_PATH, true)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/GuiMacro"))) { // -- выполняется только последний if (!GetCfgParm(cmdLineRest, gpConEmu->opt.ExecGuiMacro, 0x8000, false)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/UpdateSrcSet"))) { // -- используем последний из параметров, если их несколько if (!GetCfgParm(cmdLineRest, gpConEmu->opt.UpdateSrcSet, MAX_PATH*4, false)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/AnsiLog"))) { // -- используем последний из параметров, если их несколько if (!GetCfgParm(cmdLineRest, gpConEmu->opt.AnsiLogPath, MAX_PATH-40, true)) { goto wrap; } } else if (!klstricmp(curCommand, _T("/SetDefTerm"))) { gpConEmu->opt.SetUpDefaultTerminal = true; } else if (!klstricmp(curCommand, _T("/ZoneId"))) { gpConEmu->opt.FixZoneId = true; } else if (!klstricmp(curCommand, _T("/Exit"))) { gpConEmu->opt.ExitAfterActionPrm = true; } else if (!klstricmp(curCommand, _T("/QuitOnClose"))) { gpConEmu->mb_ForceQuitOnClose = true; } else if (!klstricmp(curCommand, _T("/Title"))) { bool bOk = false; CESwitch pszTitle(sw_Str); if (!GetCfgParm(cmdLineRest, bOk, pszTitle, 127)) { goto wrap; } gpConEmu->SetTitleTemplate(pszTitle.GetStr()); } else if (!klstricmp(curCommand, _T("/FindBugMode"))) { gpConEmu->mb_FindBugMode = true; } else if (!klstricmp(curCommand, _T("/debug")) || !klstricmp(curCommand, _T("/debugw")) || !klstricmp(curCommand, _T("/debugi"))) { // These switches were already processed } else if (!klstricmp(curCommand, _T("/?")) || !klstricmp(curCommand, _T("/h")) || !klstricmp(curCommand, _T("/help"))) { if (gpLng) gpLng->Reload(); ConEmuAbout::OnInfo_About(); iResult = -1; goto wrap; } // Final `-cmd ...` or `-cmdlist ...` else if ( !klstricmp(curCommand, _T("/cmd")) || !klstricmp(curCommand, _T("/cmdlist")) ) { if (opt.cfgSwitches.ms_Val) { _ASSERTE(pszArgStart>pszCopyToEnvStart); _ASSERTE((INT_PTR)(pszArgStart - pszCopyToEnvStart) <= opt.cfgSwitches.GetLen()); opt.cfgSwitches.ms_Val[pszArgStart - pszCopyToEnvStart] = 0; } opt.runCommand.Set(SkipNonPrintable(cmdLineRest)); opt.isScript = (klstricmp(curCommand, L"/cmdlist") == 0); break; } else { // Show error on unknown switch psUnknown = pszArgStart; break; } } // (*curCommand == L'/') // Avoid assertions in NextArg szArg.Empty(); szNext.Empty(); } // while (NextArg(&cmdLineRest, szArg, &pszArgStart) == 0) } // Processing loop end if (psUnknown) { DEBUGSTRSTARTUP(L"Unknown switch, exiting!"); if (gpSet->isLogging()) { // For direct logging we do not use lng resources CEStr lsLog(L"\r\n", L"Unknown switch specified: ", psUnknown, L"\r\n\r\n"); gpConEmu->LogString(lsLog, false, false); } CEStr szNewConWarn; LPCWSTR pszTestSwitch = (psUnknown[0] == L'-' || psUnknown[0] == L'/') ? ((psUnknown[1] == L'-' || psUnknown[1] == L'/') ? (psUnknown+2) : (psUnknown+1)) : psUnknown; if ((lstrcmpni(pszTestSwitch, L"new_console", 11) == 0) || (lstrcmpni(pszTestSwitch, L"cur_console", 11) == 0)) { szNewConWarn = lstrmerge(L"\r\n\r\n", CLngRc::getRsrc(lng_UnknownSwitch4/*"Switch -new_console must be specified *after* /cmd or /cmdlist"*/) ); } CEStr lsMsg( CLngRc::getRsrc(lng_UnknownSwitch1/*"Unknown switch specified:"*/), L"\r\n\r\n", psUnknown, szNewConWarn, L"\r\n\r\n", CLngRc::getRsrc(lng_UnknownSwitch2/*"Visit website to get thorough switches description:"*/), L"\r\n" CEGUIARGSPAGE L"\r\n\r\n", CLngRc::getRsrc(lng_UnknownSwitch3/*"Or run ‘ConEmu.exe -?’ to get the brief."*/) ); MBoxA(lsMsg); goto wrap; } // Set "ConEmuArgs" and "ConEmuArgs2" ProcessConEmuArgsVar(); // Continue normal startup bRc = true; wrap: return bRc; }
bool RConStartArgs::AssignFrom(const struct RConStartArgs* args) { _ASSERTE(args!=NULL); if (args->pszSpecialCmd) { SafeFree(this->pszSpecialCmd); //_ASSERTE(args->bDetached == FALSE); -- Allowed. While duplicating root. this->pszSpecialCmd = lstrdup(args->pszSpecialCmd); if (!this->pszSpecialCmd) return false; } // Директория запуска. В большинстве случаев совпадает с CurDir в conemu.exe, // но может быть задана из консоли, если запуск идет через "-new_console" _ASSERTE(this->pszStartupDir==NULL); SafeFree(this->pszStartupDir); if (args->pszStartupDir) { this->pszStartupDir = lstrdup(args->pszStartupDir); if (!this->pszStartupDir) return false; } SafeFree(this->pszRenameTab); if (args->pszRenameTab) { this->pszRenameTab = lstrdup(args->pszRenameTab); if (!this->pszRenameTab) return false; } this->bRunAsRestricted = args->bRunAsRestricted; this->bRunAsAdministrator = args->bRunAsAdministrator; SafeFree(this->pszUserName); //SafeFree(this->pszUserPassword); SafeFree(this->pszDomain); //SafeFree(this->pszUserProfile); //if (this->hLogonToken) { CloseHandle(this->hLogonToken); this->hLogonToken = NULL; } if (args->pszUserName) { this->pszUserName = lstrdup(args->pszUserName); if (args->pszDomain) this->pszDomain = lstrdup(args->pszDomain); lstrcpy(this->szUserPassword, args->szUserPassword); this->bUseEmptyPassword = args->bUseEmptyPassword; //this->pszUserProfile = args->pszUserProfile ? lstrdup(args->pszUserProfile) : NULL; //SecureZeroMemory(args->szUserPassword, sizeof(args->szUserPassword)); //this->pszUserPassword = lstrdup(args->pszUserPassword ? args->pszUserPassword : L""); //this->hLogonToken = args->hLogonToken; args->hLogonToken = NULL; // -- Do NOT fail when password is empty !!! if (!this->pszUserName /*|| !*this->szUserPassword*/) return false; } this->bBackgroundTab = args->bBackgroundTab; this->bNoDefaultTerm = args->bNoDefaultTerm; _ASSERTE(args->bNoDefaultTerm == FALSE); this->bBufHeight = args->bBufHeight; this->nBufHeight = args->nBufHeight; this->eConfirmation = args->eConfirmation; this->bForceUserDialog = args->bForceUserDialog; this->bInjectsDisable = args->bInjectsDisable; this->bLongOutputDisable = args->bLongOutputDisable; this->bOverwriteMode = args->bOverwriteMode; this->nPTY = args->nPTY; this->eSplit = args->eSplit; this->nSplitValue = args->nSplitValue; this->nSplitPane = args->nSplitPane; return true; }
// Returns ">0" - when changes was made // 0 - no changes // -1 - error // bForceCurConsole==true, если разбор параметров идет // при запуске Tasks из GUI int RConStartArgs::ProcessNewConArg(bool bForceCurConsole /*= false*/) { bNewConsole = FALSE; if (!pszSpecialCmd || !*pszSpecialCmd) { _ASSERTE(pszSpecialCmd && *pszSpecialCmd); return -1; } int nChanges = 0; // 120115 - Если первый аргумент - "ConEmu.exe" или "ConEmu64.exe" - не обрабатывать "-cur_console" и "-new_console" { LPCWSTR pszTemp = pszSpecialCmd; wchar_t szExe[MAX_PATH+1]; if (0 == NextArg(&pszTemp, szExe)) { pszTemp = PointToName(szExe); if (lstrcmpi(pszTemp, L"ConEmu.exe") == 0 || lstrcmpi(pszTemp, L"ConEmu") == 0 || lstrcmpi(pszTemp, L"ConEmu64.exe") == 0 || lstrcmpi(pszTemp, L"ConEmu64") == 0) { return 0; } } } // 111211 - здесь может быть передан "-new_console:..." LPCWSTR pszNewCon = L"-new_console"; // 120108 - или "-cur_console:..." для уточнения параметров запуска команд (из фара например) LPCWSTR pszCurCon = L"-cur_console"; int nNewConLen = lstrlen(pszNewCon); _ASSERTE(lstrlen(pszCurCon)==nNewConLen); bool bStop = false; while (!bStop) { wchar_t* pszFindNew = wcsstr(pszSpecialCmd, pszNewCon); wchar_t* pszFind = pszFindNew ? pszFindNew : wcsstr(pszSpecialCmd, pszCurCon); if (pszFindNew) bNewConsole = TRUE; else if (!pszFind) break; // Проверка валидности _ASSERTE(pszFind >= pszSpecialCmd); if (((pszFind == pszSpecialCmd) || (*(pszFind-1) == L'"') || (*(pszFind-1) == L' ')) // начало аргумента && (pszFind[nNewConLen] == L' ' || pszFind[nNewConLen] == L':' || pszFind[nNewConLen] == L'"' || pszFind[nNewConLen] == 0)) { // -- не будем пока, мешает. например, при запуске задач //// По умолчанию, принудительно включить "Press Enter or Esc to close console" //if (!bForceCurConsole) // eConfirmation = eConfAlways; bool lbQuot = (*(pszFind-1) == L'"'); const wchar_t* pszEnd = pszFind+nNewConLen; //wchar_t szNewConArg[MAX_PATH+1]; if (lbQuot) pszFind--; if (*pszEnd == L'"') { pszEnd++; } else if (*pszEnd != L':') { // Конец _ASSERTE(*pszEnd == L' ' || *pszEnd == 0); } else { if (*pszEnd == L':') { pszEnd++; } else { _ASSERTE(*pszEnd == L':'); } // Обработка доп.параметров -new_console:xxx bool lbReady = false; while (!lbReady && *pszEnd) { switch (*(pszEnd++)) { //case L'-': // bStop = true; // следующие "-new_console" - не трогать! // break; case L'"': case L' ': case 0: lbReady = true; break; case L'b': // b - background, не активировать таб bBackgroundTab = TRUE; break; case L'z': // z - don't use "Default terminal" feature bNoDefaultTerm = TRUE; break; case L'a': // a - RunAs shell verb (as admin on Vista+, login/password in WinXP-) bRunAsAdministrator = TRUE; break; case L'r': // r - run as restricted user bRunAsRestricted = TRUE; break; case L'o': // o - disable "Long output" for next command (Far Manager) bLongOutputDisable = TRUE; break; case L'w': // e - enable "Overwrite" mode in console prompt bOverwriteMode = TRUE; break; case L'p': if (isDigit(*pszEnd)) { switch (*(pszEnd++)) { case L'0': nPTY = 0; // don't change break; case L'1': nPTY = 1; // enable PTY mode break; case L'2': nPTY = 2; // disable PTY mode (switch to plain $CONIN, $CONOUT, $CONERR) break; default: nPTY = 1; } } else { nPTY = 1; // enable PTY mode } break; case L'i': // i - don't inject ConEmuHk into the starting application bInjectsDisable = TRUE; break; case L'h': // "h0" - отключить буфер, "h9999" - включить буфер в 9999 строк { bBufHeight = TRUE; if (isDigit(*pszEnd)) { wchar_t* pszDigits = NULL; nBufHeight = wcstoul(pszEnd, &pszDigits, 10); if (pszDigits) pszEnd = pszDigits; } else { nBufHeight = 0; } } // L'h': break; case L'n': // n - отключить "Press Enter or Esc to close console" eConfirmation = eConfNever; break; case L'c': // c - принудительно включить "Press Enter or Esc to close console" eConfirmation = eConfAlways; break; case L'x': // x - Force using dosbox for .bat files bForceDosBox = TRUE; break; // "Long" code blocks below: 'd', 'u', 's' and so on (in future) case L'd': // d:<StartupDir>. MUST be last options { if (*pszEnd == L':') pszEnd++; const wchar_t* pszDir = pszEnd; while ((*pszEnd) && (lbQuot || *pszEnd != L' ') && (*pszEnd != L'"')) pszEnd++; if (pszEnd > pszDir) { size_t cchLen = pszEnd - pszDir; SafeFree(pszStartupDir); pszStartupDir = (wchar_t*)malloc((cchLen+1)*sizeof(*pszStartupDir)); if (pszStartupDir) { wmemmove(pszStartupDir, pszDir, cchLen); pszStartupDir[cchLen] = 0; // Например, "%USERPROFILE%" if (wcschr(pszStartupDir, L'%')) { wchar_t* pszExpand = NULL; if (((pszExpand = ExpandEnvStr(pszStartupDir)) != NULL)) { SafeFree(pszStartupDir); pszStartupDir = pszExpand; } } } } } // L'd': break; case L't': // t:<TabName>. MUST be last options { if (*pszEnd == L':') pszEnd++; const wchar_t* pszTab = pszEnd; while ((*pszEnd) && (lbQuot || *pszEnd != L' ') && (*pszEnd != L'"')) pszEnd++; if (pszEnd > pszTab) { size_t cchLen = pszEnd - pszTab; SafeFree(pszRenameTab); pszRenameTab = (wchar_t*)malloc((cchLen+1)*sizeof(*pszRenameTab)); if (pszRenameTab) { wmemmove(pszRenameTab, pszTab, cchLen); pszRenameTab[cchLen] = 0; } } } // L't': break; case L's': // s[<SplitTab>T][<Percents>](H|V) // Пример: "s3T30H" - разбить 3-ий таб. будет создан новый Pane справа, шириной 30% от 3-го таба. { UINT nTab = 0 /*active*/, nValue = /*пополам*/DefaultSplitValue/10; bool bDisableSplit = false; while (*pszEnd) { if (isDigit(*pszEnd)) { wchar_t* pszDigits = NULL; UINT n = wcstoul(pszEnd, &pszDigits, 10); if (!pszDigits) break; pszEnd = pszDigits; if (*pszDigits == L'T') { nTab = n; } else if ((*pszDigits == L'H') || (*pszDigits == L'V')) { nValue = n; eSplit = (*pszDigits == L'H') ? eSplitHorz : eSplitVert; } else { break; } pszEnd++; } else if (*pszEnd == L'T') { nTab = 0; pszEnd++; } else if ((*pszEnd == L'H') || (*pszEnd == L'V')) { nValue = DefaultSplitValue/10; eSplit = (*pszEnd == L'H') ? eSplitHorz : eSplitVert; pszEnd++; } else if (*pszEnd == L'N') { bDisableSplit = true; pszEnd++; break; } else { break; } } if (bDisableSplit) { eSplit = eSplitNone; nSplitValue = DefaultSplitValue; nSplitPane = 0; } else { if (!eSplit) eSplit = eSplitHorz; // Для удобства, пользователь задает размер НОВОЙ части nSplitValue = 1000-max(1,min(nValue*10,999)); // проценты _ASSERTE(nSplitValue>=1 && nSplitValue<1000); nSplitPane = nTab; } } // L's' break; case L'u': { // u - ConEmu choose user dialog // u:<user>:<pwd> - specify user/pwd in args. MUST be last option lbReady = true; // последняя опция SafeFree(pszUserName); SafeFree(pszDomain); if (szUserPassword[0]) SecureZeroMemory(szUserPassword, sizeof(szUserPassword)); if (*pszEnd == L':') { pszEnd++; wchar_t szUser[MAX_PATH], *p = szUser, *p2 = szUser+countof(szUser)-1; while (*pszEnd && (p < p2)) { if ((*pszEnd == 0) || (*pszEnd == L':') || (*pszEnd == L'"')) { break; } //else if (*pszEnd == L'"' && *(pszEnd+1) == L'"') //{ // *(p++) = L'"'; pszEnd += 2; //} else if (*pszEnd == L'^') { pszEnd++; *(p++) = *(pszEnd++); } else { *(p++) = *(pszEnd++); } } *p = 0; wchar_t* pszSlash = wcschr(szUser, L'\\'); if (pszSlash) { *pszSlash = 0; pszDomain = lstrdup(szUser); pszUserName = lstrdup(pszSlash+1); } else { pszUserName = lstrdup(szUser); } if (*pszEnd == L':') { pszEnd++; //lstrcpyn(szUserPassword, pszPwd, countof(szUserPassword)); p = szUserPassword; p2 = szUserPassword+countof(szUserPassword)-1; while (*pszEnd && (p < p2)) { if ((*pszEnd == 0) || (*pszEnd == L':') || (*pszEnd == L'"')) { break; } else if (*pszEnd == L'^') { pszEnd++; *(p++) = *(pszEnd++); } else { *(p++) = *(pszEnd++); } } *p = 0; } } else { bForceUserDialog = TRUE; } } // L'u' break; } } } if (pszEnd > pszFind) { // pszEnd должен указывать на конец -new_console[:...] / -cur_console[:...] // и включать обрамляющую кавычку, если он окавычен if (lbQuot) { if (*pszEnd == L'"' && *(pszEnd-1) != L'"') pszEnd++; } else { while (*(pszEnd-1) == L'"') pszEnd--; } // Откусить лишние пробелы, которые стоят ПЕРЕД -new_console[:...] / -cur_console[:...] while (((pszFind - 1) > pszSpecialCmd) && (*(pszFind-1) == L' ') && ((*(pszFind-2) == L' ') || (/**pszEnd == L'"' ||*/ *pszEnd == 0 || *pszEnd == L' '))) { pszFind--; } wmemmove(pszFind, pszEnd, (lstrlen(pszEnd)+1)); nChanges++; } else { _ASSERTE(pszEnd > pszFind); *pszFind = 0; nChanges++; } } } return nChanges; }
int CIconList::CreateTabIcon(LPCWSTR asIconDescr, bool bAdmin, LPCWSTR asWorkDir) { if (bAdmin && !gpSet->isAdminShield()) bAdmin = false; if (!asIconDescr || !*asIconDescr) return GetTabIcon(bAdmin); for (INT_PTR i = 0; i < m_Icons.size(); i++) { const TabIconCache& icn = m_Icons[i]; if ((icn.bAdmin!=FALSE) != bAdmin) continue; if (lstrcmpi(icn.pszIconDescr, asIconDescr) != 0) continue; // Already was created! return icn.nIconIdx; } wchar_t* pszExpanded = ExpandEnvStr(asIconDescr); // Need to be created! int iIconIdx = -1; HICON hFileIcon = NULL; wchar_t szTemp[MAX_PATH]; LPCWSTR pszLoadFile = pszExpanded ? pszExpanded : asIconDescr; LPCWSTR lpszExt = (wchar_t*)PointToExt(pszLoadFile); wchar_t szCurDir[MAX_PATH*2] = L""; if (asWorkDir && *asWorkDir && GetCurrentDirectory(countof(szCurDir), szCurDir) && *szCurDir) { // Executable (or icon) file may be not availbale by %PATH%, let "cd" to it... SetCurrentDirectory(asWorkDir); } if (!lpszExt) { LPWSTR pszFile = NULL; if (SearchPath(NULL, pszLoadFile, L".exe", countof(szTemp), szTemp, &pszFile)) { pszLoadFile = szTemp; lpszExt = (wchar_t*)PointToExt(pszLoadFile); } if (!lpszExt) goto wrap; } if (lstrcmpi(lpszExt, L".ico") == 0) { hFileIcon = (HICON)LoadImage(0, pszLoadFile, IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR|LR_LOADFROMFILE); } else if ((lstrcmpi(lpszExt, L".exe") == 0) || (lstrcmpi(lpszExt, L".dll") == 0)) { //TODO: May be specified index of an icon in the file HICON hIconLarge = NULL; ExtractIconEx(pszLoadFile, 0, &hIconLarge, &hFileIcon, 1); if (hIconLarge) DestroyIcon(hIconLarge); } else { //TODO: Shell icons for registered files (cmd, bat, sh, pl, py, ...) } if (hFileIcon) { int iIconIdxAdm = -1; iIconIdx = ImageList_ReplaceIcon(mh_TabIcons, -1, hFileIcon); TabIconCache NewIcon = {lstrdup(asIconDescr), false, iIconIdx}; m_Icons.push_back(NewIcon); HIMAGELIST hAdmList = ImageList_Merge(mh_TabIcons, iIconIdx, mh_TabIcons, mn_AdminIcon+2, 0,0); if (hAdmList) { HICON hNewIcon = ImageList_GetIcon(hAdmList, 0, ILD_TRANSPARENT); if (hNewIcon) { iIconIdxAdm = ImageList_ReplaceIcon(mh_TabIcons, -1, hNewIcon); DestroyIcon(hNewIcon); TabIconCache AdmIcon = {lstrdup(asIconDescr), true, iIconIdxAdm}; m_Icons.push_back(AdmIcon); if (bAdmin && (iIconIdxAdm > 0)) { iIconIdx = iIconIdxAdm; } } } //TODO: bAdmin!!! DestroyIcon(hFileIcon); } wrap: if (*szCurDir) SetCurrentDirectory(szCurDir); SafeFree(pszExpanded); return iIconIdx; }
BOOL REProgress::CheckForEsc(BOOL abForceRead /*= FALSE*/) { if (bEscaped) return TRUE; if (!abForceRead) return FALSE; INPUT_RECORD *InputRec; DWORD NumberOfEvents, ReadCnt,i; HANDLE Console = GetStdHandle(STD_INPUT_HANDLE); if(GetNumberOfConsoleInputEvents(Console,&NumberOfEvents) && NumberOfEvents) { if((InputRec=(INPUT_RECORD *)calloc(NumberOfEvents,sizeof(INPUT_RECORD))) != NULL) { if(PeekConsoleInput(Console,InputRec,NumberOfEvents,&ReadCnt)) { i=0; while (i < ReadCnt) { if (InputRec[i].EventType == KEY_EVENT && InputRec[i].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) { BOOL lbKeyDown = InputRec[i].Event.KeyEvent.bKeyDown; while (((i+1) < ReadCnt) && InputRec[i+1].EventType == KEY_EVENT && InputRec[i+1].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) { if (!lbKeyDown && InputRec[i].Event.KeyEvent.bKeyDown) lbKeyDown = TRUE; i++; } // Останов - только если кнопка была НАЖАТА, а не "отпущена" if (lbKeyDown) { // Подтвердить останов bEscaped = (psi.Message(_PluginNumber(guid_ConfirmCancel),FMSG_WARNING|FMSG_ALLINONE,NULL, (const TCHAR * const *)GetMsg(REM_ConfirmOperationCancel),0,2) == 0); if (!PeekConsoleInput(Console,InputRec,NumberOfEvents,&ReadCnt)) ReadCnt = 0; } else { ReadCnt = i+1; } // После отображенного диалога - событий в буфере может уже и не быть //ReadConsoleInput(Console,InputRec,i+1,&ReadCnt); if(ReadCnt) { //if (InputRec[0].EventType == KEY_EVENT && InputRec[0].Event.KeyEvent.wVirtualKeyCode == VK_ESCAPE) { ReadConsoleInput(Console,InputRec,ReadCnt,&ReadCnt); } } break; } i++; } } SafeFree(InputRec); } } return bEscaped; }
PyString::~PyString() { SafeFree(mStr); mStrLen = 0; }
static int TCPRecv(RecvInfo *Info) { SOCKET Socket = Info -> Socket; CompatibleAddr Peer = Info -> Peer; int state; char ResultBuffer[1024]; ExtendableBuffer Buffer; /* Sockets to server */ SOCKET TCPSocket = INVALID_SOCKET; SOCKET UDPSocket = INVALID_SOCKET; SOCKET *PrimarySocketPtr; SOCKET *SecondarySocketPtr; DNSQuaryProtocol PrimaryProtocol; char ProtocolStr[8] = {0}; strncpy(ProtocolStr, ConfigGetString(&ConfigInfo, "PrimaryServer"), 3); StrToLower(ProtocolStr); if( strcmp(ProtocolStr, "tcp") == 0 ) { PrimaryProtocol = DNS_QUARY_PROTOCOL_TCP; PrimarySocketPtr = &TCPSocket; if( ConfigGetString(&ConfigInfo, "UDPServer") != NULL ) SecondarySocketPtr = &UDPSocket; else SecondarySocketPtr = NULL; } else { PrimaryProtocol = DNS_QUARY_PROTOCOL_UDP; PrimarySocketPtr = &UDPSocket; if( ConfigGetString(&ConfigInfo, "TCPServer") != NULL ) SecondarySocketPtr = &TCPSocket; else SecondarySocketPtr = NULL; } ExtendableBuffer_Init(&Buffer, 512, 10240); while(TRUE){ state = recv(Socket, ResultBuffer, sizeof(ResultBuffer), MSG_NOSIGNAL); if(GET_LAST_ERROR() == TCP_TIME_OUT) { break; } if( state < 1 ) { break; } Query(PrimarySocketPtr, SecondarySocketPtr, PrimaryProtocol, ResultBuffer, state, &Socket, &Peer, &Buffer); ExtendableBuffer_Reset(&Buffer); } CLOSE_SOCKET(TCPSocket); CLOSE_SOCKET(UDPSocket); CLOSE_SOCKET(Socket); if( Family == AF_INET ) { INFO("Closed TCP connection to %s:%d\n", inet_ntoa(Peer.Addr4.sin_addr), Peer.Addr4.sin_port); } else { char Addr[LENGTH_OF_IPV6_ADDRESS_ASCII] = {0}; IPv6AddressToAsc(&(Peer.Addr6.sin6_addr), Addr); INFO("Closed TCP connection to %s:%d\n", Addr, Peer.Addr6.sin6_port); } SafeFree(Info); EXIT_THREAD(0); }
INT_PTR CDlgItemHelper::GetString(HWND hParent, WORD nCtrlId, wchar_t** ppszStr, LPCWSTR asNoDefault /*= NULL*/, bool abListBox /*= false*/) { INT_PTR nSel = abListBox ? SendDlgItemMessage(hParent, nCtrlId, CB_GETCURSEL, 0, 0) : -1; INT_PTR nLen = abListBox ? ((nSel >= 0) ? SendDlgItemMessage(hParent, nCtrlId, CB_GETLBTEXTLEN, nSel, 0) : 0) : SendDlgItemMessage(hParent, nCtrlId, WM_GETTEXTLENGTH, 0, 0); if (!ppszStr) return nLen; if (nLen<=0) { SafeFree(*ppszStr); return nLen; } wchar_t* pszNew = (TCHAR*)calloc(nLen+1, sizeof(TCHAR)); if (!pszNew) { _ASSERTE(pszNew!=NULL); } else { if (abListBox) { if (nSel >= 0) SendDlgItemMessage(hParent, nCtrlId, CB_GETLBTEXT, nSel, (LPARAM)pszNew); } else { GetDlgItemText(hParent, nCtrlId, pszNew, nLen+1); } if (*ppszStr) { if (lstrcmp(*ppszStr, pszNew) == 0) { free(pszNew); return nLen; // Изменений не было } } // Значение "по умолчанию" не запоминаем if (asNoDefault && lstrcmp(pszNew, asNoDefault) == 0) { SafeFree(*ppszStr); SafeFree(pszNew); nLen = 0; // Reset (it is default value!) return nLen; } if (nLen > (*ppszStr ? (INT_PTR)_tcslen(*ppszStr) : 0)) { if (*ppszStr) free(*ppszStr); *ppszStr = pszNew; pszNew = NULL; } else if (*ppszStr) { _wcscpy_c(*ppszStr, nLen+1, pszNew); } SafeFree(pszNew); } return nLen; }
LRESULT CSetPgSizePos::OnEditChanged(HWND hDlg, WORD nCtrlId) { switch (nCtrlId) { case tWndX: case tWndY: if (isChecked(hDlg, rNormal) == BST_CHECKED) { wchar_t *pVal = GetDlgItemTextPtr(hDlg, nCtrlId); bool bValid = (pVal && isDigit(*pVal)); enableDlgItem(hDlg, cbApplyPos, bValid); SafeFree(pVal); } break; // case tWndX: case tWndY: case tWndWidth: case tWndHeight: if (isChecked(hDlg, rNormal) == BST_CHECKED) { CESize sz = {0}; wchar_t *pVal = GetDlgItemTextPtr(hDlg, nCtrlId); bool bValid = (pVal && sz.SetFromString(false, pVal)); enableDlgItem(hDlg, cbApplyPos, bValid); SafeFree(pVal); } break; // case tWndWidth: case tWndHeight: case tPadSize: { BOOL bPadOk = FALSE; UINT nNewPad = GetDlgItemInt(hDlg, nCtrlId, &bPadOk, FALSE); if (nNewPad >= CENTERCONSOLEPAD_MIN && nNewPad <= CENTERCONSOLEPAD_MAX) gpSet->nCenterConsolePad = nNewPad; else if (nNewPad > CENTERCONSOLEPAD_MAX) SetDlgItemInt(hDlg, nCtrlId, CENTERCONSOLEPAD_MAX, FALSE); // Если юзер ставит "бордюр" то нужно сразу включить опцию, чтобы он работал if (gpSet->nCenterConsolePad && !isChecked(hDlg, cbTryToCenter)) { gpSet->isTryToCenter = true; checkDlgButton(hDlg, cbTryToCenter, BST_CHECKED); } // Update window/console size if (gpSet->isTryToCenter) gpConEmu->OnSize(); break; } case tLongOutputHeight: { BOOL lbOk = FALSE; wchar_t szTemp[16]; UINT nNewVal = GetDlgItemInt(hDlg, nCtrlId, &lbOk, FALSE); if (lbOk) { if (nNewVal >= LONGOUTPUTHEIGHT_MIN && nNewVal <= LONGOUTPUTHEIGHT_MAX) gpSet->DefaultBufferHeight = nNewVal; else if (nNewVal > LONGOUTPUTHEIGHT_MAX) SetDlgItemInt(hDlg, nCtrlId, gpSet->DefaultBufferHeight, FALSE); } else { SetDlgItemText(hDlg, nCtrlId, _ltow(gpSet->DefaultBufferHeight, szTemp, 10)); } break; } //case tLongOutputHeight: default: _ASSERTE(FALSE && "EditBox was not processed"); } return 0; }
void AppSettings::FreeApps() { SafeFree(AppNames); SafeFree(AppNamesLwr); cchNameMax = 0; }
LONG CKrkr2Lite::ReleaseAll() { SafeFree(&m_pbXP3Index); return __super::ReleaseAll(); }
void UpdateComspec(ConEmuComspec* pOpt, bool DontModifyPath /*= false*/) { if (!pOpt) { _ASSERTE(pOpt!=NULL); return; } if (pOpt->isUpdateEnv && (pOpt->csType != cst_EnvVar)) { //if (pOpt->csType == cst_AutoTccCmd) -- always, if isUpdateEnv { LPCWSTR pszNew = NULL; switch (pOpt->csBits) { case csb_SameOS: pszNew = IsWindows64() ? pOpt->Comspec64 : pOpt->Comspec32; break; case csb_SameApp: pszNew = WIN3264TEST(pOpt->Comspec32,pOpt->Comspec64); break; case csb_x32: pszNew = pOpt->Comspec32; break; default: _ASSERTE(pOpt->csBits==csb_SameOS || pOpt->csBits==csb_SameApp || pOpt->csBits==csb_x32); pszNew = NULL; } if (pszNew && *pszNew) { #ifdef SHOW_COMSPEC_CHANGE wchar_t szCurrent[MAX_PATH]; GetEnvironmentVariable(L"ComSpec", szCurrent, countof(szCurrent)); if (lstrcmpi(szCurrent, pszNew)) { wchar_t szMsg[MAX_PATH*4], szProc[MAX_PATH] = {}, szPid[MAX_PATH]; GetModuleFileName(NULL, szProc, countof(szProc)); _wsprintf(szPid, SKIPLEN(countof(szPid)) L"PID=%u, '%s'", GetCurrentProcessId(), PointToName(szProc)); _wsprintf(szMsg, SKIPLEN(countof(szMsg)) L"Changing %%ComSpec%% in %s\nCur=%s\nNew=%s", szPid , szCurrent, pszNew); MessageBox(NULL, szMsg, szPid, MB_SYSTEMMODAL); } #endif _ASSERTE(wcschr(pszNew, L'%')==NULL); SetEnvVarExpanded(L"ComSpec", pszNew); } } } if (pOpt->AddConEmu2Path && !DontModifyPath) { if ((pOpt->ConEmuBaseDir[0] == 0) || (pOpt->ConEmuExeDir[0] == 0)) { _ASSERTE(pOpt->ConEmuBaseDir[0] != 0); _ASSERTE(pOpt->ConEmuExeDir[0] != 0); } else { wchar_t* pszCur = GetEnvVar(L"PATH"); if (!pszCur) pszCur = lstrdup(L""); DWORD n = lstrlen(pszCur); wchar_t* pszUpr = lstrdup(pszCur); wchar_t* pszDirUpr = (wchar_t*)malloc(MAX_PATH*sizeof(*pszCur)); MCHKHEAP; if (!pszUpr || !pszDirUpr) { _ASSERTE(pszUpr && pszDirUpr); } else { bool bChanged = false; wchar_t* pszAdd = NULL; CharUpperBuff(pszUpr, n); for (int i = 0; i <= 1; i++) { // Put '%ConEmuExeDir' on first place switch (i) { case 1: if (!(pOpt->AddConEmu2Path & CEAP_AddConEmuExeDir)) continue; pszAdd = pOpt->ConEmuExeDir; break; case 0: if (!(pOpt->AddConEmu2Path & CEAP_AddConEmuBaseDir)) continue; if (lstrcmp(pOpt->ConEmuExeDir, pOpt->ConEmuBaseDir) == 0) continue; // второй раз ту же директорию не добавляем pszAdd = pOpt->ConEmuBaseDir; break; } int nDirLen = lstrlen(pszAdd); lstrcpyn(pszDirUpr, pszAdd, MAX_PATH); CharUpperBuff(pszDirUpr, nDirLen); MCHKHEAP; // Need to find exact match! bool bFound = false; LPCWSTR pszFind = wcsstr(pszUpr, pszDirUpr); while (pszFind) { if (pszFind[nDirLen] == L';' || pszFind[nDirLen] == 0) { // OK, found bFound = true; break; } // Next try (may be partial match of subdirs...) pszFind = wcsstr(pszFind+nDirLen, pszDirUpr); } if (!bFound) { wchar_t* pszNew = lstrmerge(pszAdd, L";", pszCur); if (!pszNew) { _ASSERTE(pszNew && "Failed to reallocate PATH variable"); break; } MCHKHEAP; SafeFree(pszCur); pszCur = pszNew; bChanged = true; // Set flag, check next dir } } MCHKHEAP; if (bChanged) { SetEnvironmentVariable(L"PATH", pszCur); } } MCHKHEAP; SafeFree(pszUpr); SafeFree(pszDirUpr); MCHKHEAP; SafeFree(pszCur); } } }
BOOL DumpImage(HDC hScreen, HBITMAP hBitmap, int anX, int anY, int anWidth, int anHeight, LPCWSTR pszFile, bool PreserveTransparency/*=true*/) { BOOL lbRc = FALSE; LPBYTE pScreen = NULL; DWORD cbOut = 0; wchar_t* pszDot = NULL; wchar_t szFile[MAX_PATH+1] = {}; if (pszFile) { lstrcpynW(szFile, pszFile, MAX_PATH); pszDot = (wchar_t*)PointToExt(szFile); } #ifdef PNGDUMP // Если передали готовый hBitmap - сохранить сразу if (pszDot) lstrcpyW(pszDot, L".png"); if (hBitmap && SaveImageEx(szFile, hBitmap)) { return TRUE; } #endif // иначе - снять копию с hScreen if (!LoadScreen(hScreen, anX, anY, anWidth, anHeight, &pScreen, &cbOut, PreserveTransparency)) return FALSE; if (!*szFile) { //static wchar_t szLastDumpFile[MAX_PATH]; SYSTEMTIME st; GetLocalTime(&st); _wsprintf(szFile, SKIPLEN(countof(szFile)) L"%02u%02u%02u%02u%02u%02u", st.wYear%100, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); OPENFILENAME ofn; memset(&ofn,0,sizeof(ofn)); ofn.lStructSize=sizeof(ofn); HWND h = GetForegroundWindow(); DWORD nPID = 0; if (h) GetWindowThreadProcessId(h, &nPID); ofn.hwndOwner = (nPID == GetCurrentProcessId()) ? h : ghWnd; #ifdef PNGDUMP ofn.lpstrFilter = L"PNG (*.png)\0*.png\0JPEG (*.jpg)\0*.jpg\0BMP (*.bmp)\0*.bmp\0\0"; ofn.lpstrDefExt = L"png"; #else ofn.lpstrFilter = L"BMP (*.bmp)\0*.bmp\0\0"; ofn.lpstrDefExt = L"bmp"; #endif ofn.nFilterIndex = 1; ofn.lpstrFile = szFile; ofn.nMaxFile = countof(szFile); ofn.lpstrTitle = L"Save screenshot"; ofn.Flags = OFN_ENABLESIZING|OFN_NOCHANGEDIR | OFN_PATHMUSTEXIST|OFN_EXPLORER|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT; if (!GetSaveFileName(&ofn) || ((pszDot = (wchar_t*)PointToExt(szFile)) == NULL)) { lbRc = TRUE; // чтобы не ругалось... goto wrap; } //wcscpy_c(szFile, szLastDumpFile); } #ifdef PNGDUMP if (SaveImageEx(szFile, pScreen, cbOut)) { lbRc = TRUE; goto wrap; } #endif if (pScreen && cbOut) { if (pszDot) { #ifdef PNGDUMP lstrcpyW(pszDot, L".png"); #else lstrcpyW(pszDot, L".bmp"); #endif HANDLE hFile = CreateFile(szFile, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (hFile != INVALID_HANDLE_VALUE) { DWORD dwWritten = 0; lbRc = WriteFile(hFile, pScreen, cbOut, &dwWritten, 0); CloseHandle(hFile); } } } wrap: SafeFree(pScreen); return lbRc; }
bool CBackgroundInfo::LoadBackgroundFile(bool abShowErrors) { // Пустой путь - значит БЕЗ обоев if (!*ms_BgImage) { return true; } //_ASSERTE(isMainThread()); _ASSERTE(isMainThread()); bool lRes = false; BY_HANDLE_FILE_INFORMATION inf = {0}; BITMAPFILEHEADER* pBkImgData = NULL; if (wcspbrk(ms_BgImage, L"%\\.") == NULL) { // May be "Solid color" COLORREF clr = (COLORREF)-1; if (GetColorRef(ms_BgImage, &clr)) { pBkImgData = CreateSolidImage(clr, 128, 128); } } if (!pBkImgData) { wchar_t* exPath = ExpandEnvStr(ms_BgImage); if (!exPath || !*exPath) { if (abShowErrors) { wchar_t szError[MAX_PATH*2]; DWORD dwErr = GetLastError(); _wsprintf(szError, SKIPLEN(countof(szError)) L"Can't expand environment strings:\r\n%s\r\nError code=0x%08X\r\nImage loading failed", ms_BgImage, dwErr); MBoxA(szError); } SafeFree(exPath); return false; } pBkImgData = LoadImageEx(exPath, inf); SafeFree(exPath); } if (pBkImgData) { ftBgModified = inf.ftLastWriteTime; nBgModifiedTick = GetTickCount(); //NeedBackgroundUpdate(); //MSectionLock SBG; SBG.Lock(&mcs_BgImgData); SafeFree(mp_BgImgData); mb_IsBackgroundImageValid = true; mp_BgImgData = pBkImgData; lRes = true; } return lRes; }
CTabPanelWin::~CTabPanelWin() { SafeFree(gp_TabPanelWinMap); SafeDelete(mp_ToolImg); }
// Консоль любит глючить, при попытках запроса более определенного количества ячеек. // MAX_CONREAD_SIZE подобрано экспериментально BOOL ReadConsoleOutputEx(HANDLE hOut, CHAR_INFO *pData, COORD bufSize, SMALL_RECT rgn) { BOOL lbRc = FALSE; DWORD nTick1 = GetTickCount(), nTick2 = 0, nTick3 = 0, nTick4 = 0, nTick5 = 0; static bool bDBCS = false, bDBCS_Checked = false; if (!bDBCS_Checked) { bDBCS = (GetSystemMetrics(SM_DBCSENABLED) != 0); bDBCS_Checked = true; } bool bDBCS_CP = bDBCS; LPCSTR szLeads = NULL; UINT MaxCharSize = 0; DWORD nCP, nCP1, nMode; if (bDBCS) { nCP = GetConsoleOutputCP(); nCP1 = GetConsoleCP(); GetConsoleMode(hOut, &nMode); szLeads = GetCpInfoLeads(nCP, &MaxCharSize); if (!szLeads || !*szLeads || MaxCharSize < 2) { bDBCS_CP = false; } } size_t nBufWidth = bufSize.X; int nWidth = (rgn.Right - rgn.Left + 1); int nHeight = (rgn.Bottom - rgn.Top + 1); int nCurSize = nWidth * nHeight; _ASSERTE(bufSize.X >= nWidth); _ASSERTE(bufSize.Y >= nHeight); _ASSERTE(rgn.Top>=0 && rgn.Bottom>=rgn.Top); _ASSERTE(rgn.Left>=0 && rgn.Right>=rgn.Left); //MSectionLock RCS; //if (gpSrv->pReqSizeSection && !RCS.Lock(gpSrv->pReqSizeSection, TRUE, 30000)) //{ // _ASSERTE(FALSE); // SetLastError(ERROR_INVALID_PARAMETER); // return FALSE; //} COORD bufCoord = {0,0}; DWORD dwErrCode = 0; nTick2 = GetTickCount(); if (!bDBCS_CP && (nCurSize <= MAX_CONREAD_SIZE)) { if (ReadConsoleOutputW(hOut, pData, bufSize, bufCoord, &rgn)) lbRc = TRUE; nTick3 = GetTickCount(); } if (!lbRc) { // Придется читать построчно // Теоретически - можно и блоками, но оверхед очень маленький, а велик // шанс обломаться, если консоль "глючит". Поэтому построчно... //bufSize.X = TextWidth; bufSize.Y = 1; bufCoord.X = 0; bufCoord.Y = 0; //rgn = gpSrv->sbi.srWindow; int Y1 = rgn.Top; int Y2 = rgn.Bottom; CHAR_INFO* pLine = pData; if (!bDBCS_CP) { for (int y = Y1; y <= Y2; y++, rgn.Top++, pLine+=nBufWidth) { nTick3 = GetTickCount(); rgn.Bottom = rgn.Top; lbRc = ReadConsoleOutputW(hOut, pLine, bufSize, bufCoord, &rgn); if (!lbRc) { dwErrCode = GetLastError(); _ASSERTE(FALSE && "ReadConsoleOutputW failed in MyReadConsoleOutput"); break; } nTick4 = GetTickCount(); } } else { DWORD nAttrsMax = bufSize.X; DWORD nCharsMax = nAttrsMax/* *4 */; // -- максимум там вроде на некоторых CP - 4 байта wchar_t* pszChars = (wchar_t*)malloc(nCharsMax*sizeof(*pszChars)); char* pszCharsA = (char*)malloc(nCharsMax*sizeof(*pszCharsA)); WORD* pnAttrs = (WORD*)malloc(bufSize.X*sizeof(*pnAttrs)); if (pszChars && pszCharsA && pnAttrs) { COORD crRead = {rgn.Left,Y1}; DWORD nChars, nAttrs, nCharsA; CHAR_INFO* pLine = pData; for (; crRead.Y <= Y2; crRead.Y++, pLine+=nBufWidth) { nTick3 = GetTickCount(); rgn.Bottom = rgn.Top; nChars = nCharsA = nAttrs = 0; BOOL lbRcTxt = ReadConsoleOutputCharacterA(hOut, pszCharsA, nCharsMax, crRead, &nCharsA); dwErrCode = GetLastError(); if (!lbRcTxt || !nCharsA) { nCharsA = 0; lbRcTxt = ReadConsoleOutputCharacterW(hOut, pszChars, nCharsMax, crRead, &nChars); dwErrCode = GetLastError(); } BOOL lbRcAtr = ReadConsoleOutputAttribute(hOut, pnAttrs, bufSize.X, crRead, &nAttrs); dwErrCode = GetLastError(); lbRc = lbRcTxt && lbRcAtr; if (!lbRc) { dwErrCode = GetLastError(); _ASSERTE(FALSE && "ReadConsoleOutputAttribute failed in MyReadConsoleOutput"); CHAR_INFO* p = pLine; for (size_t i = 0; i < nAttrsMax; ++i, ++p) { p->Attributes = 4; // red on black p->Char.UnicodeChar = 0xFFFE; // not a character } break; } else { if (nCharsA) { nChars = MultiByteToWideChar(nCP, 0, pszCharsA, nCharsA, pszChars, nCharsMax); } CHAR_INFO* p = pLine; wchar_t* psz = pszChars; WORD* pn = pnAttrs; //int i = nAttrsMax; //while ((i--) > 0) //{ // p->Attributes = *(pn++); // p->Char.UnicodeChar = *(psz++); // p++; //} size_t x1 = min(nChars,nAttrsMax); size_t x2 = nAttrsMax; for (size_t i = 0; i < x1; ++i, ++p) { p->Attributes = *pn; p->Char.UnicodeChar = *psz; WARNING("Некорректно! pn может указывать на начало блока DBCS/QBCS"); pn++; // += MaxCharSize; psz++; } WORD nLastAttr = pnAttrs[max(0,(int)nAttrs-1)]; for (size_t i = x1; i < x2; ++i, ++p) { p->Attributes = nLastAttr; p->Char.UnicodeChar = L' '; } } nTick4 = GetTickCount(); } } SafeFree(pszChars); SafeFree(pszCharsA); SafeFree(pnAttrs); } nTick5 = GetTickCount(); } UNREFERENCED_PARAMETER(nTick1); UNREFERENCED_PARAMETER(nTick2); UNREFERENCED_PARAMETER(nTick3); UNREFERENCED_PARAMETER(nTick4); UNREFERENCED_PARAMETER(nTick5); return lbRc; }
void ConEmuUpdateSettings::ResetToDefaults() { // Указатели должны быть освобождены перед вызовом _ASSERTE(szUpdateExeCmdLine==NULL); szUpdateVerLocation = NULL; isUpdateCheckOnStartup = false; isUpdateCheckHourly = false; isUpdateConfirmDownload = true; // true-Show MessageBox, false-notify via TSA only isUpdateUseBuilds = 0; // 0-спросить пользователя при первом запуске, 1-stable only, 2-latest, 3-preview isUpdateUseProxy = false; szUpdateProxy = szUpdateProxyUser = szUpdateProxyPassword = NULL; // "Server:port" // Проверяем, была ли программа установлена через ConEmuSetup.exe? isUpdateDownloadSetup = 0; // 0-Auto, 1-Installer (ConEmuSetup.exe), 2-7z archieve (ConEmu.7z), WinRar or 7z required isSetupDetected = 0; // 0-пока не проверялся, 1-установлено через Installer, пути совпали, 2-Installer не запускался szUpdateExeCmdLineDef = lstrdup(L"\"%1\" /p:%3 /qr"); SafeFree(szUpdateExeCmdLine); bool bWinRar = false; wchar_t* pszArcPath = NULL; BOOL bWin64 = IsWindows64(); for (int i = 0; !(pszArcPath && *pszArcPath) && (i <= 5); i++) { SettingsRegistry regArc; switch (i) { case 0: if (regArc.OpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\7-Zip", KEY_READ|(bWin64?KEY_WOW64_32KEY:0))) { regArc.Load(L"Path", &pszArcPath); } break; case 1: if (bWin64 && regArc.OpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\7-Zip", KEY_READ|KEY_WOW64_64KEY)) { regArc.Load(L"Path", &pszArcPath); } break; case 2: if (regArc.OpenKey(HKEY_CURRENT_USER, L"SOFTWARE\\7-Zip", KEY_READ)) { regArc.Load(L"Path", &pszArcPath); } break; case 3: if (regArc.OpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\WinRAR", KEY_READ|(bWin64?KEY_WOW64_32KEY:0))) { bWinRar = true; regArc.Load(L"exe32", &pszArcPath); } break; case 4: if (bWin64 && regArc.OpenKey(HKEY_LOCAL_MACHINE, L"SOFTWARE\\WinRAR", KEY_READ|KEY_WOW64_64KEY)) { bWinRar = true; regArc.Load(L"exe64", &pszArcPath); } break; case 5: if (regArc.OpenKey(HKEY_CURRENT_USER, L"SOFTWARE\\WinRAR", KEY_READ)) { bWinRar = true; if (!regArc.Load(L"exe32", &pszArcPath) && bWin64) { regArc.Load(L"exe64", &pszArcPath); } } break; } } if (!pszArcPath || !*pszArcPath) { szUpdateArcCmdLineDef = lstrdup(L"\"%ProgramFiles%\\7-Zip\\7zg.exe\" x -y \"%1\""); // "%1"-archive file, "%2"-ConEmu base dir } else { LPCWSTR pszExt = PointToExt(pszArcPath); int cchMax = lstrlen(pszArcPath)+64; szUpdateArcCmdLineDef = (wchar_t*)malloc(cchMax*sizeof(wchar_t)); if (szUpdateArcCmdLineDef) { if (pszExt && lstrcmpi(pszExt, L".exe") == 0) { _ASSERTE(bWinRar==true); //Issue 537: old WinRAR beta's fails //_wsprintf(szUpdateArcCmdLineDef, SKIPLEN(cchMax) L"\"%s\" x -y \"%%1\"%s", pszArcPath, bWinRar ? L" \"%%2\\\"" : L""); _wsprintf(szUpdateArcCmdLineDef, SKIPLEN(cchMax) L"\"%s\" x -y \"%%1\"", pszArcPath); } else { _ASSERTE(bWinRar==false); int nLen = lstrlen(pszArcPath); bool bNeedSlash = (*pszArcPath && (pszArcPath[nLen-1] != L'\\')) ? true : false; _wsprintf(szUpdateArcCmdLineDef, SKIPLEN(cchMax) L"\"%s%s7zg.exe\" x -y \"%%1\"", pszArcPath, bNeedSlash ? L"\\" : L""); } } } SafeFree(pszArcPath); SafeFree(szUpdateArcCmdLine); szUpdateDownloadPath = lstrdup(L"%TEMP%\\ConEmu"); isUpdateLeavePackages = false; szUpdatePostUpdateCmd = lstrdup(L"echo Last successful update>ConEmuUpdate.info && date /t>>ConEmuUpdate.info && time /t>>ConEmuUpdate.info"); // Юзер может чего-то свое делать с распакованными файлами }
// Не интересуется результатом команды! BOOL CConEmuPipe::Execute(int nCmd, LPCVOID apData, UINT anDataSize) { WARNING("Если указан mdw_Timeout - создать нить и выполнять команду в ней. Ожидать нить не более и прибить ее, если пришел Timeout"); MCHKHEAP if (nCmd<(int)CMD_FIRST_FAR_CMD || nCmd>(int)CMD_LAST_FAR_CMD) { TCHAR szError[128]; _wsprintf(szError, SKIPLEN(countof(szError)) _T("Invalid command id (%i)!"), nCmd); MBoxA(szError); return FALSE; } #ifdef _DEBUG WCHAR szMsg[64]; _wsprintf(szMsg, SKIPLEN(countof(szMsg)) _T("Pipe:Execute(%i)\n"), nCmd); DEBUGSTR(szMsg); #endif int nAllSize = sizeof(CESERVER_REQ_HDR)+anDataSize; CESERVER_REQ* pIn = ExecuteNewCmd(nCmd, nAllSize); if (!pIn) { _ASSERTE(pIn!=NULL); TCHAR szError[128]; _wsprintf(szError, SKIPLEN(countof(szError)) _T("Pipe: Can't allocate memory (%i) bytes, Cmd = %i!"), nAllSize, nCmd); MBoxA(szError); Close(); return FALSE; } if (apData && anDataSize) { memmove(pIn->Data, apData, anDataSize); } DWORD dwTickStart = timeGetTime(); BYTE cbReadBuf[512]; BOOL fSuccess; DWORD cbRead, dwErr; // Send a message to the pipe server and read the response. fSuccess = TransactNamedPipe( mh_Pipe, // pipe handle pIn, // message to server pIn->hdr.cbSize, // message length cbReadBuf, // buffer to receive reply sizeof(cbReadBuf), // size of read buffer &cbRead, // bytes read NULL); // not overlapped dwErr = GetLastError(); gpSetCls->debugLogCommand(pIn, FALSE, dwTickStart, timeGetTime()-dwTickStart, ms_PipeName); if (!fSuccess && dwErr == ERROR_BROKEN_PIPE) { // Плагин не вернул данных, но обработал команду Close(); return TRUE; } else if (!fSuccess && (dwErr != ERROR_MORE_DATA)) { DEBUGSTR(L" - FAILED!\n"); TCHAR szError[128]; _wsprintf(szError, SKIPLEN(countof(szError)) _T("Pipe: TransactNamedPipe failed, Cmd = %i, ErrCode = 0x%08X!"), nCmd, dwErr); MBoxA(szError); Close(); return FALSE; } if (cbRead < sizeof(DWORD)) { pOut = NULL; Close(); return FALSE; } pOut = (CESERVER_REQ*)cbReadBuf; // Проверка размера if (pOut->hdr.cbSize <= sizeof(pOut->hdr)) { _ASSERTE(pOut->hdr.cbSize == 0); pOut = NULL; Close(); return FALSE; } if (pOut->hdr.nVersion != CESERVER_REQ_VER) { gpConEmu->ReportOldCmdVersion(pOut->hdr.nCmd, pOut->hdr.nVersion, -1, pOut->hdr.nSrcPID, pOut->hdr.hModule, pOut->hdr.nBits); pOut = NULL; Close(); return FALSE; } nAllSize = pOut->hdr.cbSize; pOut = NULL; if (nAllSize==0) { DEBUGSTR(L" - FAILED!\n"); DisplayLastError(L"Empty data recieved from server", 0); Close(); return FALSE; } pOut = (CESERVER_REQ*)calloc(nAllSize,1); _ASSERTE(pOut!=NULL); memmove(pOut, cbReadBuf, cbRead); _ASSERTE(pOut->hdr.nVersion==CESERVER_REQ_VER); LPBYTE ptrData = ((LPBYTE)pOut)+cbRead; nAllSize -= cbRead; while(nAllSize>0) { //_tprintf(TEXT("%s\n"), chReadBuf); // Break if TransactNamedPipe or ReadFile is successful if (fSuccess) break; // Read from the pipe if there is more data in the message. fSuccess = ReadFile( mh_Pipe, // pipe handle ptrData, // buffer to receive reply nAllSize, // size of buffer &cbRead, // number of bytes read NULL); // not overlapped // Exit if an error other than ERROR_MORE_DATA occurs. if (!fSuccess && (GetLastError() != ERROR_MORE_DATA)) break; ptrData += cbRead; nAllSize -= cbRead; } TODO("Может возникнуть ASSERT, если консоль была закрыта в процессе чтения"); _ASSERTE(nAllSize==0); SafeCloseHandle(mh_Pipe); SafeFree(pIn); lpCursor = pOut->Data; dwMaxDataSize = pOut->hdr.cbSize - sizeof(CESERVER_REQ_HDR); return TRUE; }
VALUE Primitive (POSITION position) { char* board; char searchchar, horizchar; BOOLEAN* visited; BOOLEAN search_horiz; int i, current, r, c; lnode* stack = NULL; board = (char*)SafeMalloc((possize)*sizeof(char)); visited = (BOOLEAN*)SafeMalloc((boardsize)*sizeof(BOOLEAN)); for(i = 0; i < boardsize; i++) visited[i] = FALSE; generic_hash_unhash(position, board); if(swapmode == SWAP_DIRECTION || swapmode == SWAP_BOTH) horizchar = board[possize-1]; else horizchar = DEFAULT_HORIZPLAYER == WHITEPLAYER ? WHITECHAR : BLACKCHAR; if(generic_hash_turn(position) == WHITEPLAYER) searchchar = BLACKCHAR; else searchchar = WHITECHAR; if(horizchar == searchchar) { search_horiz = TRUE; for(i = 0; i < boardrows; i++) { if(board[boardcols*i] == searchchar) { push(&stack, boardcols*i); visited[boardcols*i] = TRUE; } } } else { search_horiz = FALSE; for(i = 0; i < boardcols; i++) { if(board[i] == searchchar) { push(&stack, i); visited[i] = TRUE; } } } while(stack != NULL) { current = pop(&stack); if((search_horiz && current % boardcols == boardcols - 1 && board[current] == searchchar) || (!search_horiz && current / boardcols == boardrows - 1 && board[current] == searchchar)) { stackfree(stack); SafeFree(visited); SafeFree(board); return gStandardGame ? lose : win; } else { r = (int)(current / boardcols); c = (int)(current % boardcols); if(inbounds(r-1, c) && !(visited[c+(r-1)*boardcols]) && board[c+(r-1)*boardcols] == searchchar) { push(&stack, c+(r-1)*boardcols); visited[c+(r-1)*boardcols] = TRUE; } if(inbounds(r-1, c+1) && !(visited[(c+1)+(r-1)*boardcols]) && board[(c+1)+(r-1)*boardcols] == searchchar) { push(&stack, (c+1) + (r-1)*boardcols); visited[(c+1)+(r-1)*boardcols] = TRUE; } if(inbounds(r, c-1) && !(visited[(c-1) + r*boardcols]) && board[(c-1) + r*boardcols] == searchchar) { push(&stack, (c-1) + r*boardcols); visited[(c-1) + r*boardcols] = TRUE; } if(inbounds(r, c+1) && !(visited[(c+1) + r*boardcols]) && board[(c+1) + r*boardcols] == searchchar) { push(&stack, (c+1) + r*boardcols); visited[(c+1) + r*boardcols] = TRUE; } if(inbounds(r+1, c-1) && !(visited[(c-1) + (r+1)*boardcols]) && board[(c-1) + (r+1)*boardcols] == searchchar) { push(&stack, (c-1) + (r+1)*boardcols); visited[(c-1) + (r+1)*boardcols] = TRUE; } if(inbounds(r+1, c) && !(visited[c+(r+1)*boardcols]) && board[c+(r+1)*boardcols] == searchchar) { push(&stack, c + (r+1)*boardcols); visited[(c + (r+1)*boardcols)] = TRUE; } } } stackfree(stack); SafeFree(visited); SafeFree(board); return undecided; }
bool IsNeedCmd(BOOL bRootCmd, LPCWSTR asCmdLine, CEStr &szExe, LPCWSTR* rsArguments /*= NULL*/, BOOL* rpbNeedCutStartEndQuot /*= NULL*/, BOOL* rpbRootIsCmdExe /*= NULL*/, BOOL* rpbAlwaysConfirmExit /*= NULL*/, BOOL* rpbAutoDisableConfirmExit /*= NULL*/) { bool rbNeedCutStartEndQuot = false; bool rbRootIsCmdExe = true; bool rbAlwaysConfirmExit = false; bool rbAutoDisableConfirmExit = false; wchar_t *pwszEndSpace; if (rsArguments) *rsArguments = NULL; bool lbRc = false; int iRc = 0; BOOL lbFirstWasGot = FALSE; LPCWSTR pwszCopy; int nLastChar; #ifdef _DEBUG CEStr szDbgFirst; #endif if (!asCmdLine || !*asCmdLine) { _ASSERTE(asCmdLine && *asCmdLine); goto wrap; } #ifdef _DEBUG // Это минимальные проверки, собственно к коду - не относятся bool bIsBatch = false; { LPCWSTR psz = asCmdLine; NextArg(&psz, szDbgFirst); psz = PointToExt(szDbgFirst); if (lstrcmpi(psz, L".cmd")==0 || lstrcmpi(psz, L".bat")==0) bIsBatch = true; } #endif if (!szExe.GetBuffer(MAX_PATH)) { _ASSERTE(FALSE && "Failed to allocate MAX_PATH"); lbRc = true; goto wrap; } szExe.Empty(); if (!asCmdLine || *asCmdLine == 0) { _ASSERTE(asCmdLine && *asCmdLine); lbRc = true; goto wrap; } pwszCopy = asCmdLine; // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" nLastChar = lstrlenW(pwszCopy) - 1; if (pwszCopy[0] == L'"' && pwszCopy[nLastChar] == L'"') { //if (pwszCopy[1] == L'"' && pwszCopy[2]) //{ // pwszCopy ++; // Отбросить первую кавычку в командах типа: ""c:\program files\arc\7z.exe" -?" // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} //else // глючила на ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" //if (wcschr(pwszCopy+1, L'"') == (pwszCopy+nLastChar)) { // LPCWSTR pwszTemp = pwszCopy; // // Получим первую команду (исполняемый файл?) // if ((iRc = NextArg(&pwszTemp, szArg)) != 0) { // //Parsing command line failed // lbRc = true; goto wrap; // } // pwszCopy ++; // Отбросить первую кавычку в командах типа: "c:\arc\7z.exe -?" // lbFirstWasGot = TRUE; // if (rbNeedCutStartEndQuot) *rbNeedCutStartEndQuot = TRUE; //} else { // Will be dequoted in 'NextArg' function. Examples // "C:\GCC\msys\bin\make.EXE -f "makefile" COMMON="../../../plugins/common"" // ""F:\VCProject\FarPlugin\#FAR180\far.exe -new_console"" // ""cmd"" // cmd /c ""c:\program files\arc\7z.exe" -?" // да еще и внутри могут быть двойными... // cmd /c "dir c:\" LPCWSTR pwszTemp = pwszCopy; // Получим первую команду (исполняемый файл?) if ((iRc = NextArg(&pwszTemp, szExe)) != 0) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } if (lstrcmpiW(szExe, L"start") == 0) { // Команду start обрабатывает только процессор #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } LPCWSTR pwszQ = pwszCopy + 1 + lstrlen(szExe); wchar_t* pszExpand = NULL; if (*pwszQ != L'"' && IsExecutable(szExe, &pszExpand)) { pwszCopy ++; // отбрасываем lbFirstWasGot = TRUE; if (pszExpand) { szExe.Set(pszExpand); SafeFree(pszExpand); if (rsArguments) *rsArguments = pwszQ; } rbNeedCutStartEndQuot = true; } } } // Получим первую команду (исполняемый файл?) if (!lbFirstWasGot) { szExe.Empty(); // `start` command must be processed by processor itself if ((lstrcmpni(pwszCopy, L"start", 5) == 0) && (!pwszCopy[5] || isSpace(pwszCopy[5]))) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } // 17.10.2010 - support executable file path without parameters, but with spaces in its path // 22.11.2015 - or some weirdness, like `C:\Program Files\CB/cb_console_runner.exe "C:\sources\app.exe"` LPCWSTR pchEnd = wcschr(pwszCopy, L' '); if (!pchEnd) pchEnd = pwszCopy + lstrlenW(pwszCopy); CEStr szTemp; DWORD nTempSize; while (pchEnd) { szTemp.Set(pwszCopy, (pchEnd - pwszCopy)); _ASSERTE(szTemp[(pchEnd - pwszCopy)] == 0); // If this is a full path without environment variables if (((IsFilePath(szTemp, true) && !wcschr(szTemp, L'%')) // or file/dir may be found via env.var. substitution or searching in %PATH% || FileExistsSearch((LPCWSTR)szTemp, szTemp)) // Than check if it is a FILE (not a directory) && FileExists(szTemp, &nTempSize) && nTempSize) { // OK, it an our executable? if (rsArguments) *rsArguments = pchEnd; szExe.Set(szTemp); break; } _ASSERTE(*pchEnd == 0 || *pchEnd == L' '); if (!*pchEnd) break; // Find next space after nonspace while (*(pchEnd) == L' ') pchEnd++; // If quoted string starts from here - it's supposed to be an argument if (*pchEnd == L'"') { // And we must not get here, because the executable must be already processed above // _ASSERTE(*pchEnd != L'"'); break; } pchEnd = wcschr(pchEnd, L' '); if (!pchEnd) pchEnd = pwszCopy + lstrlenW(pwszCopy); } if (szExe[0] == 0) { if ((iRc = NextArg(&pwszCopy, szExe)) != 0) { //Parsing command line failed #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } _ASSERTE(lstrcmpiW(szExe, L"start") != 0); // Обработка переменных окружения и поиск в PATH if (FileExistsSearch((LPCWSTR)szExe, szExe)) { if (rsArguments) *rsArguments = pwszCopy; } } } if (!*szExe) { _ASSERTE(szExe[0] != 0); } else { // Если юзеру нужен редирект - то он должен явно указать ком.процессор // Иначе нереально (или достаточно сложно) определить, является ли символ // редиректом, или это просто один из аргументов команды... // "Левые" символы в имени файла (а вот в "первом аргументе" все однозначно) if (wcspbrk(szExe, L"?*<>|")) { rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } // если "путь" не указан if (wcschr(szExe, L'\\') == NULL) { bool bHasExt = (wcschr(szExe, L'.') != NULL); // Проверим, может это команда процессора (типа "DIR")? if (!bHasExt) { bool bIsCommand = false; wchar_t* pszUppr = lstrdup(szExe); if (pszUppr) { // избежать линковки на user32.dll //CharUpperBuff(pszUppr, lstrlen(pszUppr)); for (wchar_t* p = pszUppr; *p; p++) { if (*p >= L'a' && *p <= 'z') *p -= 0x20; } const wchar_t* pszFind = gsInternalCommands; while (*pszFind) { if (lstrcmp(pszUppr, pszFind) == 0) { bIsCommand = true; break; } pszFind += lstrlen(pszFind)+1; } free(pszUppr); } if (bIsCommand) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } } // Try to find executable in %PATH% { #ifndef CONEMU_MINIMAL MWow64Disable wow; wow.Disable(); // Disable Wow64 file redirector #endif apiSearchPath(NULL, szExe, bHasExt ? NULL : L".exe", szExe); } } // end: if (wcschr(szExe, L'\\') == NULL) } // Если szExe не содержит путь к файлу - запускаем через cmd // "start "" C:\Utils\Files\Hiew32\hiew32.exe C:\00\Far.exe" if (!IsFilePath(szExe)) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; // запуск через "процессор" lbRc = true; goto wrap; // добавить "cmd.exe" } //pwszCopy = wcsrchr(szArg, L'\\'); if (!pwszCopy) pwszCopy = szArg; else pwszCopy ++; pwszCopy = PointToName(szExe); //2009-08-27 pwszEndSpace = szExe.ms_Val + lstrlenW(szExe) - 1; while ((*pwszEndSpace == L' ') && (pwszEndSpace > szExe)) { *(pwszEndSpace--) = 0; } #ifndef __GNUC__ #pragma warning( push ) #pragma warning(disable : 6400) #endif if (lstrcmpiW(pwszCopy, L"cmd")==0 || lstrcmpiW(pwszCopy, L"cmd.exe")==0 || lstrcmpiW(pwszCopy, L"tcc")==0 || lstrcmpiW(pwszCopy, L"tcc.exe")==0) { rbRootIsCmdExe = TRUE; // уже должен быть выставлен, но проверим rbAlwaysConfirmExit = TRUE; rbAutoDisableConfirmExit = FALSE; _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан командный процессор, cmd.exe в начало добавлять не нужно } // Issue 1211: Decide not to do weird heuristic. // If user REALLY needs redirection (root command, huh?) // - he must call "cmd /c ..." directly // Если есть одна из команд перенаправления, или слияния - нужен CMD.EXE if (!bRootCmd) { if (wcschr(asCmdLine, L'&') || wcschr(asCmdLine, L'>') || wcschr(asCmdLine, L'<') || wcschr(asCmdLine, L'|') || wcschr(asCmdLine, L'^') // или экранирования ) { #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif lbRc = true; goto wrap; } } //if (lstrcmpiW(pwszCopy, L"far")==0 || lstrcmpiW(pwszCopy, L"far.exe")==0) if (IsFarExe(pwszCopy)) { bool bFound = (wcschr(pwszCopy, L'.') != NULL); // Если указали при запуске просто "far" - это может быть батник, расположенный в %PATH% if (!bFound) { CEStr szSearch; if (apiSearchPath(NULL, pwszCopy, L".exe", szSearch)) { if (lstrcmpi(PointToExt(szSearch), L".exe") == 0) bFound = true; } } if (bFound) { rbAutoDisableConfirmExit = TRUE; rbRootIsCmdExe = FALSE; // FAR! _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // уже указан исполняемый файл, cmd.exe в начало добавлять не нужно } } if (IsExecutable(szExe)) { rbRootIsCmdExe = FALSE; // Для других программ - буфер не включаем _ASSERTE(!bIsBatch); lbRc = false; goto wrap; // Запускается конкретная консольная программа. cmd.exe не требуется } //Можно еще Доделать поиски с: SearchPath, GetFullPathName, добавив расширения .exe & .com //хотя фар сам формирует полные пути к командам, так что можно не заморачиваться #ifdef WARN_NEED_CMD _ASSERTE(FALSE); #endif rbRootIsCmdExe = TRUE; #ifndef __GNUC__ #pragma warning( pop ) #endif lbRc = true; wrap: if (rpbNeedCutStartEndQuot) *rpbNeedCutStartEndQuot = rbNeedCutStartEndQuot; if (rpbRootIsCmdExe) *rpbRootIsCmdExe = rbRootIsCmdExe; if (rpbAlwaysConfirmExit) *rpbAlwaysConfirmExit = rbAlwaysConfirmExit; if (rpbAutoDisableConfirmExit) *rpbAutoDisableConfirmExit = rbAutoDisableConfirmExit; return lbRc; }
IXMLDOMNode* SettingsXML::FindItem(IXMLDOMNode* apFrom, const wchar_t* asType, const wchar_t* asName, bool abAllowCreate) { HRESULT hr = S_OK; IXMLDOMNodeList* pList = NULL; IXMLDOMNode* pChild = NULL; IXMLDOMNamedNodeMap* pAttrs = NULL; IXMLDOMAttribute *pIXMLDOMAttribute = NULL; IXMLDOMNode *pIXMLDOMNode = NULL; IXMLDOMNode *pName = NULL; BSTR bsText = NULL; BSTR bsCheck = NULL; DOMNodeType nodeTypeCheck = NODE_INVALID; BOOL lbEmpty = TRUE; int iLastIndent = 1; // Получить все дочерние элементы нужного типа if (apFrom == NULL) { hr = S_FALSE; } else { long lFound = 0; // key[@name="abc"], but it is case-sensitive, and may fails in theory bsText = lstrmerge(asType, L"[@name=\"", asName, L"\"]"); hr = apFrom->selectNodes(bsText, &pList); if (SUCCEEDED(hr) && pList) { hr = pList->get_length(&lFound); if (FAILED(hr) || (lFound < 1)) { SafeRelease(pList); } } SafeFree(bsText); // May be case-insensitive search will be succeeded? // However, it is very slow if (!pList) { bsText = ::SysAllocString(asType); hr = apFrom->selectNodes(bsText, &pList); ::SysFreeString(bsText); bsText = NULL; } } if (SUCCEEDED(hr) && pList) { hr = pList->reset(); while ((hr = pList->nextNode(&pIXMLDOMNode)) == S_OK && pIXMLDOMNode) { lbEmpty = FALSE; hr = pIXMLDOMNode->get_attributes(&pAttrs); if (SUCCEEDED(hr) && pAttrs) { bsText = GetAttr(pIXMLDOMNode, pAttrs, L"name"); if (bsText) { if (lstrcmpi(bsText, asName) == 0) { ::SysFreeString(bsText); bsText = NULL; pChild = pIXMLDOMNode; pIXMLDOMNode = NULL; break; } ::SysFreeString(bsText); bsText = NULL; } } pIXMLDOMNode->Release(); pIXMLDOMNode = NULL; } pList->Release(); //pList = NULL; -- для отладки } if (lbEmpty && abAllowCreate && (asType[0] == L'k')) { bsText = ::SysAllocString(L"value"); hr = apFrom->selectNodes(bsText, &pList); ::SysFreeString(bsText); bsText = NULL; if (SUCCEEDED(hr) && pList) { hr = pList->reset(); if ((hr = pList->nextNode(&pIXMLDOMNode)) == S_OK && pIXMLDOMNode) { lbEmpty = FALSE; pIXMLDOMNode->Release(); pIXMLDOMNode = NULL; } pList->Release(); //pList = NULL; -- для отладки } } if (!pChild && abAllowCreate) { if (asType[0] == L'k') { hr = apFrom->get_lastChild(&pChild); if (SUCCEEDED(hr) && pChild) { hr = pChild->get_nodeType(&nodeTypeCheck); if (SUCCEEDED(hr) && (nodeTypeCheck == NODE_TEXT)) { hr = pChild->get_text(&bsCheck); if (SUCCEEDED(hr) && bsCheck) { iLastIndent = 0; LPCWSTR pszTabs = bsCheck; while (*pszTabs) { if (*(pszTabs++) == L'\t') iLastIndent++; } ::SysFreeString(bsCheck); bsCheck = NULL; } } } SafeRelease(pChild); } VARIANT vtType; vtType.vt = VT_I4; vtType.lVal = NODE_ELEMENT; bsText = ::SysAllocString(asType); hr = mp_File->createNode(vtType, bsText, L"", &pChild); ::SysFreeString(bsText); bsText = NULL; if (SUCCEEDED(hr) && pChild) { if (SetAttr(pChild, L"name", asName)) { if (asType[0] == L'k') { AppendNewLine(pChild); mb_KeyEmpty = true; TouchKey(pChild); } if (asType[0] == L'k') { //if (mb_KeyEmpty) //AppendIndent(apFrom, lbEmpty ? (mi_Level-1) : mi_Level); AppendIndent(apFrom, (mi_Level-iLastIndent)); } else if (mb_KeyEmpty) { AppendIndent(apFrom, !lbEmpty ? (mi_Level-1) : mi_Level); } else { AppendIndent(apFrom, 1); } hr = apFrom->appendChild(pChild, &pIXMLDOMNode); pChild->Release(); pChild = NULL; if (FAILED(hr)) { pAttrs->Release(); pAttrs = NULL; } else { pChild = pIXMLDOMNode; pIXMLDOMNode = NULL; } AppendNewLine(apFrom); AppendIndent(apFrom, mi_Level-1); if ((asType[0] != L'k') && mb_KeyEmpty) mb_KeyEmpty = false; } else { pChild->Release(); pChild = NULL; } } } return pChild; }
INT_PTR CSetPgTasks::OnComboBox(HWND hWnd2, WORD nCtrlId, WORD code) { // Other codes are not interesting yet if (code != CBN_SELCHANGE) { return 0; } switch (nCtrlId) { case lbCmdTasks: { if (mb_IgnoreCmdGroupList) break; MSetter lIgnoreEdit(&mb_IgnoreCmdGroupEdit); const CommandTasks* pCmd = NULL; int* Items = NULL; int iSelCount = GetListboxSelection(hWnd2, lbCmdTasks, Items); int iCur = (iSelCount == 1) ? Items[0] : -1; if (iCur >= 0) pCmd = gpSet->CmdTaskGet(iCur); bool lbEnable = false; if (pCmd) { _ASSERTE(pCmd->pszName); wchar_t* pszNoBrk = lstrdup(!pCmd->pszName ? L"" : (pCmd->pszName[0] != TaskBracketLeft) ? pCmd->pszName : (pCmd->pszName+1)); if (*pszNoBrk && (pszNoBrk[_tcslen(pszNoBrk)-1] == TaskBracketRight)) pszNoBrk[_tcslen(pszNoBrk)-1] = 0; SetDlgItemText(hWnd2, tCmdGroupName, pszNoBrk); SafeFree(pszNoBrk); wchar_t szKey[128] = L""; SetDlgItemText(hWnd2, tCmdGroupKey, pCmd->HotKey.GetHotkeyName(szKey)); SetDlgItemText(hWnd2, tCmdGroupGuiArg, pCmd->pszGuiArgs ? pCmd->pszGuiArgs : L""); SetDlgItemText(hWnd2, tCmdGroupCommands, pCmd->pszCommands ? pCmd->pszCommands : L""); checkDlgButton(hWnd2, cbCmdGrpDefaultNew, (pCmd->Flags & CETF_NEW_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); checkDlgButton(hWnd2, cbCmdGrpDefaultCmd, (pCmd->Flags & CETF_CMD_DEFAULT) ? BST_CHECKED : BST_UNCHECKED); checkDlgButton(hWnd2, cbCmdGrpTaskbar, ((pCmd->Flags & CETF_NO_TASKBAR) == CETF_NONE) ? BST_CHECKED : BST_UNCHECKED); checkDlgButton(hWnd2, cbCmdGrpToolbar, (pCmd->Flags & CETF_ADD_TOOLBAR) ? BST_CHECKED : BST_UNCHECKED); lbEnable = true; } else { SetDlgItemText(hWnd2, tCmdGroupName, L""); SetDlgItemText(hWnd2, tCmdGroupGuiArg, L""); SetDlgItemText(hWnd2, tCmdGroupCommands, L""); } //for (size_t i = 0; i < countof(SettingsNS::nTaskCtrlId); i++) // EnableWindow(GetDlgItem(hWnd2, SettingsNS::nTaskCtrlId[i]), lbEnable); EnableDlgItems(hWnd2, eTaskCtrlId, lbEnable); delete[] Items; break; } // lbCmdTasks: #ifdef _DEBUG default: _ASSERTE(FALSE && "ComboBox was not processed by CSetPgTasks::OnComboBox"); #endif } return 0; }
void SettingsINI::CloseKey() { SafeFree(mpsz_Section); }
MOVELIST *GenerateMoves(POSITION position) { int i, j, t, sumTop, sumBottom; int startBin = mancalaL + 1; int endBin = mancalaR; int *arrayHashedBoard; MOVELIST *CreateMovelistNode(), *head = NULL; arrayHashedBoard = array_hash(position); t = arrayHashedBoard[turn]; if(t == 0) { startBin = mancalaR + 1; endBin = boardSize; } /* sum up the top and bottom rows of bins */ for(i = mancalaL + 1, j = mancalaR + 1, sumTop = 0, sumBottom = 0; i < mancalaR && j < boardSize; sumTop += arrayHashedBoard[i], sumBottom += arrayHashedBoard[j], i += 1, j += 1) ; if(Primitive(position) == undecided) { /* on my turn starting, i'm empty -> i get to move from my opponent's bins OR the option is set in which you can choose from any bin on the board */ if(OPT_WINEMPTY == 2 || OPT_MOVEOPP == 1) { if(t == 0 && ((sumBottom == 0 && OPT_WINEMPTY == 2) || OPT_MOVEOPP == 1)) { for(i = mancalaL + 1; i < mancalaR; i += 1) { if(arrayHashedBoard[i] > 0) { head = CreateMovelistNode(i, head); } } } else if(t == 1 && ((sumTop == 0 && OPT_WINEMPTY == 2) || OPT_MOVEOPP == 1)) { for(i = mancalaR + 1; i < boardSize; i += 1) { if(arrayHashedBoard[i] > 0) { head = CreateMovelistNode(i, head); } } } } /* on my turn starting, i'm empty -> i pass */ if(OPT_WINEMPTY == 4 && ((t == 0 && sumBottom == 0) || (t == 1 && sumTop == 0)) ) { head = CreateMovelistNode(0, head); } /* the default moves available */ else { for(i = startBin; i < endBin; i += 1) { if(arrayHashedBoard[i] > 0) { head = CreateMovelistNode(i, head); } } } SafeFree(arrayHashedBoard); if (head == NULL) { head = CreateMovelistNode(0, head); } return head; } else { SafeFree(arrayHashedBoard); return NULL; } }