static BOOL calc ( INT* lval, TCHAR op, INT rval ) { switch ( op ) { case '*': *lval *= rval; break; case '/': *lval /= rval; break; case '%': *lval %= rval; break; case '+': *lval += rval; break; case '-': *lval -= rval; break; case '&': *lval &= rval; break; case '^': *lval ^= rval; break; case '|': *lval |= rval; break; default: ConErrResPuts ( STRING_INVALID_OPERAND ); return FALSE; } return TRUE; }
static BOOL seta_bitAndTerm ( LPCTSTR* p_, INT* result ) { LPCTSTR p = *p_; INT lval; if ( !seta_logShiftTerm ( &p, &lval ) ) return FALSE; while ( *p && _tcschr(_T("<>"),*p) && p[0] == p[1] ) { INT rval; TCHAR op = *p; p = skip_ws ( p+2 ); if ( !seta_logShiftTerm ( &p, &rval ) ) return FALSE; switch ( op ) { case '<': lval <<= rval; break; case '>': lval >>= rval; break; default: ConErrResPuts ( STRING_INVALID_OPERAND ); return FALSE; } } *result = lval; *p_ = p; return TRUE; }
INT CommandActivate (LPTSTR param) { HWND hwnd; LPTSTR *arg; INT argc; if (_tcsncmp (param, _T("/?"), 2) == 0) { ConOutResPaging(TRUE,STRING_WINDOW_HELP2); return 0; } if(!(*param)) return 1; /*Split the user input into array*/ arg = split (param, &argc, FALSE); if(argc < 2) { if(arg != NULL) freep(arg); } hwnd = FindWindow(NULL, arg[0]); if (hwnd == NULL) { if(arg != NULL) freep(arg); ConErrResPuts(STRING_WINDOW_ERROR1); return 1; } if(arg != NULL) freep(arg); return ServiceActivate(param, hwnd); }
/* * MD / MKDIR */ INT cmd_mkdir (LPTSTR param) { LPTSTR *p; INT argc, i; if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_MKDIR_HELP); return 0; } p = split (param, &argc, FALSE, FALSE); if (argc == 0) { ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); freep(p); nErrorLevel = 1; return 1; } nErrorLevel = 0; for (i = 0; i < argc; i++) { if (!MakeFullPath(p[i])) { if (GetLastError() == ERROR_PATH_NOT_FOUND) { ConErrResPuts(STRING_MD_ERROR2); } else { ErrorMessage (GetLastError(), _T("MD")); } nErrorLevel = 1; } } freep (p); return nErrorLevel; }
static BOOL seta_unaryTerm ( LPCTSTR* p_, INT* result ) { LPCTSTR p = *p_; if ( *p == _T('(') ) { INT rval; p = skip_ws ( p + 1 ); if ( !seta_stmt ( &p, &rval ) ) return FALSE; if ( *p++ != _T(')') ) { ConErrResPuts ( STRING_EXPECTED_CLOSE_PAREN ); return FALSE; } *result = rval; } else if ( isdigit(*p) ) { *result = _tcstol ( p, (LPTSTR *)&p, 0 ); } else if ( __iscsymf(*p) ) { LPTSTR ident; INT identlen; PARSE_IDENT(ident,identlen,p); if ( !seta_identval ( ident, result ) ) return FALSE; } else { ConErrResPuts ( STRING_EXPECTED_NUMBER_OR_VARIABLE ); return FALSE; } *p_ = skip_ws ( p ); return TRUE; }
INT cmd_verify (LPTSTR param) { if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_VERIFY_HELP1); return 0; } if (!OnOffCommand(param, &bVerify, STRING_VERIFY_HELP2)) { ConErrResPuts(STRING_VERIFY_HELP3); return nErrorLevel = 1; } return nErrorLevel = 0; }
VOID error_invalid_drive (VOID) { ConErrResPuts(STRING_ERROR_INVALID_DRIVE); nErrorLevel = 1; }
INT CommandScreen (LPTSTR param) { SHORT x,y; BOOL bSkipText = FALSE; if (_tcsncmp (param, _T("/?"), 2) == 0) { ConOutResPaging(TRUE,STRING_SCREEN_HELP); return 0; } nErrorLevel = 0; //get row while(_istspace(*param)) param++; if(!(*param)) { error_req_param_missing (); return 1; } y = _ttoi(param); if (y<0 || y>(maxy-1)) { ConOutResPuts(STRING_SCREEN_ROW); return 1; } //get col if(!(param = _tcschr(param,_T(' ')))) { error_req_param_missing (); return 1; } while(_istspace(*param)) param++; if(!(*param)) { error_req_param_missing (); return 1; } x = _ttoi(param); if (x<0 || x>(maxx-1)) { ConErrResPuts(STRING_SCREEN_COL); return 1; } //get text if(!(param = _tcschr(param,_T(' ')))) { bSkipText = TRUE; } else { while(_istspace(*param)) param++; if(!(*param)) { bSkipText = TRUE; } } bIgnoreEcho = TRUE; if(bSkipText) x=0; SetCursorXY(x,y); if(!(bSkipText)) ConOutPuts(param); return 0; }
INT cmd_time (LPTSTR param) { LPTSTR *arg; INT argc; INT i; INT nTimeString = -1; if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_TIME_HELP1); return 0; } nErrorLevel = 0; /* build parameter array */ arg = split (param, &argc, FALSE, FALSE); /* check for options */ for (i = 0; i < argc; i++) { if (_tcsicmp (arg[i], _T("/t")) == 0) { /* Display current time in short format */ SYSTEMTIME st; TCHAR szTime[20]; GetLocalTime(&st); FormatTime(szTime, &st); ConOutPuts(szTime); freep(arg); return 0; } if ((*arg[i] != _T('/')) && (nTimeString == -1)) nTimeString = i; } if (nTimeString == -1) { ConOutResPrintf(STRING_LOCALE_HELP1); ConOutPrintf(_T(": %s\n"), GetTimeString()); } while (1) { if (nTimeString == -1) { TCHAR s[40]; ConOutResPuts(STRING_TIME_HELP2); ConInString (s, 40); TRACE ("\'%s\'\n", debugstr_aw(s)); while (*s && s[_tcslen (s) - 1] < _T(' ')) s[_tcslen(s) - 1] = _T('\0'); if (ParseTime (s)) { freep (arg); return 0; } } else { if (ParseTime (arg[nTimeString])) { freep (arg); return 0; } /* force input the next time around. */ nTimeString = -1; } ConErrResPuts(STRING_TIME_ERROR1); nErrorLevel = 1; } freep (arg); return 0; }
VOID error_file_not_found (VOID) { ConErrResPuts(STRING_ERROR_FILE_NOT_FOUND); nErrorLevel = 1; }
INT cmd_date (LPTSTR param) { LPTSTR *arg; INT argc; INT i; BOOL bPrompt = TRUE; INT nDateString = -1; if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_DATE_HELP4); return 0; } nErrorLevel = 0; /* build parameter array */ arg = split (param, &argc, FALSE, FALSE); /* check for options */ for (i = 0; i < argc; i++) { if (_tcsicmp (arg[i], _T("/t")) == 0) bPrompt = FALSE; if ((*arg[i] != _T('/')) && (nDateString == -1)) nDateString = i; } if (nDateString == -1) ConOutPrintf(_T("%s"), GetDateString()); if (!bPrompt) { freep (arg); return 0; } if (nDateString == -1) { while (TRUE) /* forever loop */ { TCHAR s[40]; PrintDateString (); ConInString (s, 40); TRACE ("\'%s\'\n", debugstr_aw(s)); while (*s && s[_tcslen (s) - 1] < _T(' ')) s[_tcslen (s) - 1] = _T('\0'); if (ParseDate (s)) { freep (arg); return 0; } ConErrResPuts(STRING_DATE_ERROR); } } else { if (!ParseDate (arg[nDateString])) { while (TRUE) /* forever loop */ { TCHAR s[40]; ConErrResPuts(STRING_DATE_ERROR); PrintDateString (); ConInString (s, 40); while (*s && s[_tcslen (s) - 1] < _T(' ')) s[_tcslen (s) - 1] = _T('\0'); if (ParseDate (s)) { freep (arg); return 0; } } } } freep (arg); return 0; }
VOID error_out_of_memory (VOID) { ConErrResPuts(STRING_ERROR_OUT_OF_MEMORY); nErrorLevel = 1; }
VOID error_path_not_found (VOID) { ConErrResPuts(STRING_ERROR_PATH_NOT_FOUND); nErrorLevel = 1; }
VOID error_no_pipe (VOID) { ConErrResPuts(STRING_ERROR_CANNOTPIPE); nErrorLevel = 1; }
INT CommandChcp (LPTSTR param) { LPTSTR *arg; INT args; UINT uNewCodePage; /* print help */ if (!_tcsncmp (param, _T("/?"), 2)) { ConOutResPaging(TRUE,STRING_CHCP_HELP); return 0; } nErrorLevel = 0; /* get parameters */ arg = split (param, &args, FALSE); if (args == 0) { /* display active code page number */ ConErrResPrintf(STRING_CHCP_ERROR1, InputCodePage); freep (arg); return 0; } if (args >= 2) { /* too many parameters */ ConErrResPrintf(STRING_ERROR_INVALID_PARAM_FORMAT, param); nErrorLevel = 1; freep (arg); return 1; } uNewCodePage = (UINT)_ttoi(arg[0]); if (uNewCodePage == 0) { ConErrResPrintf(STRING_ERROR_INVALID_PARAM_FORMAT, arg[0]); freep (arg); nErrorLevel = 1; return 1; } if (!SetConsoleCP(uNewCodePage)) { ConErrResPuts(STRING_CHCP_ERROR4); } else { SetConsoleOutputCP (uNewCodePage); InitLocale (); InputCodePage= GetConsoleCP(); } freep (arg); return 0; }
VOID error_req_param_missing (VOID) { ConErrResPuts(STRING_ERROR_REQ_PARAM_MISSING); nErrorLevel = 1; }
INT cmd_set (LPTSTR param) { LPTSTR p; LPTSTR lpEnv; LPTSTR lpOutput; if ( !_tcsncmp (param, _T("/?"), 2) ) { ConOutResPaging(TRUE,STRING_SET_HELP); return 0; } param = (LPTSTR)skip_ws(param); /* if no parameters, show the environment */ if (param[0] == _T('\0')) { lpEnv = (LPTSTR)GetEnvironmentStrings (); if (lpEnv) { lpOutput = lpEnv; while (*lpOutput) { if (*lpOutput != _T('=')) ConOutPuts(lpOutput); lpOutput += _tcslen(lpOutput) + 1; } FreeEnvironmentStrings (lpEnv); } return 0; } /* the /A does *NOT* have to be followed by a whitespace */ if ( !_tcsnicmp (param, _T("/A"), 2) ) { BOOL Success; StripQuotes(param); Success = seta_eval ( skip_ws(param+2) ); if(!Success) { /*might seem random but this is what windows xp does */ nErrorLevel = 9165; } return !Success; } if (!_tcsnicmp(param, _T("/P"), 2)) { TCHAR value[1023]; param = GetQuotedString((LPTSTR)skip_ws(param + 2)); p = _tcschr(param, _T('=')); if (!p) { ConErrResPuts(STRING_SYNTAX_COMMAND_INCORRECT); nErrorLevel = 1; return 1; } *p++ = _T('\0'); ConOutPrintf(_T("%s"), GetQuotedString(p)); ConInString(value, 1023); if (!*value || !SetEnvironmentVariable(param, value)) { nErrorLevel = 1; return 1; } return 0; } param = GetQuotedString(param); p = _tcschr (param, _T('=')); if (p) { /* set or remove environment variable */ if (p == param) { /* handle set =val case */ ConErrResPuts(STRING_SYNTAX_COMMAND_INCORRECT); nErrorLevel = 1; return 1; } *p++ = _T('\0'); if (!SetEnvironmentVariable(param, *p ? p : NULL)) { nErrorLevel = 1; return 1; } } else { /* display all environment variable with the given prefix */ BOOL bFound = FALSE; while (_istspace(*param) || *param == _T(',') || *param == _T(';')) param++; p = _tcsrchr(param, _T(' ')); if (!p) p = param + _tcslen(param); *p = _T('\0'); lpEnv = GetEnvironmentStrings(); if (lpEnv) { lpOutput = lpEnv; while (*lpOutput) { if (!_tcsnicmp(lpOutput, param, p - param)) { ConOutPuts(lpOutput); bFound = TRUE; } lpOutput += _tcslen(lpOutput) + 1; } FreeEnvironmentStrings(lpEnv); } if (!bFound) { ConErrResPrintf (STRING_PATH_ERROR, param); nErrorLevel = 1; return 1; } } return 0; }
INT CommandChoice (LPTSTR param) { LPTSTR lpOptions; TCHAR Options[6]; LPTSTR lpText = NULL; BOOL bNoPrompt = FALSE; BOOL bCaseSensitive = FALSE; BOOL bTimeout = FALSE; INT nTimeout = 0; TCHAR cDefault = _T('\0'); INPUT_RECORD ir; LPTSTR p, np; LPTSTR *arg; INT argc; INT i; INT val; INT GCret; TCHAR Ch; DWORD amount,clk; LoadString(CMD_ModuleHandle, STRING_CHOICE_OPTION, Options, 4); lpOptions = Options; if (_tcsncmp (param, _T("/?"), 2) == 0) { ConOutResPaging(TRUE,STRING_CHOICE_HELP); return 0; } /* retrieve text */ p = param; while (TRUE) { if (*p == _T('\0')) break; if (*p != _T('/')) { lpText = p; break; } np = _tcschr (p, _T(' ')); if (!np) break; p = np + 1; } /* build parameter array */ arg = split (param, &argc, FALSE); /* evaluate arguments */ if (argc > 0) { for (i = 0; i < argc; i++) { if (_tcsnicmp (arg[i], _T("/c"), 2) == 0) { if (arg[i][2] == _T(':')) lpOptions = &arg[i][3]; else lpOptions = &arg[i][2]; if (_tcslen (lpOptions) == 0) { ConErrResPuts(STRING_CHOICE_ERROR); freep (arg); return 1; } } else if (_tcsnicmp (arg[i], _T("/n"), 2) == 0) { bNoPrompt = TRUE; } else if (_tcsnicmp (arg[i], _T("/s"), 2) == 0) { bCaseSensitive = TRUE; } else if (_tcsnicmp (arg[i], _T("/t"), 2) == 0) { LPTSTR s; if (arg[i][2] == _T(':')) { cDefault = arg[i][3]; s = &arg[i][4]; } else { cDefault = arg[i][2]; s = &arg[i][3]; } if (*s != _T(',')) { ConErrResPuts(STRING_CHOICE_ERROR_TXT); freep (arg); return 1; } s++; nTimeout = _ttoi(s); bTimeout = TRUE; } else if (arg[i][0] == _T('/')) { ConErrResPrintf(STRING_CHOICE_ERROR_OPTION, arg[i]); freep (arg); return 1; } } } /* print text */ if (lpText) ConOutPrintf (_T("%s"), lpText); /* print options */ if (bNoPrompt == FALSE) { ConOutPrintf (_T("[%c"), lpOptions[0]); for (i = 1; (unsigned)i < _tcslen (lpOptions); i++) ConOutPrintf (_T(",%c"), lpOptions[i]); ConOutPrintf (_T("]?")); } ConInFlush (); if(!bTimeout) { while (TRUE) { ConInKey (&ir); val = IsKeyInString (lpOptions, #ifdef _UNICODE ir.Event.KeyEvent.uChar.UnicodeChar, #else ir.Event.KeyEvent.uChar.AsciiChar, #endif bCaseSensitive); if (val >= 0) { ConOutPrintf (_T("%c\n"), lpOptions[val]); nErrorLevel = val + 1; break; } Beep (440, 50); } freep (arg); TRACE ("ErrorLevel: %d\n", nErrorLevel); return 0; } clk = GetTickCount (); amount = nTimeout*1000; loop: GCret = GetCharacterTimeout (&Ch, amount - (GetTickCount () - clk)); switch (GCret) { case GC_TIMEOUT: TRACE ("GC_TIMEOUT\n"); TRACE ("elapsed %d msecs\n", GetTickCount () - clk); break; case GC_NOKEY: TRACE ("GC_NOKEY\n"); TRACE ("elapsed %d msecs\n", GetTickCount () - clk); goto loop; case GC_KEYREAD: TRACE ("GC_KEYREAD\n"); TRACE ("elapsed %d msecs\n", GetTickCount () - clk); TRACE ("read %c", Ch); if ((val=IsKeyInString(lpOptions,Ch,bCaseSensitive))==-1) { Beep (440, 50); goto loop; } cDefault=Ch; break; } TRACE ("exiting wait loop after %d msecs\n", GetTickCount () - clk); val = IsKeyInString (lpOptions, cDefault, bCaseSensitive); ConOutPrintf (_T("%c\n"), lpOptions[val]); nErrorLevel = val + 1; freep (arg); TRACE ("ErrorLevel: %d\n", nErrorLevel); return 0; }