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 HDESK (NTAPI *GetThreadConsoleDesktop)(IN OUT PFRONTEND This); 93 HWND (NTAPI *GetConsoleWindowHandle)(IN OUT PFRONTEND This); 94 VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PFRONTEND This, 95 PCOORD pSize); 96 BOOL (NTAPI *GetSelectionInfo)(IN OUT PFRONTEND This, 97 PCONSOLE_SELECTION_INFO pSelectionInfo); 98 BOOL (NTAPI *SetPalette)(IN OUT PFRONTEND This, 99 HPALETTE PaletteHandle, 100 UINT PaletteUsage); 101 ULONG (NTAPI *GetDisplayMode)(IN OUT PFRONTEND This); 102 BOOL (NTAPI *SetDisplayMode)(IN OUT PFRONTEND This, 103 ULONG NewMode); 104 INT (NTAPI *ShowMouseCursor)(IN OUT PFRONTEND This, 105 BOOL Show); 106 BOOL (NTAPI *SetMouseCursor)(IN OUT PFRONTEND This, 107 HCURSOR CursorHandle); 108 HMENU (NTAPI *MenuControl)(IN OUT PFRONTEND This, 109 UINT CmdIdLow, 110 UINT CmdIdHigh); 111 BOOL (NTAPI *SetMenuClose)(IN OUT PFRONTEND This, 112 BOOL Enable); 113 } FRONTEND_VTBL, *PFRONTEND_VTBL; 114 115 struct _FRONTEND 116 { 117 PFRONTEND_VTBL Vtbl; /* Virtual table */ 118 NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); 119 120 struct _CONSRV_CONSOLE* Console; /* Console to which the frontend is attached to */ 121 PVOID Context; /* Private context */ 122 PVOID Context2; /* Private context */ 123 }; 124 125 /* PauseFlags values (internal only) */ 126 #define PAUSED_FROM_KEYBOARD 0x1 127 #define PAUSED_FROM_SCROLLBAR 0x2 128 #define PAUSED_FROM_SELECTION 0x4 129 130 typedef struct _WINSRV_CONSOLE 131 { 132 /******************************* Console Set-up *******************************/ 133 /* This **MUST** be FIRST!! */ 134 #ifdef USE_NEW_CONSOLE_WAY 135 CONSOLE; 136 // CONSOLE Console; 137 // // PCONSOLE Console; 138 #endif 139 140 // 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 */ 141 // CRITICAL_SECTION Lock; 142 // CONSOLE_STATE State; /* State of the console */ 143 144 HANDLE InitEvents[MAX_INIT_EVENTS]; /* Initialization events */ 145 146 FRONTEND FrontEndIFace; /* Frontend-specific interface */ 147 148 /******************************* Process support ******************************/ 149 LIST_ENTRY ProcessList; /* List of processes owning the console. The first one is the so-called "Console Leader Process" */ 150 PCONSOLE_PROCESS_DATA NotifiedLastCloseProcess; /* Pointer to the unique process that needs to be notified when the console leader process is killed */ 151 BOOLEAN NotifyLastClose; /* TRUE if the console should send a control event when the console leader process is killed */ 152 BOOLEAN HasFocus; /* TRUE if the console has focus (is in the foreground) */ 153 154 /******************************* Pausing support ******************************/ 155 BYTE PauseFlags; 156 LIST_ENTRY ReadWaitQueue; /* List head for the queue of unique input buffer read wait blocks */ 157 LIST_ENTRY WriteWaitQueue; /* List head for the queue of current screen-buffer write wait blocks */ 158 159 /**************************** Aliases and Histories ***************************/ 160 struct _ALIAS_HEADER *Aliases; 161 LIST_ENTRY HistoryBuffers; 162 ULONG HistoryBufferSize; /* Size for newly created history buffers */ 163 ULONG NumberOfHistoryBuffers; /* Maximum number of history buffers allowed */ 164 BOOLEAN HistoryNoDup; /* Remove old duplicate history entries */ 165 166 /**************************** Input Line Discipline ***************************/ 167 PWCHAR LineBuffer; /* Current line being input, in line buffered mode */ 168 ULONG LineMaxSize; /* Maximum size of line in characters (including CR+LF) */ 169 ULONG LineSize; /* Current size of line */ 170 ULONG LinePos; /* Current position within line */ 171 BOOLEAN LineComplete; /* User pressed enter, ready to send back to client */ 172 BOOLEAN LineUpPressed; 173 BOOLEAN LineInsertToggle; /* Replace character over cursor instead of inserting */ 174 ULONG LineWakeupMask; /* Bitmap of which control characters will end line input */ 175 176 BOOLEAN InsertMode; 177 BOOLEAN QuickEdit; 178 179 /************************ Virtual DOS Machine support *************************/ 180 COORD VDMBufferSize; /* Real size of the VDM buffer, in units of ??? */ 181 HANDLE VDMBufferSection; /* Handle to the memory shared section for the VDM buffer */ 182 PVOID VDMBuffer; /* Our VDM buffer */ 183 PVOID ClientVDMBuffer; /* A copy of the client view of our VDM buffer */ 184 HANDLE VDMClientProcess; /* Handle to the client process who opened the buffer, to unmap the view */ 185 186 HANDLE StartHardwareEvent; 187 HANDLE EndHardwareEvent; 188 HANDLE ErrorHardwareEvent; 189 190 /****************************** Other properties ******************************/ 191 LIST_ENTRY PopupWindows; /* List of popup windows */ 192 UNICODE_STRING OriginalTitle; /* Original title of console, the one defined when the console leader is launched; it never changes. Always NULL-terminated */ 193 UNICODE_STRING Title; /* Title of console. Always NULL-terminated */ 194 COLORREF Colors[16]; /* Colour palette */ 195 196 } WINSRV_CONSOLE; // , *PWINSRV_CONSOLE; 197 198 /* console.c */ 199 VOID ConioPause(PCONSRV_CONSOLE Console, UINT Flags); 200 VOID ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags); 201 202 PCONSOLE_PROCESS_DATA NTAPI 203 ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console); 204 NTSTATUS 205 ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, 206 IN PCONSOLE_PROCESS_DATA ProcessData); 207 NTSTATUS NTAPI 208 ConSrvConsoleProcessCtrlEvent(IN PCONSRV_CONSOLE Console, 209 IN ULONG ProcessGroupId, 210 IN ULONG CtrlEvent); 211 VOID 212 ConSrvSetProcessFocus(IN PCSR_PROCESS CsrProcess, 213 IN BOOLEAN SetForeground); 214 NTSTATUS NTAPI 215 ConSrvSetConsoleProcessFocus(IN PCONSRV_CONSOLE Console, 216 IN BOOLEAN SetForeground); 217 218 /* coninput.c */ 219 VOID NTAPI ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg); 220 DWORD ConioEffectiveCursorSize(PCONSRV_CONSOLE Console, 221 DWORD Scale); 222 223 NTSTATUS 224 ConioProcessInputEvent(PCONSRV_CONSOLE Console, 225 PINPUT_RECORD InputEvent); 226 227 /* conoutput.c */ 228 PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); 229 NTSTATUS ConioResizeBuffer(PCONSOLE /*PCONSRV_CONSOLE*/ Console, 230 PTEXTMODE_SCREEN_BUFFER ScreenBuffer, 231 COORD Size); 232 233 /* terminal.c */ 234 VOID ConioDrawConsole(PCONSRV_CONSOLE Console); 235 236 /* EOF */ 237