/*++ Copyright (c) 1985 - 1999, Microsoft Corporation Module Name: server.h Abstract: This module contains the internal structures and definitions used by the console server. Author: Therese Stowell (thereses) 12-Nov-1990 Revision History: --*/ #ifndef _SERVER_H_ #define _SERVER_H_ // // This message is used to notify the input thread that a console window should // go away. // typedef struct _CONSOLE_SHARE_ACCESS { ULONG OpenCount; ULONG Readers; ULONG Writers; ULONG SharedRead; ULONG SharedWrite; } CONSOLE_SHARE_ACCESS, *PCONSOLE_SHARE_ACCESS; #include "input.h" #include "output.h" #if defined(FE_IME) #include "conime.h" #include "convarea.h" #endif typedef struct _CONSOLE_PROCESS_HANDLE { LIST_ENTRY ListLink; HANDLE ProcessHandle; PCSR_PROCESS Process; ULONG TerminateCount; LPTHREAD_START_ROUTINE CtrlRoutine; LPTHREAD_START_ROUTINE PropRoutine; } CONSOLE_PROCESS_HANDLE, *PCONSOLE_PROCESS_HANDLE; typedef struct _INPUT_THREAD_INFO { HANDLE ThreadHandle; DWORD ThreadId; HDESK Desktop; HWINSTA WindowStation; ULONG WindowCount; #if defined(FE_IME) HWND hWndConsoleIME; #endif } INPUT_THREAD_INFO, *PINPUT_THREAD_INFO; typedef struct _INPUT_THREAD_INIT_INFO { HANDLE ThreadHandle; HANDLE InitCompleteEventHandle; HDESK DesktopHandle; HWINSTA WinstaHandle; NTSTATUS InitStatus; } INPUT_THREAD_INIT_INFO, *PINPUT_THREAD_INIT_INFO; typedef struct _CONSOLE_MSG { LIST_ENTRY ListLink; UINT Message; WPARAM wParam; LPARAM lParam; } CONSOLE_MSG, *PCONSOLE_MSG; typedef struct _CONSOLE_THREAD_MSG { CONSOLE_MSG; DWORD dwThreadId; } CONSOLE_THREAD_MSG, *PCONSOLE_THREAD_MSG; // Flags flags #define CONSOLE_IS_ICONIC 0x00000001 #define CONSOLE_OUTPUT_SUSPENDED 0x00000002 #define CONSOLE_HAS_FOCUS 0x00000004 #define CONSOLE_IGNORE_NEXT_MOUSE_INPUT 0x00000008 #define CONSOLE_SELECTING 0x00000010 #define CONSOLE_SCROLLING 0x00000020 #define CONSOLE_DISABLE_CLOSE 0x00000040 #define CONSOLE_NOTIFY_LAST_CLOSE 0x00000080 #define CONSOLE_NO_WINDOW 0x00000100 #define CONSOLE_VDM_REGISTERED 0x00000200 #define CONSOLE_UPDATING_SCROLL_BARS 0x00000400 #define CONSOLE_QUICK_EDIT_MODE 0x00000800 #define CONSOLE_TERMINATING 0x00001000 #define CONSOLE_CONNECTED_TO_EMULATOR 0x00002000 #define CONSOLE_FULLSCREEN_NOPAINT 0x00004000 #define CONSOLE_SHUTTING_DOWN 0x00008000 #define CONSOLE_AUTO_POSITION 0x00010000 #define CONSOLE_IGNORE_NEXT_KEYUP 0x00020000 #define CONSOLE_WOW_REGISTERED 0x00040000 #define CONSOLE_USE_PRIVATE_FLAGS 0x00080000 #define CONSOLE_HISTORY_NODUP 0x00100000 #define CONSOLE_SCROLLBAR_TRACKING 0x00200000 #define CONSOLE_IN_DESTRUCTION 0x00400000 #define CONSOLE_SETTING_WINDOW_SIZE 0x00800000 #define CONSOLE_DEFAULT_BUFFER_SIZE 0x01000000 #define CONSOLE_VDM_HIDDEN_WINDOW 0x02000000 #if defined(FE_SB) #define CONSOLE_OS2_REGISTERED 0x20000000 #define CONSOLE_OS2_OEM_FORMAT 0x40000000 #if defined(FE_IME) #define CONSOLE_JUST_VDM_UNREGISTERED 0x80000000 #endif // FE_IME #endif #define CONSOLE_SUSPENDED (CONSOLE_OUTPUT_SUSPENDED) #if DBG typedef struct _CONSOLE_REF_NODE { struct _CONSOLE_REF_NODE *pNext; PVOID pStackTrace[8]; BOOL bRef; } CONSOLE_REF_NODE, *PCONSOLE_REF_NODE; #endif typedef struct _CONSOLE_INFORMATION { CRITICAL_SECTION ConsoleLock; // serialize input and output using this ULONG RefCount; ULONG WaitCount; INPUT_INFORMATION InputBuffer; PSCREEN_INFORMATION CurrentScreenBuffer; PSCREEN_INFORMATION ScreenBuffers; // singly linked list HWINSTA hWinSta; // server handle to windowstation HDESK hDesk; // server handle to desktop HWND hWnd; HKL hklActive; // keyboard layout for this console window HDC hDC; // server side hDC HMENU hMenu; // handle to system menu HMENU hHeirMenu; // handle to menu we append to system menu HPALETTE hSysPalette; RECT WindowRect; DWORD ResizeFlags; LIST_ENTRY OutputQueue; HANDLE InitEvents[NUMBER_OF_INITIALIZATION_EVENTS]; HANDLE ClientThreadHandle; LIST_ENTRY ProcessHandleList; LIST_ENTRY CommandHistoryList; LIST_ENTRY ExeAliasList; SHORT NumCommandHistories; SHORT MaxCommandHistories; SHORT CommandHistorySize; USHORT OriginalTitleLength; USHORT TitleLength; LPWSTR OriginalTitle; LPWSTR Title; DWORD dwHotKey; HICON hIcon; HICON hSmIcon; INT iIconId; WORD LastAttributes; BYTE ReserveKeys; // keys reserved by app (i.e. ctrl-esc) DWORD Flags; // if a wait has been satisfied, the pointer to the wait queue is stored // here. PLIST_ENTRY WaitQueue; // the following fields are used for selection DWORD SelectionFlags; SMALL_RECT SelectionRect; COORD SelectionAnchor; COORD TextCursorPosition; // current position on screen (in screen buffer coords). ULONG TextCursorSize; BOOLEAN TextCursorVisible; // whether cursor is visible (set by user) BOOLEAN InsertMode; // used by command line editing // following fields are used when window is created WORD wShowWindow; int dwWindowOriginX; int dwWindowOriginY; WORD FullScreenFlags; WORD PopupCount; // following fields are used for the VDM HANDLE VDMStartHardwareEvent; HANDLE VDMEndHardwareEvent; HANDLE VDMErrorHardwareEvent; HANDLE VDMProcessHandle; HANDLE VDMProcessId; HANDLE VDMBufferSectionHandle; PCHAR_INFO VDMBuffer; PCHAR_INFO VDMBufferClient; COORD VDMBufferSize; HANDLE StateSectionHandle; // used for get/sethardwarestate PVOID StateBuffer; PVOID StateBufferClient; DWORD StateLength; // the following fields are used for ansi-unicode translation UINT CP; UINT OutputCP; // // these two fields are used while getting the icon from the // program manager via DDE. // HWND hWndProgMan; BOOL bIconInit; HANDLE ConsoleHandle; ULONG CtrlFlags; // indicates outstanding ctrl requests ULONG LimitingProcessId; HANDLE TerminationEvent; SHORT VerticalClientToWindow; SHORT HorizontalClientToWindow; COLORREF ColorTable[ 16 ]; HANDLE hProcessLastNotifyClose; // process handle of last-close-notify HANDLE ProcessIdLastNotifyClose; // process unique id of last-close-notify HWND hWndProperties; PINPUT_THREAD_INFO InputThreadInfo; // console thread info LIST_ENTRY MessageQueue; #if defined(FE_SB) CPINFO CPInfo; CPINFO OutputCPInfo; DWORD ReadConInpNumBytesUnicode; DWORD ReadConInpNumBytesTemp; DWORD WriteConOutNumBytesUnicode; DWORD WriteConOutNumBytesTemp; PVOID lpCookedReadData; // Same as PCOOKED_READ_DATA PVOID EudcInformation; // Same as PEUDC_INFORMATION PVOID FontCacheInformation; // Same as PFONT_CACHE_INFORMATION #if defined(FE_IME) CONSOLE_IME_INFORMATION ConsoleIme; #endif // FE_IME HDC FonthDC; // Double colored DBCS hDC HBITMAP hBitmap; #if defined(i386) SMALL_RECT Os2SavedWindowRect; #endif BOOLEAN fVDMVideoMode; // FALSE : VGA Format // TRUE : Common LVB Format BOOLEAN fIsDBCSCP; BOOLEAN fIsDBCSOutputCP; #endif /* * Instrumentation for Windows Bug 499641. */ #if DBG PVOID ConnectStack[16]; PVOID DisconnectStack[16]; PCONSOLE_REF_NODE pRefNodes; #endif HANDLE UnlockConsoleOwningThread; DWORD UnlockConsoleSkipCount; } CONSOLE_INFORMATION, *PCONSOLE_INFORMATION; // // CtrlFlags definitions // #define CONSOLE_CTRL_C_FLAG 1 #define CONSOLE_CTRL_BREAK_FLAG 2 #define CONSOLE_CTRL_CLOSE_FLAG 4 #define CONSOLE_FORCE_SHUTDOWN_FLAG 8 #define CONSOLE_CTRL_LOGOFF_FLAG 16 #define CONSOLE_CTRL_SHUTDOWN_FLAG 32 #define ADD_SCROLL_BARS_X 0x1 #define REMOVE_SCROLL_BARS_X 0x2 #define ADD_SCROLL_BARS_Y 0x4 #define REMOVE_SCROLL_BARS_Y 0x8 #define RESIZE_SCROLL_BARS 0x10 #define SCROLL_BAR_CHANGE (ADD_SCROLL_BARS_X | REMOVE_SCROLL_BARS_X | ADD_SCROLL_BARS_Y | REMOVE_SCROLL_BARS_Y | RESIZE_SCROLL_BARS) #define BORDER_CHANGE 0x20 #define SCREEN_BUFFER_CHANGE 0x40 #define CONSOLE_INITIAL_IO_HANDLES 3 #define CONSOLE_IO_HANDLE_INCREMENT 3 #define CONSOLE_FREE_HANDLE 0 //#define CONSOLE_INPUT_HANDLE 1 //#define CONSOLE_OUTPUT_HANDLE 2 #define CONSOLE_GRAPHICS_OUTPUT_HANDLE 4 #define CONSOLE_INHERITABLE 8 #define CONSOLE_ANY_HANDLE ((ULONG)(-1)) // // input handle flags // #define HANDLE_CLOSING 1 #define HANDLE_INPUT_PENDING 2 #define HANDLE_MULTI_LINE_INPUT 4 typedef struct _HANDLE_DATA { ULONG HandleType; ACCESS_MASK Access; ULONG ShareAccess; union { PSCREEN_INFORMATION ScreenBuffer; PINPUT_INFORMATION InputBuffer; } Buffer; PINPUT_READ_HANDLE_DATA InputReadData; // used only by input reads } HANDLE_DATA, *PHANDLE_DATA; typedef struct _CONSOLE_PER_PROCESS_DATA { HANDLE ConsoleHandle; HANDLE_DATA HandleTable[CONSOLE_INITIAL_IO_HANDLES]; ULONG HandleTableSize; PHANDLE_DATA HandleTablePtr; BOOLEAN ConsoleApp; BOOLEAN RootProcess; DWORD ParentProcessId; #if defined(FE_IME) HDESK hDesk; HWINSTA hWinSta; #endif } CONSOLE_PER_PROCESS_DATA, *PCONSOLE_PER_PROCESS_DATA; #define CONSOLE_INITIAL_CONSOLES 10 #define CONSOLE_CONSOLE_HANDLE_INCREMENT 5 #define CONSOLE_HANDLE_ALLOCATED 1 #define INDEX_TO_HANDLE(INDEX) ((HANDLE)(((ULONG_PTR)INDEX << 2) | CONSOLE_HANDLE_SIGNATURE)) #define HANDLE_TO_INDEX(CONHANDLE) ((HANDLE)((ULONG_PTR)CONHANDLE >> 2)) #define INPUT_MODES (ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT | ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT) #define OUTPUT_MODES (ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT) #define PRIVATE_MODES (ENABLE_INSERT_MODE | ENABLE_QUICK_EDIT_MODE | ENABLE_PRIVATE_FLAGS) #define CURSOR_PERCENTAGE_TO_TOP_SCAN_LINE(FONTSIZE,PERCENTAGE) ((FONTSIZE) - ((FONTSIZE) * (PERCENTAGE) / 100)) #define ConsoleLocked(CONSOLEPTR) (((CONSOLEPTR)->ConsoleLock.OwningThread) == NtCurrentTeb()->ClientId.UniqueThread) #define CONSOLE_STATUS_WAIT ((NTSTATUS)0xC0030001L) #define CONSOLE_STATUS_READ_COMPLETE ((NTSTATUS)0xC0030002L) #define CONSOLE_STATUS_WAIT_NO_BLOCK ((NTSTATUS)0xC0030003L) #define CM_CREATE_CONSOLE_WINDOW (WM_USER+0) #define CM_DESTROY_WINDOW (WM_USER+1) #define CM_SET_WINDOW_SIZE (WM_USER+2) #define CM_BEEP (WM_USER+3) #define CM_UPDATE_SCROLL_BARS (WM_USER+4) #define CM_UPDATE_TITLE (WM_USER+5) // // CM_MODE_TRANSITION is hard-coded to WM_USER+6 in kernel\winmgr.c // #define CM_MODE_TRANSITION (WM_USER+6) #define CM_CONSOLE_SHUTDOWN (WM_USER+7) #define CM_HIDE_WINDOW (WM_USER+8) #if defined(FE_IME) #define CM_CONIME_CREATE (WM_USER+9) #define CM_SET_CONSOLEIME_WINDOW (WM_USER+10) #define CM_WAIT_CONIME_PROCESS (WM_USER+11) #define CM_SET_IME_CODEPAGE (WM_USER+12) #define CM_SET_NLSMODE (WM_USER+13) #define CM_GET_NLSMODE (WM_USER+14) #define CM_CONIME_KL_ACTIVATE (WM_USER+15) #endif #define CM_CONSOLE_MSG (WM_USER+16) #define CM_CONSOLE_INPUT_THREAD_MSG (WM_USER+17) #define CONSOLE_CLIENTTHREADHANDLE(pcsrthread) ((pcsrthread)->ThreadHandle) #define CONSOLE_CLIENTPROCESSHANDLE() \ ((CSR_SERVER_QUERYCLIENTTHREAD())->Process->ProcessHandle) #define CONSOLE_CLIENTPROCESSID() \ ((CSR_SERVER_QUERYCLIENTTHREAD())->Process->ClientId.UniqueProcess) #define CONSOLE_FROMPROCESSPROCESSHANDLE(pcsrprocess) \ ((pcsrprocess)->ProcessHandle) #define CONSOLE_FROMPROCESSPERPROCESSDATA(pcsrprocess) \ ((pcsrprocess)->ServerDllPerProcessData[CONSRV_SERVERDLL_INDEX]) #define CONSOLE_FROMTHREADPERPROCESSDATA(pcsrthread) \ CONSOLE_FROMPROCESSPERPROCESSDATA((pcsrthread)->Process) #define CONSOLE_PERPROCESSDATA() \ CONSOLE_FROMTHREADPERPROCESSDATA(CSR_SERVER_QUERYCLIENTTHREAD()) #define CONSOLE_GETCONSOLEAPP() (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleApp) #define CONSOLE_GETCONSOLEAPPFROMPROCESSDATA(PROCESSDATA) ((PROCESSDATA)->ConsoleApp) #define CONSOLE_SETCONSOLEAPP(VALUE) (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleApp = VALUE) #define CONSOLE_SETCONSOLEAPPFROMPROCESSDATA(PROCESSDATA,VALUE) ((PROCESSDATA)->ConsoleApp = VALUE) #define CONSOLE_GETCONSOLEHANDLE() (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleHandle) #define CONSOLE_SETCONSOLEHANDLE(VALUE) (((PCONSOLE_PER_PROCESS_DATA)CONSOLE_PERPROCESSDATA())->ConsoleHandle = VALUE) #define CONSOLE_GETCONSOLEHANDLEFROMPROCESSDATA(PROCESSDATA) ((PROCESSDATA)->ConsoleHandle) #define CONSOLE_SETCONSOLEHANDLEFROMPROCESSDATA(PROCESSDATA,VALUE) ((PROCESSDATA)->ConsoleHandle = VALUE) #endif // // registry information structure // typedef struct _CONSOLE_REGISTRY_INFO { COORD ScreenBufferSize; COORD WindowSize; COORD WindowOrigin; COORD FontSize; UINT FontFamily; UINT FontWeight; WCHAR FaceName[LF_FACESIZE]; UINT CursorSize; BOOL FullScreen; BOOL QuickEdit; BOOL InsertMode; BOOL AutoPosition; CHAR_INFO ScreenFill; CHAR_INFO PopupFill; UINT HistoryBufferSize; UINT NumberOfHistoryBuffers; BOOL HistoryNoDup; COLORREF ColorTable[ 16 ]; LONGLONG LastWriteTime; #if defined(FE_SB) // scotthsu DWORD CodePage; #endif } CONSOLE_REGISTRY_INFO, *PCONSOLE_REGISTRY_INFO; // // window class // #define CONSOLE_WINDOW_CLASS (L"ConsoleWindowClass") #define CONSOLE_MAX_APP_SHORTCUTS 1 // // this structure is used to store relevant information from the // console for ctrl processing so we can do it without holding the // console lock. // typedef struct _CONSOLE_PROCESS_TERMINATION_RECORD { HANDLE ProcessHandle; ULONG TerminateCount; BOOL bDebugee; LPTHREAD_START_ROUTINE CtrlRoutine; } CONSOLE_PROCESS_TERMINATION_RECORD, *PCONSOLE_PROCESS_TERMINATION_RECORD; // // this value is used to determine the size of stack buffers for // strings. it should be long enough to contain the width of a // normal screen buffer. // #define STACK_BUFFER_SIZE 132 // // link information // #define LINK_PROP_MAIN_SIG 0x00000001 #define LINK_PROP_NT_CONSOLE_SIG 0x00000002 #if 0 // no one currently uses this... typedef struct { WCHAR pszLinkName[ MAX_PATH ]; WCHAR pszName[ MAX_PATH ]; WCHAR pszRelPath[ MAX_PATH ]; WCHAR pszWorkingDir[ MAX_PATH ]; WCHAR pszArgs[ MAX_PATH ]; WCHAR pszIconLocation[ MAX_PATH ]; int iIcon; int iShowCmd; int wHotKey; } LNKPROPMAIN, * LPLNKPROPMAIN; #endif #ifndef _USERKDX_ /* debugging extensions */ typedef struct { WCHAR pszName[ MAX_PATH ]; WCHAR pszIconLocation[ MAX_PATH ]; UINT uIcon; UINT uShowCmd; UINT uHotKey; NT_CONSOLE_PROPS console_props; #ifdef FE_SB NT_FE_CONSOLE_PROPS fe_console_props; #endif } LNKPROPNTCONSOLE, *LPLNKPROPNTCONSOLE; #endif #ifndef _USERKDX_ /* debugging extensions */ typedef struct { LPWSTR pszCurFile; // current file from IPersistFile LPWSTR pszRelSource; // overrides pszCurFile in relative tracking LPWSTR pszName; // title on short volumes LPWSTR pszRelPath; LPWSTR pszWorkingDir; LPWSTR pszArgs; LPWSTR pszIconLocation; LPSTR pExtraData; // extra data to preserve for future compatibility SHELL_LINK_DATA sld; } CShellLink; #endif