ReactOS  0.4.13-dev-235-g7373cb3
conio.h
Go to the documentation of this file.
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 */
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
47 
48 typedef struct _CONSOLE_IO_OBJECT
49 {
51 
52  struct _CONSOLE* /* PCONSOLE */ Console;
53  LONG ReferenceCount; /* Is incremented each time a console object gets referenced */
54 
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 
72 
74 {
77 
78 #define GetType(This) (This)->Vtbl->GetType(This)
79 
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 */
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 {
149 
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 */
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;
169 
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 */
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 */
198 
199 
200 typedef struct _TERMINAL TERMINAL, *PTERMINAL;
201 
202 /*
203  * Structure used to hold console information
204  */
205 typedef struct _CONSOLE_INFO
206 {
209  COORD ConsoleSize; /* The size of the console */
210 
214 
215  USHORT ScreenAttrib; // CHAR_INFO ScreenFillAttrib
217 
219 
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,
240  OUT PVOID Buffer,
244  OUT PULONG NumCharsRead OPTIONAL);
245  NTSTATUS (NTAPI *WriteStream)(IN OUT PTERMINAL This,
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 */
258  BOOL (NTAPI *SetCursorInfo)(IN OUT PTERMINAL This,
260  BOOL (NTAPI *SetScreenInfo)(IN OUT PTERMINAL This,
263  SHORT OldCursorY);
264  VOID (NTAPI *ResizeTerminal)(IN OUT PTERMINAL This);
266  VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PTERMINAL This,
268 
269  /*
270  * External interface (functions corresponding to the Console API)
271  */
274  BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This,
275  HPALETTE PaletteHandle,
277  INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This,
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
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 */
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 */
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 */
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 */
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 
349 } CONSOLE; // , *PCONSOLE;
350 
351 /* console.c */
352 VOID NTAPI
354 VOID NTAPI
356 
357 NTSTATUS
359  IN PCONSOLE_PROCESS_DATA ProcessData);
360 
361 
362 #define GetConsoleInputBufferMode(Console) \
363  (Console)->InputBuffer.Mode
364 
365 
366 /* conoutput.c */
368 NTSTATUS ConioResizeBuffer(PCONSOLE /*PCONSRV_CONSOLE*/ Console,
370  COORD Size);
371 
372 /* EOF */
struct _CONSOLE_INFO CONSOLE_INFO
CONSOLE_GRAPHICS_BUFFER_INFO Info
Definition: conio.h:167
BOOLEAN ForceCursorOff
Definition: conio.h:213
LONG ExclusiveWrite
Definition: conio.h:56
HANDLE UnpauseEvent
Definition: conio.h:334
struct _GRAPHICS_BUFFER_INFO * PGRAPHICS_BUFFER_INFO
PCONSOLE_SCREEN_BUFFER SHORT SHORT OldCursorY
Definition: conio.h:261
HPALETTE PaletteHandle
Definition: conio.h:275
#define IN
Definition: typedefs.h:38
COORD ConsoleSize
Definition: conio.h:209
ULONG InputBufferSize
Definition: conio.h:207
struct _CONSOLE * Console
Definition: conio.h:52
#define Y(I)
PTERMINAL_VTBL Vtbl
Definition: conio.h:294
BOOLEAN CursorBlinkOn
Definition: conio.h:99
PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y)
Definition: text.c:140
COORD ScreenBufferSize
Definition: conio.h:208
LONG ReferenceCount
Definition: conio.h:325
PCOORD pSize
Definition: conio.h:273
HANDLE ActiveEvent
Definition: conio.h:194
LONG NTSTATUS
Definition: precomp.h:26
PCONSOLE_SCREEN_BUFFER ScreenBuffer
Definition: conio.h:259
COORD CursorPosition
Definition: conio.h:98
BOOL Show
Definition: conio.h:278
IN BOOLEAN OUT PVOID IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl
Definition: conio.h:238
VOID NTAPI ConDrvUnpause(PCONSOLE Console)
Definition: console.c:91
LONG AccessRead
Definition: conio.h:55
BOOLEAN IsCursorVisible
Definition: conio.h:147
uint16_t * PWCHAR
Definition: typedefs.h:54
_In_ PVOID Parameter
Definition: ldrtypes.h:240
PCONSOLE_SCREEN_BUFFER ActiveBuffer
Definition: conio.h:342
USHORT PopupAttrib
Definition: conio.h:216
enum _CONSOLE_STATE * PCONSOLE_STATE
LONG AccessWrite
Definition: conio.h:55
COORD OldScreenBufferSize
Definition: conio.h:90
struct TraceInfo Info
COORD ConsoleSize
Definition: conio.h:346
SMALL_RECT * Region
Definition: conio.h:257
CONSOLE_IO_OBJECT Header
Definition: conio.h:82
struct _CONSOLE_SCREEN_BUFFER_VTBL CONSOLE_SCREEN_BUFFER_VTBL
struct _CONSOLE_INPUT_BUFFER * PCONSOLE_INPUT_BUFFER
NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, COORD Size)
Definition: text.c:257
static VOID DrawRegion(PGUI_CONSOLE_DATA GuiData, SMALL_RECT *Region)
Definition: guiterm.c:75
HPALETTE PaletteHandle
Definition: conio.h:105
BOOL(NTAPI *SetCursorInfo)(IN OUT PTERMINAL This
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
PCONSOLE_SCREEN_BUFFER SHORT OldCursorX
Definition: conio.h:261
LPBITMAPINFO BitMapInfo
Definition: conio.h:175
COORD ScreenBufferSize
Definition: conio.h:87
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
short SHORT
Definition: pedump.c:59
INT(NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This
ULONG CodePage
Definition: conio.h:218
LONG ReferenceCount
Definition: conio.h:53
struct _CONSOLE_SCREEN_BUFFER * PCONSOLE_SCREEN_BUFFER
Definition: conio.h:70
unsigned char BOOLEAN
ULONG ConsoleID
Definition: conio.h:328
struct _CONSOLE_IO_OBJECT CONSOLE_IO_OBJECT
CONSOLE_STATE State
Definition: conio.h:331
CONSOLE_IO_OBJECT_TYPE(* GetType)(PCONSOLE_SCREEN_BUFFER This)
Definition: conio.h:75
NTSTATUS(NTAPI *InitTerminal)(IN OUT PTERMINAL This
struct _TERMINAL_VTBL * PTERMINAL_VTBL
struct _CONSOLE_IO_OBJECT * PCONSOLE_IO_OBJECT
BOOLEAN FixedSize
Definition: conio.h:347
NTSTATUS ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, IN PCONSOLE_PROCESS_DATA ProcessData)
Definition: console.c:860
WINSRV_CONSOLE
Definition: conio.h:322
IN BOOLEAN Unicode
Definition: conio.h:238
struct _CONSOLE_INFO * PCONSOLE_INFO
IN BOOLEAN OUT PVOID IN OUT PCONSOLE_READCONSOLE_CONTROL IN PVOID Parameter OPTIONAL
Definition: conio.h:238
UINT OutputCodePage
Definition: conio.h:343
struct _CONSOLE CONSOLE
LIST_ENTRY BufferList
Definition: conio.h:341
Definition: xml2sdb.h:79
VOID(NTAPI *DeinitTerminal)(IN OUT PTERMINAL This)
unsigned short WORD
Definition: ntddk_ex.h:93
COORD WINAPI DECLSPEC_HOTPATCH GetLargestConsoleWindowSize(HANDLE hConsoleOutput)
Definition: console.c:1675
unsigned long DWORD
Definition: ntddk_ex.h:95
CONSOLE_INPUT_BUFFER InputBuffer
Definition: conio.h:337
CONSOLE_IO_OBJECT Header
Definition: conio.h:190
struct _GRAPHICS_SCREEN_BUFFER * PGRAPHICS_SCREEN_BUFFER
IN BOOLEAN OUT PVOID IN OUT PCONSOLE_READCONSOLE_CONTROL IN PVOID Parameter IN ULONG NumCharsToRead
Definition: conio.h:238
struct _TERMINAL_VTBL TERMINAL_VTBL
TERMINAL TermIFace
Definition: conio.h:332
UINT InputCodePage
Definition: conio.h:338
Definition: typedefs.h:117
struct _TEXTMODE_SCREEN_BUFFER TEXTMODE_SCREEN_BUFFER
BOOLEAN ForceCursorOff
Definition: conio.h:100
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
BOOLEAN CursorBlinkOn
Definition: conio.h:212
Definition: bl.h:1338
static VOID SetActiveScreenBuffer(HANDLE ScreenBuffer)
Definition: video.c:439
struct _GRAPHICS_BUFFER_INFO GRAPHICS_BUFFER_INFO
struct _CONSOLE * PCONSOLE
Definition: conio.h:312
USHORT PopupAttrib
Definition: conio.h:145
enum _CONSOLE_STATE CONSOLE_STATE
LIST_ENTRY ListEntry
Definition: conio.h:85
USHORT ScreenAttrib
Definition: conio.h:215
ULONG InputBufferSize
Definition: conio.h:192
struct _CONSOLE_INPUT_BUFFER CONSOLE_INPUT_BUFFER
PVOID Context
Definition: conio.h:296
struct _CONSOLE_SCREEN_BUFFER_VTBL * PCONSOLE_SCREEN_BUFFER_VTBL
CRITICAL_SECTION Lock
Definition: conio.h:326
IN PCONSOLE_SCREEN_BUFFER ScreenBuffer
Definition: conio.h:267
struct _TERMINAL * PTERMINAL
Definition: conio.h:200
unsigned short USHORT
Definition: pedump.c:61
PTEXTMODE_SCREEN_BUFFER PWCHAR DWORD BOOL Attrib
Definition: conio.h:246
_CONSOLE_IO_OBJECT_TYPE
Definition: conio.h:38
unsigned int * PULONG
Definition: retypes.h:1
IN BOOLEAN OUT PVOID Buffer
Definition: conio.h:238
unsigned int UINT
Definition: ndis.h:50
ULONG CursorSize
Definition: conio.h:211
PTEXTMODE_SCREEN_BUFFER Buff
Definition: conio.h:246
struct _TEXTMODE_BUFFER_INFO * PTEXTMODE_BUFFER_INFO
struct _CONSOLE * Console
Definition: conio.h:295
CConsole Console
PTEXTMODE_SCREEN_BUFFER PWCHAR DWORD Length
Definition: conio.h:246
PCHAR_INFO Buffer
Definition: conio.h:154
HANDLE ScreenBuffer
Definition: notevil.c:37
#define OUT
Definition: typedefs.h:39
CONSOLE_IO_OBJECT_TYPE Type
Definition: conio.h:50
unsigned int ULONG
Definition: retypes.h:1
VOID NTAPI ConDrvPause(PCONSOLE Console)
Definition: console.c:80
PCONSOLE_SCREEN_BUFFER_VTBL Vtbl
Definition: conio.h:83
HPALETTE UINT PaletteUsage
Definition: conio.h:275
IN struct _CONSOLE * Console
Definition: conio.h:228
CONSOLE_CURSOR_INFO CursorInfo
Definition: conio.h:102
LIST_ENTRY InputEvents
Definition: conio.h:193
enum _CONSOLE_IO_OBJECT_TYPE CONSOLE_IO_OBJECT_TYPE
LIST_ENTRY ListEntry
Definition: conio.h:329
struct _TEXTMODE_SCREEN_BUFFER * PTEXTMODE_SCREEN_BUFFER
COORD ScreenBufferSize
Definition: conio.h:143
struct _TEXTMODE_BUFFER_INFO TEXTMODE_BUFFER_INFO
LONG ExclusiveRead
Definition: conio.h:56
struct _GRAPHICS_SCREEN_BUFFER GRAPHICS_SCREEN_BUFFER
USHORT ScreenAttrib
Definition: conio.h:144