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