1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS Console Server DLL 4 * FILE: win32ss/user/winsrv/consrv/include/conio.h 5 * PURPOSE: Public Console I/O Interface 6 * PROGRAMMERS: G� van Geldorp 7 * Jeffrey Morlan 8 * Hermes Belusca-Maito (hermes.belusca@sfr.fr) 9 */ 10 11 #pragma once 12 13 #include "rect.h" 14 15 // This is ALMOST a HACK!!!!!!! 16 // Helpers for code refactoring 17 #ifdef USE_NEW_CONSOLE_WAY 18 19 #define _CONSRV_CONSOLE _WINSRV_CONSOLE 20 #define CONSRV_CONSOLE WINSRV_CONSOLE 21 #define PCONSRV_CONSOLE PWINSRV_CONSOLE 22 23 #else 24 25 #define _CONSRV_CONSOLE _CONSOLE 26 #define CONSRV_CONSOLE CONSOLE 27 #define PCONSRV_CONSOLE PCONSOLE 28 29 #endif 30 31 /* Default attributes */ 32 #define DEFAULT_SCREEN_ATTRIB (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED) 33 #define DEFAULT_POPUP_ATTRIB (FOREGROUND_BLUE | FOREGROUND_RED | \ 34 BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY) 35 36 37 /* Object type magic numbers */ 38 typedef enum _CONSOLE_IO_OBJECT_TYPE 39 { 40 UNKNOWN = 0x00, // --> Unknown object 41 TEXTMODE_BUFFER = 0x01, // --> Output-type object for text SBs 42 GRAPHICS_BUFFER = 0x02, // --> Output-type object for graphics SBs 43 SCREEN_BUFFER = 0x03, // --> Any SB type 44 INPUT_BUFFER = 0x04, // --> Input-type object 45 ANY_TYPE_BUFFER = 0x07, // --> Any IO object 46 } CONSOLE_IO_OBJECT_TYPE; 47 48 typedef struct _CONSOLE_IO_OBJECT 49 { 50 CONSOLE_IO_OBJECT_TYPE Type; 51 52 struct _CONSOLE* /* PCONSOLE */ Console; 53 LONG ReferenceCount; /* Is incremented each time a console object gets referenced */ 54 55 LONG AccessRead, AccessWrite; 56 LONG ExclusiveRead, ExclusiveWrite; 57 } CONSOLE_IO_OBJECT, *PCONSOLE_IO_OBJECT; 58 59 60 /******************************************************************************\ 61 |* *| 62 |* Abstract "class" for screen-buffers, be they text-mode or graphics *| 63 |* *| 64 \******************************************************************************/ 65 66 /* 67 * See conoutput.c for the implementation 68 */ 69 70 typedef struct _CONSOLE_SCREEN_BUFFER CONSOLE_SCREEN_BUFFER, 71 *PCONSOLE_SCREEN_BUFFER; 72 73 typedef struct _CONSOLE_SCREEN_BUFFER_VTBL 74 { 75 CONSOLE_IO_OBJECT_TYPE (*GetType)(PCONSOLE_SCREEN_BUFFER This); 76 } CONSOLE_SCREEN_BUFFER_VTBL, *PCONSOLE_SCREEN_BUFFER_VTBL; 77 78 #define GetType(This) (This)->Vtbl->GetType(This) 79 80 struct _CONSOLE_SCREEN_BUFFER 81 { 82 CONSOLE_IO_OBJECT Header; /* Object header - MUST BE IN FIRST PLACE */ 83 PCONSOLE_SCREEN_BUFFER_VTBL Vtbl; /* Virtual table */ 84 85 LIST_ENTRY ListEntry; /* Entry in console's list of buffers */ 86 87 COORD ScreenBufferSize; /* Size of this screen buffer. (Rows, Columns) for text-mode and (Width, Height) for graphics-mode */ 88 COORD ViewSize; /* Associated "view" (i.e. console) size */ 89 90 COORD OldScreenBufferSize; /* Old size of this screen buffer */ 91 COORD OldViewSize; /* Old associated view size */ 92 93 COORD ViewOrigin; /* Beginning offset for the actual display area */ 94 95 /***** Put that VV in TEXTMODE_SCREEN_BUFFER ?? *****/ 96 USHORT VirtualY; /* Top row of buffer being displayed, reported to callers */ 97 98 COORD CursorPosition; /* Current cursor position */ 99 BOOLEAN CursorBlinkOn; 100 BOOLEAN ForceCursorOff; 101 // ULONG CursorSize; 102 CONSOLE_CURSOR_INFO CursorInfo; // FIXME: Keep this member or not ?? 103 /*********************************************/ 104 105 HPALETTE PaletteHandle; /* Handle to the color palette associated to this buffer */ 106 UINT PaletteUsage; /* The new use of the system palette. See SetSystemPaletteUse 'uUsage' parameter */ 107 108 // WORD ScreenDefaultAttrib; /* Default screen char attribute */ 109 // WORD PopupDefaultAttrib; /* Default popup char attribute */ 110 USHORT Mode; /* Output buffer modes */ 111 }; 112 113 114 115 /******************************************************************************\ 116 |* *| 117 |* Text-mode and graphics-mode screen-buffer "classes" *| 118 |* *| 119 \******************************************************************************/ 120 121 /* 122 * See text.c for the implementation 123 */ 124 125 /************************************************************************ 126 * Screen buffer structure represents the win32 screen buffer object. * 127 * Internally, the portion of the buffer being shown CAN loop past the * 128 * bottom of the virtual buffer and wrap around to the top. Win32 does * 129 * not do this. I decided to do this because it eliminates the need to * 130 * do a massive memcpy() to scroll the contents of the buffer up to * 131 * scroll the screen on output, instead I just shift down the position * 132 * to be displayed, and let it wrap around to the top again. * 133 * The VirtualY member keeps track of the top Y coord that win32 * 134 * clients THINK is currently being displayed, because they think that * 135 * when the display reaches the bottom of the buffer and another line * 136 * being printed causes another line to scroll down, that the buffer IS * 137 * memcpy()'s up, and the bottom of the buffer is still displayed, but * 138 * internally, I just wrap back to the top of the buffer. * 139 ************************************************************************/ 140 141 typedef struct _TEXTMODE_BUFFER_INFO 142 { 143 COORD ScreenBufferSize; 144 USHORT ScreenAttrib; 145 USHORT PopupAttrib; 146 ULONG CursorSize; 147 BOOLEAN IsCursorVisible; 148 } TEXTMODE_BUFFER_INFO, *PTEXTMODE_BUFFER_INFO; 149 150 typedef struct _TEXTMODE_SCREEN_BUFFER 151 { 152 CONSOLE_SCREEN_BUFFER; /* Screen buffer base class - MUST BE IN FIRST PLACE */ 153 154 PCHAR_INFO Buffer; /* Pointer to UNICODE screen buffer (Buffer->Char.UnicodeChar only is valid, not Char.AsciiChar) */ 155 156 WORD ScreenDefaultAttrib; /* Default screen char attribute */ 157 WORD PopupDefaultAttrib; /* Default popup char attribute */ 158 } TEXTMODE_SCREEN_BUFFER, *PTEXTMODE_SCREEN_BUFFER; 159 160 161 /* 162 * See graphics.c for the implementation 163 */ 164 165 typedef struct _GRAPHICS_BUFFER_INFO 166 { 167 CONSOLE_GRAPHICS_BUFFER_INFO Info; 168 } GRAPHICS_BUFFER_INFO, *PGRAPHICS_BUFFER_INFO; 169 170 typedef struct _GRAPHICS_SCREEN_BUFFER 171 { 172 CONSOLE_SCREEN_BUFFER; /* Screen buffer base class - MUST BE IN FIRST PLACE */ 173 174 ULONG BitMapInfoLength; /* Real size of the structure pointed by BitMapInfo */ 175 LPBITMAPINFO BitMapInfo; /* Information on the bitmap buffer */ 176 ULONG BitMapUsage; /* See the uUsage parameter of GetDIBits */ 177 HANDLE hSection; /* Handle to the memory shared section for the bitmap buffer */ 178 PVOID BitMap; /* Our bitmap buffer */ 179 180 PVOID ClientBitMap; /* A copy of the client view of our bitmap buffer */ 181 HANDLE Mutex; /* Our mutex, used to synchronize read / writes to the bitmap buffer */ 182 HANDLE ClientMutex; /* A copy of the client handle to our mutex */ 183 HANDLE ClientProcess; /* Handle to the client process who opened the buffer, to unmap the view */ 184 } GRAPHICS_SCREEN_BUFFER, *PGRAPHICS_SCREEN_BUFFER; 185 186 187 188 typedef struct _CONSOLE_INPUT_BUFFER 189 { 190 CONSOLE_IO_OBJECT Header; /* Object header - MUST BE IN FIRST PLACE */ 191 192 ULONG InputBufferSize; /* Size of this input buffer -- UNUSED!! */ 193 LIST_ENTRY InputEvents; /* List head for input event queue */ 194 HANDLE ActiveEvent; /* Event set when an input event is added in its queue */ 195 196 USHORT Mode; /* Input buffer modes */ 197 } CONSOLE_INPUT_BUFFER, *PCONSOLE_INPUT_BUFFER; 198 199 200 typedef struct _TERMINAL TERMINAL, *PTERMINAL; 201 202 /* 203 * Structure used to hold console information 204 */ 205 typedef struct _CONSOLE_INFO 206 { 207 ULONG InputBufferSize; 208 COORD ScreenBufferSize; 209 COORD ConsoleSize; /* The size of the console */ 210 211 ULONG CursorSize; 212 BOOLEAN CursorBlinkOn; 213 BOOLEAN ForceCursorOff; 214 215 USHORT ScreenAttrib; // CHAR_INFO ScreenFillAttrib 216 USHORT PopupAttrib; 217 218 ULONG CodePage; 219 220 } CONSOLE_INFO, *PCONSOLE_INFO; 221 222 typedef struct _TERMINAL_VTBL 223 { 224 /* 225 * Internal interface (functions called by the console server only) 226 */ 227 NTSTATUS (NTAPI *InitTerminal)(IN OUT PTERMINAL This, 228 IN struct _CONSOLE* Console); 229 VOID (NTAPI *DeinitTerminal)(IN OUT PTERMINAL This); 230 231 232 233 /************ Line discipline ***************/ 234 235 /* Interface used only for text-mode screen buffers */ 236 237 NTSTATUS (NTAPI *ReadStream)(IN OUT PTERMINAL This, 238 IN BOOLEAN Unicode, 239 /**PWCHAR Buffer,**/ 240 OUT PVOID Buffer, 241 IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl, 242 IN PVOID Parameter OPTIONAL, 243 IN ULONG NumCharsToRead, 244 OUT PULONG NumCharsRead OPTIONAL); 245 NTSTATUS (NTAPI *WriteStream)(IN OUT PTERMINAL This, 246 PTEXTMODE_SCREEN_BUFFER Buff, 247 PWCHAR Buffer, 248 DWORD Length, 249 BOOL Attrib); 250 251 /************ Line discipline ***************/ 252 253 254 255 /* Interface used for both text-mode and graphics screen buffers */ 256 VOID (NTAPI *DrawRegion)(IN OUT PTERMINAL This, 257 SMALL_RECT* Region); 258 BOOL (NTAPI *SetCursorInfo)(IN OUT PTERMINAL This, 259 PCONSOLE_SCREEN_BUFFER ScreenBuffer); 260 BOOL (NTAPI *SetScreenInfo)(IN OUT PTERMINAL This, 261 PCONSOLE_SCREEN_BUFFER ScreenBuffer, 262 SHORT OldCursorX, 263 SHORT OldCursorY); 264 VOID (NTAPI *ResizeTerminal)(IN OUT PTERMINAL This); 265 VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PTERMINAL This); 266 VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PTERMINAL This, 267 IN PCONSOLE_SCREEN_BUFFER ScreenBuffer); 268 269 /* 270 * External interface (functions corresponding to the Console API) 271 */ 272 VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PTERMINAL This, 273 PCOORD pSize); 274 BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This, 275 HPALETTE PaletteHandle, 276 UINT PaletteUsage); 277 INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This, 278 BOOL Show); 279 280 #if 0 // Possible future terminal interface 281 BOOL (NTAPI *GetTerminalProperty)(IN OUT PTERMINAL This, 282 ULONG Flag, 283 PVOID Info, 284 ULONG Size); 285 BOOL (NTAPI *SetTerminalProperty)(IN OUT PTERMINAL This, 286 ULONG Flag, 287 PVOID Info /*, 288 ULONG Size */); 289 #endif 290 } TERMINAL_VTBL, *PTERMINAL_VTBL; 291 292 struct _TERMINAL 293 { 294 PTERMINAL_VTBL Vtbl; /* Virtual table */ 295 struct _CONSOLE* Console; /* Console to which the terminal is attached to */ 296 PVOID Context; /* Private context */ 297 }; 298 299 /* 300 * WARNING: Change the state of the console ONLY when the console is locked ! 301 */ 302 typedef enum _CONSOLE_STATE 303 { 304 CONSOLE_INITIALIZING, /* Console is initializing */ 305 CONSOLE_RUNNING , /* Console running */ 306 CONSOLE_TERMINATING , /* Console about to be destroyed (but still not) */ 307 CONSOLE_IN_DESTRUCTION /* Console in destruction */ 308 } CONSOLE_STATE, *PCONSOLE_STATE; 309 310 // HACK!! 311 struct _CONSOLE; 312 /* HACK: */ typedef struct _CONSOLE *PCONSOLE; 313 #ifndef USE_NEW_CONSOLE_WAY 314 #include "conio_winsrv.h" 315 #endif 316 317 typedef struct _CONSOLE 318 { 319 /******************************* Console Set-up *******************************/ 320 321 #ifndef USE_NEW_CONSOLE_WAY 322 WINSRV_CONSOLE; // HACK HACK!! 323 #endif 324 325 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 */ 326 CRITICAL_SECTION Lock; 327 328 ULONG ConsoleID; /* The ID of the console */ 329 LIST_ENTRY ListEntry; /* Entry in the list of consoles */ 330 331 CONSOLE_STATE State; /* State of the console */ 332 TERMINAL TermIFace; /* Terminal-specific interface */ 333 334 HANDLE UnpauseEvent; /* When != NULL, event for pausing the console */ 335 336 /******************************** Input buffer ********************************/ 337 CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ 338 UINT InputCodePage; 339 340 /******************************* Screen buffers *******************************/ 341 LIST_ENTRY BufferList; /* List of all screen buffers for this console */ 342 PCONSOLE_SCREEN_BUFFER ActiveBuffer; /* Pointer to currently active screen buffer */ 343 UINT OutputCodePage; 344 345 /****************************** Other properties ******************************/ 346 COORD ConsoleSize; /* The current size of the console, for text-mode only */ 347 BOOLEAN FixedSize; /* TRUE if the console is of fixed size */ 348 BOOLEAN IsCJK; /* TRUE if Chinese, Japanese or Korean (CJK) */ 349 } CONSOLE; // , *PCONSOLE; 350 351 /* console.c */ 352 VOID NTAPI 353 ConDrvPause(PCONSOLE Console); 354 VOID NTAPI 355 ConDrvUnpause(PCONSOLE Console); 356 357 NTSTATUS 358 ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, 359 IN PCONSOLE_PROCESS_DATA ProcessData); 360 361 362 #define GetConsoleInputBufferMode(Console) \ 363 (Console)->InputBuffer.Mode 364 365 366 /* conoutput.c */ 367 PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); 368 NTSTATUS ConioResizeBuffer(PCONSOLE /*PCONSRV_CONSOLE*/ Console, 369 PTEXTMODE_SCREEN_BUFFER ScreenBuffer, 370 COORD Size); 371 372 /* wcwidth.c */ 373 int mk_wcwidth_cjk(wchar_t ucs); 374 375 /* EOF */ 376