1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Console Server DLL 4 * FILE: win32ss/user/winsrv/consrv/include/conio_winsrv.h 5 * PURPOSE: Public Console I/O Interface - Offers wrap-up structures 6 * over the console objects exposed by the console driver. 7 * PROGRAMMERS: G� van Geldorp 8 * Jeffrey Morlan 9 * Hermes Belusca-Maito (hermes.belusca@sfr.fr) 10 */ 11 12 #pragma once 13 14 #include "rect.h" 15 16 // This is ALMOST a HACK!!!!!!! 17 // Helpers for code refactoring 18 #ifdef USE_NEW_CONSOLE_WAY 19 20 #define _CONSRV_CONSOLE _WINSRV_CONSOLE 21 #define CONSRV_CONSOLE WINSRV_CONSOLE 22 #define PCONSRV_CONSOLE PWINSRV_CONSOLE 23 24 #else 25 26 #define _CONSRV_CONSOLE _CONSOLE 27 #define CONSRV_CONSOLE CONSOLE 28 #define PCONSRV_CONSOLE PCONSOLE 29 30 #endif 31 32 #define CSR_DEFAULT_CURSOR_SIZE 25 33 34 /* VGA character cell */ 35 typedef struct _CHAR_CELL 36 { 37 CHAR Char; 38 BYTE Attributes; 39 } CHAR_CELL, *PCHAR_CELL; 40 C_ASSERT(sizeof(CHAR_CELL) == 2); 41 42 // HACK!! 43 struct _WINSRV_CONSOLE; 44 /* HACK: */ typedef struct _WINSRV_CONSOLE *PWINSRV_CONSOLE; 45 #ifdef USE_NEW_CONSOLE_WAY 46 #include "conio.h" 47 #endif 48 49 typedef struct _FRONTEND FRONTEND, *PFRONTEND; 50 51 typedef struct _FRONTEND_VTBL 52 { 53 // NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); 54 55 /* 56 * Internal interface (functions called by the console server only) 57 */ 58 NTSTATUS (NTAPI *InitFrontEnd)(IN OUT PFRONTEND This, 59 IN struct _CONSRV_CONSOLE* Console); 60 VOID (NTAPI *DeinitFrontEnd)(IN OUT PFRONTEND This); 61 62 /* Interface used for both text-mode and graphics screen buffers */ 63 VOID (NTAPI *DrawRegion)(IN OUT PFRONTEND This, 64 SMALL_RECT* Region); 65 /* Interface used only for text-mode screen buffers */ 66 VOID (NTAPI *WriteStream)(IN OUT PFRONTEND This, 67 SMALL_RECT* Region, 68 SHORT CursorStartX, 69 SHORT CursorStartY, 70 UINT ScrolledLines, 71 PWCHAR Buffer, 72 UINT Length); 73 VOID (NTAPI *RingBell)(IN OUT PFRONTEND This); 74 BOOL (NTAPI *SetCursorInfo)(IN OUT PFRONTEND This, 75 PCONSOLE_SCREEN_BUFFER ScreenBuffer); 76 BOOL (NTAPI *SetScreenInfo)(IN OUT PFRONTEND This, 77 PCONSOLE_SCREEN_BUFFER ScreenBuffer, 78 SHORT OldCursorX, 79 SHORT OldCursorY); 80 VOID (NTAPI *ResizeTerminal)(IN OUT PFRONTEND This); 81 VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PFRONTEND This); 82 VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PFRONTEND This, 83 IN PCONSOLE_SCREEN_BUFFER ScreenBuffer); 84 VOID (NTAPI *RefreshInternalInfo)(IN OUT PFRONTEND This); 85 86 /* 87 * External interface (functions corresponding to the Console API) 88 */ 89 VOID (NTAPI *ChangeTitle)(IN OUT PFRONTEND This); 90 BOOL (NTAPI *ChangeIcon)(IN OUT PFRONTEND This, 91 HICON IconHandle); 92 HWND (NTAPI *GetConsoleWindowHandle)(IN OUT PFRONTEND This); 93 VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PFRONTEND This, 94 PCOORD pSize); 95 BOOL (NTAPI *GetSelectionInfo)(IN OUT PFRONTEND This, 96 PCONSOLE_SELECTION_INFO pSelectionInfo); 97 BOOL (NTAPI *SetPalette)(IN OUT PFRONTEND This, 98 HPALETTE PaletteHandle, 99 UINT PaletteUsage); 100 ULONG (NTAPI *GetDisplayMode)(IN OUT PFRONTEND This); 101 BOOL (NTAPI *SetDisplayMode)(IN OUT PFRONTEND This, 102 ULONG NewMode); 103 INT (NTAPI *ShowMouseCursor)(IN OUT PFRONTEND This, 104 BOOL Show); 105 BOOL (NTAPI *SetMouseCursor)(IN OUT PFRONTEND This, 106 HCURSOR CursorHandle); 107 HMENU (NTAPI *MenuControl)(IN OUT PFRONTEND This, 108 UINT CmdIdLow, 109 UINT CmdIdHigh); 110 BOOL (NTAPI *SetMenuClose)(IN OUT PFRONTEND This, 111 BOOL Enable); 112 } FRONTEND_VTBL, *PFRONTEND_VTBL; 113 114 struct _FRONTEND 115 { 116 PFRONTEND_VTBL Vtbl; /* Virtual table */ 117 NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); 118 119 struct _CONSRV_CONSOLE* Console; /* Console to which the frontend is attached to */ 120 PVOID Context; /* Private context */ 121 PVOID Context2; /* Private context */ 122 }; 123 124 /* PauseFlags values (internal only) */ 125 #define PAUSED_FROM_KEYBOARD 0x1 126 #define PAUSED_FROM_SCROLLBAR 0x2 127 #define PAUSED_FROM_SELECTION 0x4 128 129 typedef struct _WINSRV_CONSOLE 130 { 131 /******************************* Console Set-up *******************************/ 132 /* This **MUST** be FIRST!! */ 133 #ifdef USE_NEW_CONSOLE_WAY 134 CONSOLE; 135 // CONSOLE Console; 136 // // PCONSOLE Console; 137 #endif 138 139 // LONG ReferenceCount; /* Is incremented each time a handle to something in the console (a screen-buffer or the input buffer of this console) gets referenced */ 140 // CRITICAL_SECTION Lock; 141 // CONSOLE_STATE State; /* State of the console */ 142 143 HANDLE InitEvents[MAX_INIT_EVENTS]; /* Initialization events */ 144 145 FRONTEND FrontEndIFace; /* Frontend-specific interface */ 146 147 /******************************* Process support ******************************/ 148 LIST_ENTRY ProcessList; /* List of processes owning the console. The first one is the so-called "Console Leader Process" */ 149 PCONSOLE_PROCESS_DATA NotifiedLastCloseProcess; /* Pointer to the unique process that needs to be notified when the console leader process is killed */ 150 BOOLEAN NotifyLastClose; /* TRUE if the console should send a control event when the console leader process is killed */ 151 BOOLEAN HasFocus; /* TRUE if the console has focus (is in the foreground) */ 152 153 /******************************* Pausing support ******************************/ 154 BYTE PauseFlags; 155 LIST_ENTRY ReadWaitQueue; /* List head for the queue of unique input buffer read wait blocks */ 156 LIST_ENTRY WriteWaitQueue; /* List head for the queue of current screen-buffer write wait blocks */ 157 158 /**************************** Aliases and Histories ***************************/ 159 struct _ALIAS_HEADER *Aliases; 160 LIST_ENTRY HistoryBuffers; 161 ULONG HistoryBufferSize; /* Size for newly created history buffers */ 162 ULONG NumberOfHistoryBuffers; /* Maximum number of history buffers allowed */ 163 BOOLEAN HistoryNoDup; /* Remove old duplicate history entries */ 164 165 /**************************** Input Line Discipline ***************************/ 166 PWCHAR LineBuffer; /* Current line being input, in line buffered mode */ 167 ULONG LineMaxSize; /* Maximum size of line in characters (including CR+LF) */ 168 ULONG LineSize; /* Current size of line */ 169 ULONG LinePos; /* Current position within line */ 170 BOOLEAN LineComplete; /* User pressed enter, ready to send back to client */ 171 BOOLEAN LineUpPressed; 172 BOOLEAN LineInsertToggle; /* Replace character over cursor instead of inserting */ 173 ULONG LineWakeupMask; /* Bitmap of which control characters will end line input */ 174 175 BOOLEAN InsertMode; 176 BOOLEAN QuickEdit; 177 178 /************************ Virtual DOS Machine support *************************/ 179 COORD VDMBufferSize; /* Real size of the VDM buffer, in units of ??? */ 180 HANDLE VDMBufferSection; /* Handle to the memory shared section for the VDM buffer */ 181 PVOID VDMBuffer; /* Our VDM buffer */ 182 PVOID ClientVDMBuffer; /* A copy of the client view of our VDM buffer */ 183 HANDLE VDMClientProcess; /* Handle to the client process who opened the buffer, to unmap the view */ 184 185 HANDLE StartHardwareEvent; 186 HANDLE EndHardwareEvent; 187 HANDLE ErrorHardwareEvent; 188 189 /****************************** Other properties ******************************/ 190 LIST_ENTRY PopupWindows; /* List of popup windows */ 191 UNICODE_STRING OriginalTitle; /* Original title of console, the one defined when the console leader is launched; it never changes. Always NULL-terminated */ 192 UNICODE_STRING Title; /* Title of console. Always NULL-terminated */ 193 COLORREF Colors[16]; /* Colour palette */ 194 195 } WINSRV_CONSOLE; // , *PWINSRV_CONSOLE; 196 197 /* console.c */ 198 VOID ConioPause(PCONSRV_CONSOLE Console, UINT Flags); 199 VOID ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags); 200 201 PCONSOLE_PROCESS_DATA NTAPI 202 ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console); 203 NTSTATUS 204 ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, 205 IN PCONSOLE_PROCESS_DATA ProcessData); 206 NTSTATUS NTAPI 207 ConSrvConsoleProcessCtrlEvent(IN PCONSRV_CONSOLE Console, 208 IN ULONG ProcessGroupId, 209 IN ULONG CtrlEvent); 210 VOID 211 ConSrvSetProcessFocus(IN PCSR_PROCESS CsrProcess, 212 IN BOOLEAN SetForeground); 213 NTSTATUS NTAPI 214 ConSrvSetConsoleProcessFocus(IN PCONSRV_CONSOLE Console, 215 IN BOOLEAN SetForeground); 216 217 /* coninput.c */ 218 VOID NTAPI ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg); 219 DWORD ConioEffectiveCursorSize(PCONSRV_CONSOLE Console, 220 DWORD Scale); 221 222 NTSTATUS 223 ConioProcessInputEvent(PCONSRV_CONSOLE Console, 224 PINPUT_RECORD InputEvent); 225 226 /* conoutput.c */ 227 PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); 228 NTSTATUS ConioResizeBuffer(PCONSOLE /*PCONSRV_CONSOLE*/ Console, 229 PTEXTMODE_SCREEN_BUFFER ScreenBuffer, 230 COORD Size); 231 232 /* terminal.c */ 233 VOID ConioDrawConsole(PCONSRV_CONSOLE Console); 234 235 /* EOF */ 236