You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
10 KiB
406 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cmdline.h
|
|
|
|
Abstract:
|
|
|
|
This file contains the internal structures and definitions used
|
|
by command line input and editing.
|
|
|
|
Author:
|
|
|
|
Therese Stowell (thereses) 15-Nov-1991
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
typedef struct _COMMAND {
|
|
USHORT CommandLength;
|
|
WCHAR Command[0];
|
|
} COMMAND, *PCOMMAND;
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PCLE_POPUP_INPUT_ROUTINE)(
|
|
IN PVOID CookedReadData,
|
|
IN PCSR_API_MSG WaitReplyMessage,
|
|
IN PCSR_THREAD WaitingThread,
|
|
IN BOOLEAN WaitRoutine
|
|
);
|
|
|
|
/*
|
|
* CLE_POPUP Flags
|
|
*/
|
|
#define CLEPF_FALSE_UNICODE 0x0001
|
|
|
|
typedef struct _CLE_POPUP {
|
|
LIST_ENTRY ListLink; // pointer to next popup
|
|
SMALL_RECT Region; // region popup occupies
|
|
WORD Attributes; // text attributes
|
|
WORD Flags; // CLEPF_ flags
|
|
PCHAR_INFO OldContents; // contains data under popup
|
|
SHORT BottomIndex; // number of command displayed on last line of popup
|
|
SHORT CurrentCommand;
|
|
WCHAR NumberBuffer[6];
|
|
SHORT NumberRead;
|
|
PCLE_POPUP_INPUT_ROUTINE PopupInputRoutine; // routine to call when input is received
|
|
#if defined(FE_SB)
|
|
COORD OldScreenSize;
|
|
#endif
|
|
} CLE_POPUP, *PCLE_POPUP;
|
|
|
|
#define POPUP_SIZE_X(POPUP) (SHORT)(((POPUP)->Region.Right - (POPUP)->Region.Left - 1))
|
|
#define POPUP_SIZE_Y(POPUP) (SHORT)(((POPUP)->Region.Bottom - (POPUP)->Region.Top - 1))
|
|
#define COMMAND_NUMBER_SIZE 8 // size of command number buffer
|
|
|
|
|
|
/*
|
|
* COMMAND_HISTORY Flags
|
|
*/
|
|
#define CLE_ALLOCATED 0x00000001
|
|
#define CLE_RESET 0x00000002
|
|
|
|
typedef struct _COMMAND_HISTORY {
|
|
DWORD Flags;
|
|
LIST_ENTRY ListLink;
|
|
PWCHAR AppName;
|
|
SHORT NumberOfCommands;
|
|
SHORT LastAdded;
|
|
SHORT LastDisplayed;
|
|
SHORT FirstCommand; // circular buffer
|
|
SHORT MaximumNumberOfCommands;
|
|
HANDLE ProcessHandle;
|
|
LIST_ENTRY PopupList; // pointer to top-level popup
|
|
PCOMMAND Commands[0];
|
|
} COMMAND_HISTORY, *PCOMMAND_HISTORY;
|
|
|
|
#define DEFAULT_NUMBER_OF_COMMANDS 25
|
|
#define DEFAULT_NUMBER_OF_BUFFERS 4
|
|
|
|
typedef struct _COOKED_READ_DATA {
|
|
PINPUT_INFORMATION InputInfo;
|
|
PSCREEN_INFORMATION ScreenInfo;
|
|
PCONSOLE_INFORMATION Console;
|
|
HANDLE_DATA TempHandle;
|
|
ULONG UserBufferSize; // doubled size in ansi case
|
|
PWCHAR UserBuffer;
|
|
ULONG BufferSize;
|
|
ULONG BytesRead;
|
|
ULONG CurrentPosition; // char position, not byte position
|
|
PWCHAR BufPtr;
|
|
PWCHAR BackupLimit;
|
|
COORD OriginalCursorPosition;
|
|
DWORD NumberOfVisibleChars;
|
|
PCOMMAND_HISTORY CommandHistory;
|
|
BOOLEAN Echo;
|
|
BOOLEAN Processed;
|
|
BOOLEAN Line;
|
|
BOOLEAN InsertMode;
|
|
PCONSOLE_PER_PROCESS_DATA ProcessData;
|
|
HANDLE HandleIndex;
|
|
PWCHAR ExeName;
|
|
USHORT ExeNameLength; // in bytes
|
|
ULONG CtrlWakeupMask;
|
|
ULONG ControlKeyState;
|
|
} COOKED_READ_DATA, *PCOOKED_READ_DATA;
|
|
|
|
#define COMMAND_NUM_TO_INDEX(NUM,CMDHIST) (SHORT)(((NUM+(CMDHIST)->FirstCommand)%((CMDHIST)->MaximumNumberOfCommands)))
|
|
#define COMMAND_INDEX_TO_NUM(INDEX,CMDHIST) (SHORT)(((INDEX+((CMDHIST)->MaximumNumberOfCommands)-(CMDHIST)->FirstCommand)%((CMDHIST)->MaximumNumberOfCommands)))
|
|
|
|
/*
|
|
* COMMAND_IND_NEXT and COMMAND_IND_PREV go to the next and prev command
|
|
* COMMAND_IND_INC and COMMAND_IND_DEC go to the next and prev slots
|
|
*
|
|
* Don't get the two confused - it matters when the cmd history is not full!
|
|
*/
|
|
|
|
#define COMMAND_IND_PREV(IND,CMDHIST) \
|
|
{ \
|
|
if (IND <= 0) { \
|
|
IND = (CMDHIST)->NumberOfCommands; \
|
|
} \
|
|
IND--; \
|
|
}
|
|
|
|
#define COMMAND_IND_NEXT(IND,CMDHIST) \
|
|
{ \
|
|
++IND; \
|
|
if (IND >= (CMDHIST)->NumberOfCommands) { \
|
|
IND = 0; \
|
|
} \
|
|
}
|
|
|
|
#define COMMAND_IND_DEC(IND,CMDHIST) \
|
|
{ \
|
|
if (IND <= 0) { \
|
|
IND = (CMDHIST)->MaximumNumberOfCommands; \
|
|
} \
|
|
IND--; \
|
|
}
|
|
|
|
#define COMMAND_IND_INC(IND,CMDHIST) \
|
|
{ \
|
|
++IND; \
|
|
if (IND >= (CMDHIST)->MaximumNumberOfCommands) { \
|
|
IND = 0; \
|
|
} \
|
|
}
|
|
|
|
#define CLE_NO_POPUPS(COMMAND_HISTORY) (&(COMMAND_HISTORY)->PopupList == (COMMAND_HISTORY)->PopupList.Blink)
|
|
|
|
//
|
|
// aliases are grouped per console, per exe.
|
|
//
|
|
|
|
typedef struct _ALIAS {
|
|
LIST_ENTRY ListLink;
|
|
USHORT SourceLength; // in bytes
|
|
USHORT TargetLength; // in bytes
|
|
PWCHAR Source;
|
|
PWCHAR Target;
|
|
} ALIAS, *PALIAS;
|
|
|
|
typedef struct _EXE_ALIAS_LIST {
|
|
LIST_ENTRY ListLink;
|
|
USHORT ExeLength; // in bytes
|
|
PWCHAR ExeName;
|
|
LIST_ENTRY AliasList;
|
|
} EXE_ALIAS_LIST, *PEXE_ALIAS_LIST;
|
|
|
|
NTSTATUS
|
|
ProcessCommandLine(
|
|
IN PCOOKED_READ_DATA CookedReadData,
|
|
IN WCHAR Char,
|
|
IN DWORD KeyState,
|
|
IN PCSR_API_MSG WaitReplyMessage,
|
|
IN PCSR_THREAD WaitingThread,
|
|
IN BOOLEAN WaitRoutine
|
|
);
|
|
|
|
VOID
|
|
DeleteCommandLine(
|
|
IN OUT PCOOKED_READ_DATA CookedReadData,
|
|
IN BOOL UpdateFields
|
|
);
|
|
|
|
VOID
|
|
RedrawCommandLine(
|
|
IN PCOOKED_READ_DATA CookedReadData
|
|
);
|
|
|
|
VOID
|
|
EmptyCommandHistory(
|
|
IN PCOMMAND_HISTORY CommandHistory
|
|
);
|
|
|
|
PCOMMAND_HISTORY
|
|
ReallocCommandHistory(
|
|
IN PCONSOLE_INFORMATION Console,
|
|
IN PCOMMAND_HISTORY CurrentCommandHistory,
|
|
IN DWORD NumCommands
|
|
);
|
|
|
|
PCOMMAND_HISTORY
|
|
FindExeCommandHistory(
|
|
IN PCONSOLE_INFORMATION Console,
|
|
IN PVOID AppName,
|
|
IN DWORD AppNameLength,
|
|
IN BOOLEAN UnicodeExe
|
|
);
|
|
|
|
PCOMMAND_HISTORY
|
|
FindCommandHistory(
|
|
IN PCONSOLE_INFORMATION Console,
|
|
IN HANDLE ProcessHandle
|
|
);
|
|
|
|
ULONG
|
|
RetrieveNumberOfSpaces(
|
|
IN SHORT OriginalCursorPositionX,
|
|
IN PWCHAR Buffer,
|
|
IN ULONG CurrentPosition
|
|
#if defined(FE_SB)
|
|
,
|
|
IN PCONSOLE_INFORMATION Console,
|
|
IN DWORD CodePage
|
|
#endif
|
|
);
|
|
|
|
ULONG
|
|
RetrieveTotalNumberOfSpaces(
|
|
IN SHORT OriginalCursorPositionX,
|
|
IN PWCHAR Buffer,
|
|
IN ULONG CurrentPosition
|
|
#if defined(FE_SB)
|
|
,
|
|
IN PCONSOLE_INFORMATION Console
|
|
#endif
|
|
);
|
|
|
|
NTSTATUS
|
|
GetChar(
|
|
IN PINPUT_INFORMATION InputInfo,
|
|
OUT PWCHAR Char,
|
|
IN BOOLEAN Wait,
|
|
IN PCONSOLE_INFORMATION Console,
|
|
IN PHANDLE_DATA HandleData,
|
|
IN PCSR_API_MSG Message OPTIONAL,
|
|
IN CSR_WAIT_ROUTINE WaitRoutine OPTIONAL,
|
|
IN PVOID WaitParameter OPTIONAL,
|
|
IN ULONG WaitParameterLength OPTIONAL,
|
|
IN BOOLEAN WaitBlockExists OPTIONAL,
|
|
OUT PBOOLEAN CommandLineEditingKeys OPTIONAL,
|
|
OUT PBOOLEAN CommandLinePopupKeys OPTIONAL,
|
|
OUT PBOOLEAN EnableScrollMode OPTIONAL,
|
|
OUT PDWORD KeyState OPTIONAL
|
|
);
|
|
|
|
BOOL
|
|
IsCommandLinePopupKey(
|
|
IN OUT PKEY_EVENT_RECORD KeyEvent
|
|
);
|
|
|
|
BOOL
|
|
IsCommandLineEditingKey(
|
|
IN OUT PKEY_EVENT_RECORD KeyEvent
|
|
);
|
|
|
|
VOID
|
|
CleanUpPopups(
|
|
IN PCOOKED_READ_DATA CookedReadData
|
|
);
|
|
|
|
BOOL
|
|
ProcessCookedReadInput(
|
|
IN PCOOKED_READ_DATA CookedReadData,
|
|
IN WCHAR Char,
|
|
IN DWORD KeyState,
|
|
OUT PNTSTATUS Status
|
|
);
|
|
|
|
VOID
|
|
DrawCommandListBorder(
|
|
IN PCLE_POPUP Popup,
|
|
IN PSCREEN_INFORMATION ScreenInfo
|
|
);
|
|
|
|
PCOMMAND
|
|
GetLastCommand(
|
|
IN PCOMMAND_HISTORY CommandHistory
|
|
);
|
|
|
|
SHORT
|
|
FindMatchingCommand(
|
|
IN PCOMMAND_HISTORY CommandHistory,
|
|
IN PWCHAR CurrentCommand,
|
|
IN ULONG CurrentCommandLength,
|
|
IN SHORT CurrentIndex,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
#define FMCFL_EXACT_MATCH 1
|
|
#define FMCFL_JUST_LOOKING 2
|
|
|
|
NTSTATUS
|
|
CommandNumberPopup(
|
|
IN PCOOKED_READ_DATA CookedReadData,
|
|
IN PCSR_API_MSG WaitReplyMessage,
|
|
IN PCSR_THREAD WaitingThread,
|
|
IN BOOLEAN WaitRoutine
|
|
);
|
|
|
|
BOOLEAN
|
|
CookedReadWaitRoutine(
|
|
IN PLIST_ENTRY WaitQueue,
|
|
IN PCSR_THREAD WaitingThread,
|
|
IN PCSR_API_MSG WaitReplyMessage,
|
|
IN PVOID WaitParameter,
|
|
IN PVOID SatisfyParameter1,
|
|
IN PVOID SatisfyParameter2,
|
|
IN ULONG WaitFlags
|
|
);
|
|
|
|
VOID
|
|
ReadRectFromScreenBuffer(
|
|
IN PSCREEN_INFORMATION ScreenInfo,
|
|
IN COORD SourcePoint,
|
|
IN PCHAR_INFO Target,
|
|
IN COORD TargetSize,
|
|
IN PSMALL_RECT TargetRect
|
|
);
|
|
|
|
NTSTATUS
|
|
WriteCharsFromInput(
|
|
IN PSCREEN_INFORMATION ScreenInfo,
|
|
IN PWCHAR lpBufferBackupLimit,
|
|
IN PWCHAR lpBuffer,
|
|
IN PWCHAR lpString,
|
|
IN OUT PDWORD NumBytes,
|
|
OUT PLONG NumSpaces OPTIONAL,
|
|
IN SHORT OriginalXPosition,
|
|
IN DWORD dwFlags,
|
|
OUT PSHORT ScrollY OPTIONAL
|
|
);
|
|
|
|
//
|
|
// Values for WriteChars(),WriteCharsFromInput() dwFlags
|
|
//
|
|
#define WC_DESTRUCTIVE_BACKSPACE 0x01
|
|
#define WC_KEEP_CURSOR_VISIBLE 0x02
|
|
#define WC_ECHO 0x04
|
|
#define WC_FALSIFY_UNICODE 0x08
|
|
#define WC_LIMIT_BACKSPACE 0x10
|
|
|
|
|
|
VOID
|
|
DrawCommandListPopup(
|
|
IN PCLE_POPUP Popup,
|
|
IN SHORT CurrentCommand,
|
|
IN PCOMMAND_HISTORY CommandHistory,
|
|
IN PSCREEN_INFORMATION ScreenInfo
|
|
);
|
|
|
|
VOID
|
|
UpdateCommandListPopup(
|
|
IN SHORT Delta,
|
|
IN OUT PSHORT CurrentCommand,
|
|
IN PCOMMAND_HISTORY CommandHistory,
|
|
IN PCLE_POPUP Popup,
|
|
IN PSCREEN_INFORMATION ScreenInfo,
|
|
IN DWORD Flags
|
|
);
|
|
|
|
#define UCLP_WRAP 1
|
|
|
|
|
|
//
|
|
// InitExtendedEditKey
|
|
// If lpwstr is NULL, the default value will be used.
|
|
//
|
|
VOID InitExtendedEditKeys(CONST ExtKeyDefBuf* lpbuf);
|
|
|
|
//
|
|
// IsPauseKey
|
|
// returns TRUE if pKeyEvent is pause.
|
|
// The default key is Ctrl-S if extended edit keys are not specified.
|
|
//
|
|
BOOL IsPauseKey(IN PKEY_EVENT_RECORD pKeyEvent);
|
|
|
|
|
|
//
|
|
// Word delimiters
|
|
//
|
|
|
|
#define IS_WORD_DELIM(wch) ((wch) == L' ' || (gaWordDelimChars[0] && IsWordDelim(wch)))
|
|
|
|
extern WCHAR gaWordDelimChars[];
|
|
extern CONST WCHAR gaWordDelimCharsDefault[];
|
|
extern BOOL IsWordDelim(WCHAR);
|
|
|
|
#define WORD_DELIM_MAX 32
|
|
|