windows-nt/Source/XPSP1/NT/base/mvdm/meinc/console.h

323 lines
10 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
// CONSOLE.H
//
// (C) Copyright Microsoft Corp., 1988-1994
//
// Interfaces for the console
//
// Origin: Chicago
//
// Change history:
//
// Date Who Description
// --------- --------- -------------------------------------------------
// 15-Apr-93 Steve Lewin-Berlin (Cypress Software) created
// 15-Feb-94 JonT Code cleanup and precompiled headers
#include <vmdapriv.h>
// Console flags
// WARNING: Don't change these without updating vcond\vconsole.h
#define CF_FullscreenSizeOK 1 // ON if switch to fullscreen allowed
// (available)
// (available)
#define CF_InputEOF 8 // ON if input EOF not consumed yet
#define CF_Fullscreen 16 // ON if console is in full screen mode
#define CF_ConagentTop 32 // ON if conagent is top level process in console
#define CF_AttributeSet 64 // ON if attribute specified
#define CF_Closing 128 // ON if not accepting new process attaches
#define CF_ConagentWasHere 256 // ON if a kernel-launched conagent successfully rendezvous'd with conapp
#define CF_PendingSetTitle 512 // ON if SetConsoleTitle() message pending
#define CF_ConagentIsDone 1024 // ON if CF_Closing on and conagent is finished
#ifdef NEC_98
#define CF_ForceSetNative 2048 // ON if temporary native mode
#endif //NEC_98
// Returned by VCOND_ReadInput
#define READ_EOF 0x80000000
// Screen buffer state
//
typedef enum _SB_STATE {
SB_PHYSICAL,
SB_NATIVE,
SB_MEMORY
} SB_STATE;
// Screen buffer flags (bit masks)
#define fCursorVisible 1
#define fAttributeValid 2
#define fChanged 4
// Other defaults, etc
#define DEFAULT_ATTRIBUTE 07
#define SetFlag(f, mask) (f |= (mask))
#define ClearFlag(f, mask) (f &= (~mask))
#define TestFlag(f, mask) (f & (mask))
//----------------------------------------------------------------
// Global variables
//----------------------------------------------------------------
extern HANDLE hheapConsole;
//----------------------------------------------------------------
// Macros
//----------------------------------------------------------------
#define Coord2Dword(c) ( * (DWORD *) &(c) )
#define Dword2Coord(c) ( * (COORD *) &(c) )
#define LockConsole(pConsole) EnterCrst(&(pConsole->csCRST))
#define UnlockConsole(pConsole) LeaveCrst(&(pConsole->csCRST));
#define LockSB(pSB) EnterCrst(&(((SCREENBUFFER *)(pSB))->csCRST));
#define UnlockSB(pSB) LeaveCrst(&(((SCREENBUFFER *)(pSB))->csCRST));
#define MAXCOLS 1024
// WARNING: if this definition changes, update the definition in
// VMDOSAPP\TTYNGRAB.C
//
typedef struct _countedattr {
WORD count;
char Attr;
} COUNTEDATTR;
// WARNING: if this definition changes, update the definition in
// VMDOSAPP\TTYNGRAB.C
//
typedef struct _packedline {
COUNTEDATTR *AttribArray; // If not NULL, points to run-length encoded attribute array
char Attrib; // Attribute for entire line if AttribArray is NULL
char ascii[]; // Character data
} PACKEDLINE;
typedef PACKEDLINE *SCREEN[];
//----------------------------------------------------------------
// SCREENBUFFER object
//
// WARNING: if this definition changes, update the definition in
// VMDOSAPP\GRABEMU.ASM
//
typedef struct _screen_buffer {
// WinOldAp references the following fields:
COMMON_OBJECT // base of every object structure
COORD cBufsize; // Number of rows/cols in buffer
SCREEN * Screen; // Screen data
COORD cCursorPosition; // Current position of cursor
DWORD dwCursorSize; // Percent of cursor fill (1 - 100)
SMALL_RECT srWindow; // Window (top, left, bottom, right of visible region)
WORD flags; // Screen buffer flags
// WinOldAp does not reference the rest of the structure
SB_STATE State; // Physical, Native, or Memory
CRST csCRST; // critical section for synching access to internal data
struct _console *pConsole; // Pointer to owning console
WORD wAttribute; // Current default text attribute (color)
DWORD flOutputMode; // Output mode flags
#ifdef NEC_98
BYTE chDBCSLead; // Holds if last string terinated at DBCS lead byte
#endif
} SCREENBUFFER;
#define MAXINCHARS 256 // Number of input characters to buffer
typedef struct _inbuffer {
char cbBuf[MAXINCHARS]; // Input buffer
SHORT curPos[MAXINCHARS]; // Remembers cursor pos
WORD wReadIdx; // Next index to read from
WORD wWriteIdx; // Next index to write to
WORD wBufCount; // Count of characters in buffer
#ifdef DBCS
WORD wStatus; // DBCS status flags
#endif
} INBUFFER;
#ifdef DBCS
// Status flag for DBCS handling
#define BEGIN_TRAILBYTE 0x0001 // Buffer begin with DBCS trail byte
#endif
#define MAXTITLESIZE cbPathMax
//----------------------------------------------------------------
// CONSOLE object
//
// WARNING: if this definition changes, update the definition in
// VMDOSAPP\GRABEMU.ASM and the definition in
// CORE\WIN32\VCOND\VCONSOLE.H
//
typedef struct _console {
// WinOldAp references the following fields:
COMMON_NSOBJECT // base of every object structure - waitable (Input Buffer)
SCREENBUFFER * psbActiveScreenBuffer; // Pointer to active screen buffer (if any)
COORD cMaxSize; // Max size of this console (maintained by WinOldAp)
DWORD flags; // Various console flags
DWORD pidOwner; // pid of first console "owner"
DWORD tidOwner; // tid of first console "owner"
// WinOldAp does not reference the rest of the structure
COORD cOriginalSize; // Size inherited from DOS
CRST csCRST; // critical section for synching access to lists, etc.
struct _lst * plstOwners; // pointer to list of owners (processes)
struct _lst * plstBuffers; // pointer to list of screen buffers
DWORD dwLastExitCode; // Most recent exit code by a process in this console group
char szTitle[MAXTITLESIZE]; // Title (truncated and displayed by WinOldAp)
DWORD VID; // ID used by VCOND
HANDLE hVM; // Process handle of VM which supports this console for i/o
HANDLE hDisplay; // hwnd of display port (used by WinOldAp)
PDB * ppdbControlFocus; // Process which holds current control focus for this console
PDB * ppdbTermConProvider; // console provider to terminate
INBUFFER inbuf; // Input buffer
WORD wDefaultAttribute; // Default screen buffer attribute
struct _evt * evtDoneWithVM; // Signalled when all VM communication done
} CONSOLE;
//----------------------------------------------------------------
// Function Prototypes
//
//----------------------------------------------------------------
// Console
//----------------------------------------------------------------
VOID KERNENTRY SetControlFocus(void);
DWORD KERNENTRY CreateConsole(HANDLE hvm, HANDLE hwnd);
VOID KERNENTRY DisposeConsole(CONSOLE *pConsole);
DWORD KERNENTRY AttachProcessToConsole(CONSOLE *pConsole, PTDB ptdb, PPDB ppdb);
VOID KERNENTRY UnattachProcessFromConsole(CONSOLE *pConsole, PDB *ppdb);
VOID KERNENTRY RemoveOwnerFromList(CONSOLE *pConsole, PDB *ppdb);
DWORD KERNENTRY AddScreenBufferToList(CONSOLE *pConsole, SCREENBUFFER *pSB);
VOID KERNENTRY RemoveScreenBufferFromList(CONSOLE *pConsole, SCREENBUFFER *pSB);
VOID KERNENTRY DisposeScreenBuffer(SCREENBUFFER *pSB);
VOID KERNENTRY SetConsoleStartupInfo(PDB *ppdb, char *szFile);
//----------------------------------------------------------------
// ScreenBuffer (CONSBUF)
//----------------------------------------------------------------
BOOL KERNENTRY SB_SetActive(SCREENBUFFER *pSB);
BOOL KERNENTRY SB_SetCursorPosition(SCREENBUFFER *pSB,
COORD dwCursorPosition);
SCREENBUFFER * KERNENTRY SB_Create(CONSOLE *pConsole,
BOOL bAllocateMemory);
BOOL KERNENTRY SB_GetInfo(SCREENBUFFER *pSB,
CONSOLE_SCREEN_BUFFER_INFO *lpCSBI);
BOOL KERNENTRY SB_SetCursorInfo(SCREENBUFFER *pSB,
CONST CONSOLE_CURSOR_INFO *lpConsoleCursorInfo);
DWORD KERNENTRY SB_StringOut(SCREENBUFFER *pSB,
LPSTR lpBuffer,
DWORD cchToWrite);
VOID KERNENTRY SB_WriteConsoleOutput(SCREENBUFFER *pSB,
CONST CHAR_INFO *lpBuffer,
COORD srcSize,
COORD srcOrigin,
SMALL_RECT *lpsrDest);
VOID KERNENTRY SB_WriteConsoleOutputCharacters(SCREENBUFFER *pSB,
LPCSTR lpBuffer,
DWORD nChars,
COORD cLoc);
VOID KERNENTRY SB_ReadConsoleOutputCharacters(SCREENBUFFER *pSB,
LPSTR lpCharacter,
DWORD nLength,
COORD cLoc);
VOID KERNENTRY SB_ReadConsoleOutputAttributes(SCREENBUFFER *pSB,
LPWORD lpAttribute,
DWORD nLength,
COORD cLoc);
VOID KERNENTRY SB_FillConsoleOutputAttribute(SCREENBUFFER *pSB,
WORD wAttribute,
DWORD nLength,
COORD cLoc);
VOID KERNENTRY SB_WriteAttribute(SCREENBUFFER *pSB,
CONST WORD *lpAttribute,
DWORD nLength,
COORD cLoc);
VOID KERNENTRY SB_GetCursorInfo(SCREENBUFFER *pSB,
PCONSOLE_CURSOR_INFO lpConsoleCursorInfo);
VOID KERNENTRY SB_FillConsoleOutputCharacter(SCREENBUFFER *pSB,
char cCharacter,
DWORD nLength,
COORD cLoc);
VOID KERNENTRY SB_SetAttribute(SCREENBUFFER *pSB,
WORD attr);
VOID KERNENTRY SB_ReadOutput(SCREENBUFFER *pSB,
PCHAR_INFO lpBuffer,
COORD dwBufferSize,
COORD dwBufferCoord,
PSMALL_RECT lpReadRegion);
BOOL KERNENTRY SB_Scroll(SCREENBUFFER *pSB,
CONST SMALL_RECT *psrScroll,
CONST SMALL_RECT *psrClip,
COORD cDest,
CONST CHAR_INFO *pciFill);
BOOL KERNENTRY SB_SetWindow(SCREENBUFFER *pSB,
BOOL bAbsolute,
CONST SMALL_RECT *psrWindow);
DWORD KERNENTRY SB_GetLargestConsole(SCREENBUFFER *pSB);
BOOL KERNENTRY SB_SetSize(SCREENBUFFER *pSB, COORD cSize);
HANDLE KERNENTRY NewHandleToActiveScreenBuffer(PDB *ppdb);
HANDLE KERNENTRY NewHandleToInputBuffer(PDB *ppdb);
CONSOLE * KERNENTRY CreateNewConsole(WORD wShowWindow);
BOOL KERNENTRY FInitConsoleHeap(void);
VOID KERNENTRY TerminateConsoleHeap(VOID);
VOID * KERNENTRY ConsoleAlloc(DWORD cbSize);
VOID * KERNENTRY ConsoleAlloc0(DWORD cbSize);
BOOL KERNENTRY ConsoleFree(VOID *pvMem);
VOID KERNENTRY SB_ReturnToPhysical(CONSOLE *pConsole);
BOOL KERNENTRY SB_ForceToPhysical(CONSOLE *pConsole);
BOOL KERNENTRY InternalReadConsoleChars(CONSOLE * pConsole,
LPSTR lpBuffer,
DWORD cchToRead,
LPDWORD lpNumberOfCharsRead);