1 /* 2 * CMD.H - header file for the modules in CMD.EXE 3 * 4 * 5 * History: 6 * 7 * 7-15-95 Tim Norman 8 * started 9 * 10 * 06/29/98 (Rob Lake) 11 * Moved error messages in here 12 * 13 * 07/12/98 (Rob Lake) 14 * Moved more error messages here. 15 * 16 * 30-Jul-1998 (John P Price <linux-guru@gcfl.net>) 17 * Added compile date to version. 18 * 19 * 26-Feb-1999 (Eric Kohl) 20 * Introduced a new version string. 21 * Thanks to Emanuele Aliberti! 22 */ 23 24 #pragma once 25 26 #include <config.h> 27 28 #include "cmdver.h" 29 #include "cmddbg.h" 30 31 /* Version of the Command Extensions */ 32 #define CMDEXTVERSION 2 33 34 #define BREAK_BATCHFILE 1 35 #define BREAK_OUTOFBATCH 2 /* aka. BREAK_ENDOFBATCHFILES */ 36 #define BREAK_INPUT 3 37 #define BREAK_IGNORE 4 38 39 /* define some error messages */ 40 #define D_ON _T("on") 41 #define D_OFF _T("off") 42 43 /* command line buffer length */ 44 #define CMDLINE_LENGTH 8192 45 46 /* 16k = max buffer size */ 47 #define BUFF_SIZE 16384 48 49 /* Global variables */ 50 extern LPTSTR lpOriginalEnvironment; 51 extern WORD wColor; 52 extern WORD wDefColor; 53 extern BOOL bCtrlBreak; 54 extern BOOL bIgnoreEcho; 55 extern BOOL bExit; 56 extern BOOL bDisableBatchEcho; 57 extern BOOL bEnableExtensions; 58 extern BOOL bDelayedExpansion; 59 extern INT nErrorLevel; 60 61 62 /* Prototypes for ALIAS.C */ 63 VOID ExpandAlias (LPTSTR, INT); 64 INT CommandAlias (LPTSTR); 65 66 /* Prototypes for ASSOC.C */ 67 INT CommandAssoc (LPTSTR); 68 69 /* Prototypes for BEEP.C */ 70 INT cmd_beep (LPTSTR); 71 72 /* Prototypes for CALL.C */ 73 INT cmd_call (LPTSTR); 74 75 /* Prototypes for CHOICE.C */ 76 INT CommandChoice (LPTSTR); 77 78 /* Prototypes for CLS.C */ 79 INT cmd_cls (LPTSTR); 80 81 /* Prototypes for CMD.C */ 82 INT ConvertULargeInteger(ULONGLONG num, LPTSTR des, UINT len, BOOL bPutSeparator); 83 HANDLE RunFile(DWORD, LPTSTR, LPTSTR, LPTSTR, INT); 84 INT ParseCommandLine(LPTSTR); 85 struct _PARSED_COMMAND; 86 87 INT 88 ExecuteCommand( 89 IN struct _PARSED_COMMAND *Cmd); 90 91 INT 92 ExecuteCommandWithEcho( 93 IN struct _PARSED_COMMAND *Cmd); 94 95 LPCTSTR GetEnvVarOrSpecial ( LPCTSTR varName ); 96 VOID AddBreakHandler (VOID); 97 VOID RemoveBreakHandler (VOID); 98 99 BOOL 100 SubstituteVar( 101 IN PCTSTR Src, 102 OUT size_t* SrcIncLen, // VarNameLen 103 OUT PTCHAR Dest, 104 IN PTCHAR DestEnd, 105 OUT size_t* DestIncLen, 106 IN TCHAR Delim); 107 108 BOOL 109 SubstituteVars( 110 IN PCTSTR Src, 111 OUT PTSTR Dest, 112 IN TCHAR Delim); 113 114 BOOL 115 SubstituteForVars( 116 IN PCTSTR Src, 117 OUT PTSTR Dest); 118 119 PTSTR 120 DoDelayedExpansion( 121 IN PCTSTR Line); 122 123 INT DoCommand(LPTSTR first, LPTSTR rest, struct _PARSED_COMMAND *Cmd); 124 BOOL ReadLine(TCHAR *commandline, BOOL bMore); 125 126 extern HANDLE CMD_ModuleHandle; 127 128 129 /* Prototypes for CMDINPUT.C */ 130 BOOL ReadCommand (LPTSTR, INT); 131 132 extern TCHAR AutoCompletionChar; 133 extern TCHAR PathCompletionChar; 134 135 #define IS_COMPLETION_DISABLED(CompletionCtrl) \ 136 ((CompletionCtrl) == 0x00 || (CompletionCtrl) == 0x0D || (CompletionCtrl) >= 0x20) 137 138 139 /* Prototypes for CMDTABLE.C */ 140 #define CMD_SPECIAL 1 141 #define CMD_BATCHONLY 2 142 #define CMD_HIDE 4 143 144 typedef struct tagCOMMAND 145 { 146 LPTSTR name; 147 INT flags; 148 INT (*func)(LPTSTR); 149 } COMMAND, *LPCOMMAND; 150 151 extern COMMAND cmds[]; /* The internal command table */ 152 153 VOID PrintCommandList (VOID); 154 155 LPCTSTR GetParsedEnvVar ( LPCTSTR varName, UINT* varNameLen, BOOL ModeSetA ); 156 157 /* Prototypes for CTTY.C */ 158 #ifdef INCLUDE_CMD_CTTY 159 INT cmd_ctty(LPTSTR); 160 #endif 161 162 /* Prototypes for COLOR.C */ 163 INT CommandColor(LPTSTR); 164 165 /* Prototypes for CONSOLE.C */ 166 #include "console.h" 167 168 /* Prototypes for COPY.C */ 169 INT cmd_copy (LPTSTR); 170 171 /* Prototypes for DATE.C */ 172 INT cmd_date (LPTSTR); 173 174 /* Prototypes for DEL.C */ 175 INT CommandDelete (LPTSTR); 176 177 /* Prototypes for DELAY.C */ 178 INT CommandDelay (LPTSTR); 179 180 /* Prototypes for DIR.C */ 181 INT FormatDate (TCHAR *, LPSYSTEMTIME, BOOL); 182 INT FormatTime (TCHAR *, LPSYSTEMTIME); 183 INT CommandDir (LPTSTR); 184 185 /* Prototypes for DIRSTACK.C */ 186 VOID InitDirectoryStack (VOID); 187 VOID DestroyDirectoryStack (VOID); 188 INT GetDirectoryStackDepth (VOID); 189 INT CommandPushd (LPTSTR); 190 INT CommandPopd (LPTSTR); 191 INT CommandDirs (LPTSTR); 192 193 /* Prototypes for ECHO.C */ 194 BOOL OnOffCommand(LPTSTR param, LPBOOL flag, INT message); 195 INT CommandEcho (LPTSTR); 196 INT CommandEchos (LPTSTR); 197 INT CommandEchoerr (LPTSTR); 198 INT CommandEchoserr (LPTSTR); 199 200 /* Prototypes for ERROR.C */ 201 VOID 202 ErrorMessage( 203 IN DWORD dwErrorCode, 204 IN PCTSTR szFormat OPTIONAL, 205 ...); 206 207 VOID error_no_pipe(VOID); 208 VOID error_bad_command(PCTSTR s); 209 VOID error_invalid_drive(VOID); 210 VOID error_req_param_missing(VOID); 211 VOID error_sfile_not_found(PCTSTR s); 212 VOID error_file_not_found(VOID); 213 VOID error_path_not_found(VOID); 214 VOID error_too_many_parameters(PCTSTR s); 215 VOID error_parameter_format(TCHAR ch); 216 VOID error_invalid_switch(TCHAR ch); 217 VOID error_invalid_parameter_format(PCTSTR s); 218 VOID error_out_of_memory(VOID); 219 VOID error_syntax(PCTSTR s); 220 221 VOID msg_pause(VOID); 222 223 /* Prototypes for FILECOMP.C */ 224 #ifdef FEATURE_UNIX_FILENAME_COMPLETION 225 VOID CompleteFilename (LPTSTR, UINT); 226 INT ShowCompletionMatches (LPTSTR, INT); 227 #endif 228 #ifdef FEATURE_4NT_FILENAME_COMPLETION 229 VOID CompleteFilename (LPTSTR, BOOL, LPTSTR, UINT); 230 #endif 231 232 233 /* Prototypes for FOR.C */ 234 #define FOR_DIRS 1 /* /D */ 235 #define FOR_F 2 /* /F */ 236 #define FOR_LOOP 4 /* /L */ 237 #define FOR_RECURSIVE 8 /* /R */ 238 INT cmd_for (LPTSTR); 239 INT ExecuteFor(struct _PARSED_COMMAND *Cmd); 240 241 242 /* Prototypes for FREE.C */ 243 INT CommandFree (LPTSTR); 244 245 /* Prototypes for GOTO.C */ 246 INT cmd_goto (LPTSTR); 247 248 /* Prototypes for HISTORY.C */ 249 #ifdef FEATURE_HISTORY 250 LPCTSTR PeekHistory(INT); 251 VOID History(INT, LPTSTR);/*add entries browse history*/ 252 VOID History_move_to_bottom(VOID);/*F3*/ 253 VOID InitHistory(VOID); 254 VOID CleanHistory(VOID); 255 VOID History_del_current_entry(LPTSTR str);/*CTRL-D*/ 256 INT CommandHistory(LPTSTR param); 257 #endif 258 259 /* Prototypes for IF.C */ 260 #define IFFLAG_NEGATE 1 /* NOT */ 261 #define IFFLAG_IGNORECASE 2 /* /I - Extended */ 262 typedef enum _IF_OPERATOR 263 { 264 /** Unary operators **/ 265 /* Standard */ 266 IF_ERRORLEVEL, IF_EXIST, 267 /* Extended */ 268 IF_CMDEXTVERSION, IF_DEFINED, 269 270 /** Binary operators **/ 271 /* Standard */ 272 IF_STRINGEQ, /* == */ 273 /* Extended */ 274 IF_EQU, IF_NEQ, IF_LSS, IF_LEQ, IF_GTR, IF_GEQ 275 } IF_OPERATOR; 276 277 INT ExecuteIf(struct _PARSED_COMMAND *Cmd); 278 279 /* Prototypes for INTERNAL.C */ 280 VOID InitLastPath (VOID); 281 VOID FreeLastPath (VOID); 282 INT cmd_chdir (LPTSTR); 283 INT cmd_mkdir (LPTSTR); 284 INT cmd_rmdir (LPTSTR); 285 INT CommandExit (LPTSTR); 286 INT CommandRem (LPTSTR); 287 INT CommandShowCommands (LPTSTR); 288 289 /* Prototypes for LOCALE.C */ 290 extern TCHAR cDateSeparator; 291 extern INT nDateFormat; 292 extern TCHAR cTimeSeparator; 293 extern INT nTimeFormat; 294 extern TCHAR cThousandSeparator; 295 extern TCHAR cDecimalSeparator; 296 extern INT nNumberGroups; 297 298 VOID InitLocale (VOID); 299 LPTSTR GetDateString (VOID); 300 LPTSTR GetTimeString (VOID); 301 302 /* Prototypes for MEMORY.C */ 303 INT CommandMemory (LPTSTR); 304 305 /* Prototypes for MKLINK.C */ 306 INT cmd_mklink(LPTSTR); 307 308 /* Prototypes for MISC.C */ 309 INT 310 GetRootPath( 311 IN LPCTSTR InPath, 312 OUT LPTSTR OutPath, 313 IN INT size); 314 315 BOOL SetRootPath(TCHAR *oldpath,TCHAR *InPath); 316 TCHAR cgetchar (VOID); 317 BOOL CheckCtrlBreak (INT); 318 BOOL add_entry (LPINT ac, LPTSTR **arg, LPCTSTR entry); 319 LPTSTR *split (LPTSTR, LPINT, BOOL, BOOL); 320 LPTSTR *splitspace (LPTSTR, LPINT); 321 VOID freep (LPTSTR *); 322 LPTSTR _stpcpy (LPTSTR, LPCTSTR); 323 VOID StripQuotes(LPTSTR); 324 325 BOOL IsValidPathName(IN LPCTSTR pszPath); 326 BOOL IsExistingFile(IN LPCTSTR pszPath); 327 BOOL IsExistingDirectory(IN LPCTSTR pszPath); 328 VOID GetPathCase(TCHAR *, TCHAR *); 329 330 #define PROMPT_NO 0 331 #define PROMPT_YES 1 332 #define PROMPT_ALL 2 333 #define PROMPT_BREAK 3 334 335 BOOL __stdcall PagePrompt(PCON_PAGER Pager, DWORD Done, DWORD Total); 336 INT FilePromptYN (UINT); 337 INT FilePromptYNA (UINT); 338 339 /* Prototypes for MOVE.C */ 340 INT cmd_move (LPTSTR); 341 342 /* Prototypes for MSGBOX.C */ 343 INT CommandMsgbox (LPTSTR); 344 345 /* Prototypes from PARSER.C */ 346 347 /* These three characters act like spaces to the parser in most contexts */ 348 #define STANDARD_SEPS _T(",;=") 349 350 typedef enum _COMMAND_TYPE 351 { 352 /* Standard command */ 353 C_COMMAND, 354 /* Quiet operator */ 355 C_QUIET, 356 /* Parenthesized block */ 357 C_BLOCK, 358 /* Operators */ 359 C_MULTI, C_OR, C_AND, C_PIPE, 360 /* Special parsed commands */ 361 C_FOR, C_IF, C_REM 362 } COMMAND_TYPE; 363 364 typedef struct _PARSED_COMMAND 365 { 366 /* 367 * For IF : this is the 'main' case (the 'else' is obtained via SubCmd->Next). 368 * For FOR: this is the list of all the subcommands in the DO. 369 */ 370 struct _PARSED_COMMAND *Subcommands; 371 372 struct _PARSED_COMMAND *Next; // Next command(s) in the chain. 373 struct _REDIRECTION *Redirections; 374 COMMAND_TYPE Type; 375 union 376 { 377 struct 378 { 379 PTSTR Rest; 380 TCHAR First[]; 381 } Command; 382 struct 383 { 384 BYTE Switches; 385 TCHAR Variable; 386 PTSTR Params; 387 PTSTR List; 388 struct _FOR_CONTEXT *Context; 389 } For; 390 struct 391 { 392 BYTE Flags; 393 IF_OPERATOR Operator; 394 PTSTR LeftArg; 395 PTSTR RightArg; 396 } If; 397 }; 398 } PARSED_COMMAND; 399 400 PARSED_COMMAND* 401 ParseCommand( 402 IN PCTSTR Line); 403 404 VOID 405 DumpCommand( 406 IN PARSED_COMMAND* Cmd, 407 IN ULONG SpacePad); 408 409 VOID 410 EchoCommand( 411 IN PARSED_COMMAND* Cmd); 412 413 PTCHAR 414 UnparseCommand( 415 IN PARSED_COMMAND* Cmd, 416 OUT PTCHAR Out, 417 IN PTCHAR OutEnd); 418 419 VOID 420 FreeCommand( 421 IN OUT PARSED_COMMAND* Cmd); 422 423 VOID ParseErrorEx(IN PCTSTR s); 424 extern BOOL bParseError; 425 extern TCHAR ParseLine[CMDLINE_LENGTH]; 426 427 extern BOOL bIgnoreParserComments; 428 extern BOOL bHandleContinuations; 429 430 /* Prototypes from PATH.C */ 431 INT cmd_path (LPTSTR); 432 433 /* Prototypes from PROMPT.C */ 434 VOID InitPrompt (VOID); 435 VOID PrintPrompt (VOID); 436 INT cmd_prompt (LPTSTR); 437 438 /* Prototypes for REDIR.C */ 439 HANDLE GetHandle(UINT Number); 440 VOID SetHandle(UINT Number, HANDLE Handle); 441 442 typedef enum _REDIR_MODE 443 { 444 REDIR_READ = 0, 445 REDIR_WRITE = 1, 446 REDIR_APPEND = 2 447 } REDIR_MODE; 448 typedef struct _REDIRECTION 449 { 450 struct _REDIRECTION *Next; 451 HANDLE OldHandle; 452 BYTE Number; 453 REDIR_MODE Mode; 454 TCHAR Filename[]; 455 } REDIRECTION; 456 BOOL PerformRedirection(REDIRECTION *); 457 VOID UndoRedirection(REDIRECTION *, REDIRECTION *End); 458 INT GetRedirection(LPTSTR, REDIRECTION **); 459 VOID FreeRedirection(REDIRECTION *); 460 461 /* Prototypes for REN.C */ 462 INT cmd_rename (LPTSTR); 463 464 /* Prototypes for REN.C */ 465 INT cmd_replace (LPTSTR); 466 467 /* Prototypes for SCREEN.C */ 468 INT CommandScreen (LPTSTR); 469 470 /* Prototypes for SET.C */ 471 INT cmd_set (LPTSTR); 472 473 /* Prototypes for SETLOCAL.C */ 474 LPTSTR DuplicateEnvironment(VOID); 475 INT cmd_setlocal (LPTSTR); 476 INT cmd_endlocal (LPTSTR); 477 478 /* Prototypes for START.C */ 479 INT cmd_start (LPTSTR); 480 481 /* Prototypes for STRTOCLR.C */ 482 BOOL StringToColor (LPWORD, LPTSTR *); 483 484 /* Prototypes for TIME.C */ 485 INT cmd_time (LPTSTR); 486 487 /* Prototypes for TIMER.C */ 488 INT CommandTimer (LPTSTR param); 489 490 /* Prototypes for TITLE.C */ 491 INT cmd_title (LPTSTR); 492 493 /* Prototypes for TYPE.C */ 494 INT cmd_type (LPTSTR); 495 496 /* Prototypes for VER.C */ 497 VOID InitOSVersion(VOID); 498 VOID PrintOSVersion(VOID); 499 INT cmd_ver (LPTSTR); 500 501 /* Prototypes for VERIFY.C */ 502 INT cmd_verify (LPTSTR); 503 504 /* Prototypes for VOL.C */ 505 INT cmd_vol (LPTSTR); 506 507 /* Prototypes for WHERE.C */ 508 BOOL SearchForExecutable (LPCTSTR, LPTSTR); 509 510 /* Prototypes for WINDOW.C */ 511 INT CommandActivate (LPTSTR); 512 INT CommandWindow (LPTSTR); 513 514 /* The MSDOS Batch Commands [MS-DOS 5.0 User's Guide and Reference p359] */ 515 int cmd_if(TCHAR *); 516 int cmd_pause(TCHAR *); 517 int cmd_shift(TCHAR *); 518