ReactOS  0.4.14-dev-77-gd9e7c48
conoutput.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Console Driver DLL
4  * FILE: win32ss/user/winsrv/consrv/condrv/conoutput.c
5  * PURPOSE: General Console Output Functions
6  * PROGRAMMERS: Jeffrey Morlan
7  * Hermes Belusca-Maito (hermes.belusca@sfr.fr)
8  */
9 
10 /* INCLUDES *******************************************************************/
11 
12 #include <consrv.h>
13 
14 #define NDEBUG
15 #include <debug.h>
16 
17 /* PRIVATE FUNCTIONS **********************************************************/
18 
23  IN PTEXTMODE_BUFFER_INFO TextModeInfo);
28  IN PGRAPHICS_BUFFER_INFO GraphicsInfo);
29 
30 VOID
32 VOID
34 
35 
40  IN SIZE_T Size)
41 {
42  if (Buffer == NULL || Console == NULL)
44 
47 
48  /* Initialize the header with the default type */
49  ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console);
50  (*Buffer)->Vtbl = Vtbl;
51  return STATUS_SUCCESS;
52 }
53 
54 VOID
56 {
57  if (Buffer->Header.Type == TEXTMODE_BUFFER)
58  {
60  }
61  else if (Buffer->Header.Type == GRAPHICS_BUFFER)
62  {
64  }
65  else if (Buffer->Header.Type == SCREEN_BUFFER)
66  {
67  /* Free the palette handle */
68  if (Buffer->PaletteHandle != NULL) DeleteObject(Buffer->PaletteHandle);
69 
70  /* Free the screen buffer memory */
72  }
73  // else
74  // do_nothing;
75 }
76 
77 // ConDrvCreateConsoleScreenBuffer
82  IN ULONG BufferType,
84 {
86 
87  if ( Console == NULL || Buffer == NULL ||
88  (BufferType != CONSOLE_TEXTMODE_BUFFER && BufferType != CONSOLE_GRAPHICS_BUFFER) )
89  {
91  }
92 
93  /* Use the current process if ProcessHandle is NULL */
94  if (ProcessHandle == NULL)
96 
97  if (BufferType == CONSOLE_TEXTMODE_BUFFER)
98  {
101  }
102  else if (BufferType == CONSOLE_GRAPHICS_BUFFER)
103  {
106  }
107  else
108  {
109  /* Never ever go there!! */
110  ASSERT(FALSE);
111  }
112 
113  /* Insert the newly created screen buffer into the list, if succeeded */
114  if (NT_SUCCESS(Status)) InsertHeadList(&Console->BufferList, &(*Buffer)->ListEntry);
115 
116  return Status;
117 }
118 
119 static VOID
121 
122 VOID NTAPI
124 {
125  PCONSOLE Console = Buffer->Header.Console;
126  PCONSOLE_SCREEN_BUFFER NewBuffer;
127 
128  /*
129  * We should notify temporarily the frontend because we are susceptible
130  * to delete the screen buffer it is using (which may be different from
131  * the active screen buffer in some cases), and because, if it actually
132  * uses the active screen buffer, we are going to nullify its pointer to
133  * change it.
134  */
136 
137  RemoveEntryList(&Buffer->ListEntry);
138  if (Buffer == Console->ActiveBuffer)
139  {
140  /* Delete active buffer; switch to most recently created */
141  if (!IsListEmpty(&Console->BufferList))
142  {
143  NewBuffer = CONTAINING_RECORD(Console->BufferList.Flink,
145  ListEntry);
146 
147  /* Tie console to new buffer and signal the change to the frontend */
148  ConioSetActiveScreenBuffer(NewBuffer);
149  }
150  else
151  {
152  Console->ActiveBuffer = NULL;
153  // InterlockedExchangePointer(&Console->ActiveBuffer, NULL);
154  }
155  }
156 
158 }
159 
160 static VOID
162 {
163  PCONSOLE Console = Buffer->Header.Console;
164  Console->ActiveBuffer = Buffer;
165  // InterlockedExchangePointer(&Console->ActiveBuffer, Buffer);
167 }
168 
172 {
173  if (Console == NULL || Buffer == NULL)
175 
176  /* Validity check */
177  ASSERT(Console == Buffer->Header.Console);
178 
179  if (Buffer == Console->ActiveBuffer) return STATUS_SUCCESS;
180 
181  /* If old buffer has no handles, it's now unreferenced */
182  if (Console->ActiveBuffer->Header.ReferenceCount == 0)
183  {
184  ConDrvDeleteScreenBuffer(Console->ActiveBuffer);
185  }
186 
187  /* Tie console to new buffer and signal the change to the frontend */
189 
190  return STATUS_SUCCESS;
191 }
192 
195 {
196  return (Console ? Console->ActiveBuffer : NULL);
197 }
198 
199 /* PUBLIC DRIVER APIS *********************************************************/
200 
205 {
206  if (Console == NULL || Buffer == NULL || Region == NULL)
208 
209  /* Validity check */
210  ASSERT(Console == Buffer->Header.Console);
211 
212  /* If the output buffer is the current one, redraw the correct portion of the screen */
213  if (Buffer == Console->ActiveBuffer) TermDrawRegion(Console, Region);
214 
215  return STATUS_SUCCESS;
216 }
217 
220  // IN PGRAPHICS_SCREEN_BUFFER Buffer,
222  IN HPALETTE PaletteHandle,
223  IN UINT PaletteUsage)
224 {
225  BOOL Success;
226 
227  /*
228  * Parameters validation
229  */
230  if (Console == NULL || Buffer == NULL)
232 
233  if ( PaletteUsage != SYSPAL_STATIC &&
234  PaletteUsage != SYSPAL_NOSTATIC &&
235  PaletteUsage != SYSPAL_NOSTATIC256 )
236  {
238  }
239 
240  /* Validity check */
241  ASSERT(Console == Buffer->Header.Console);
242 
243  /* Change the palette */
244  Success = TermSetPalette(Console, PaletteHandle, PaletteUsage);
245  if (Success)
246  {
247  /* Free the old palette handle if there was already one set */
248  if ( Buffer->PaletteHandle != NULL &&
249  Buffer->PaletteHandle != PaletteHandle )
250  {
251  DeleteObject(Buffer->PaletteHandle);
252  }
253 
254  /* Save the new palette in the screen buffer */
255  Buffer->PaletteHandle = PaletteHandle;
256  Buffer->PaletteUsage = PaletteUsage;
257  }
258 
260 }
261 
265  OUT PCONSOLE_CURSOR_INFO CursorInfo)
266 {
267  if (Console == NULL || Buffer == NULL || CursorInfo == NULL)
269 
270  /* Validity check */
271  ASSERT(Console == Buffer->Header.Console);
272 
273  *CursorInfo = Buffer->CursorInfo;
274  // CursorInfo->bVisible = Buffer->CursorInfo.bVisible;
275  // CursorInfo->dwSize = Buffer->CursorInfo.dwSize;
276 
277  return STATUS_SUCCESS;
278 }
279 
283  IN PCONSOLE_CURSOR_INFO CursorInfo)
284 {
285  ULONG Size;
286  BOOLEAN Visible, Success = TRUE;
287 
288  if (Console == NULL || Buffer == NULL || CursorInfo == NULL)
290 
291  /* Validity check */
292  ASSERT(Console == Buffer->Header.Console);
293 
294  Size = min(max(CursorInfo->dwSize, 1), 100);
295  Visible = CursorInfo->bVisible;
296 
297  if ( (Size != Buffer->CursorInfo.dwSize) ||
298  (Visible && !Buffer->CursorInfo.bVisible) ||
299  (!Visible && Buffer->CursorInfo.bVisible) )
300  {
301  Buffer->CursorInfo.dwSize = Size;
302  Buffer->CursorInfo.bVisible = Visible;
303 
305  }
306 
308 }
309 
314 {
315  SHORT OldCursorX, OldCursorY;
316 
317  if (Console == NULL || Buffer == NULL || Position == NULL)
319 
320  /* Validity check */
321  ASSERT(Console == Buffer->Header.Console);
322 
323  if ( Position->X < 0 || Position->X >= Buffer->ScreenBufferSize.X ||
324  Position->Y < 0 || Position->Y >= Buffer->ScreenBufferSize.Y )
325  {
327  }
328 
329  OldCursorX = Buffer->CursorPosition.X;
330  OldCursorY = Buffer->CursorPosition.Y;
331  Buffer->CursorPosition = *Position;
332  // Buffer->CursorPosition.X = Position->X;
333  // Buffer->CursorPosition.Y = Position->Y;
334  if ( ((PCONSOLE_SCREEN_BUFFER)Buffer == Console->ActiveBuffer) &&
335  (!TermSetScreenInfo(Console, (PCONSOLE_SCREEN_BUFFER)Buffer, OldCursorX, OldCursorY)) )
336  {
337  return STATUS_UNSUCCESSFUL;
338  }
339 
340  return STATUS_SUCCESS;
341 }
342 
343 /* EOF */
#define IN
Definition: typedefs.h:38
NTSTATUS NTAPI ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console, IN PCONSOLE_SCREEN_BUFFER Buffer)
Definition: conoutput.c:170
#define max(a, b)
Definition: svc.c:63
#define TRUE
Definition: types.h:120
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
VOID NTAPI ConDrvDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
Definition: conoutput.c:123
PCONSOLE_SCREEN_BUFFER ConDrvGetActiveScreenBuffer(IN PCONSOLE Console)
Definition: conoutput.c:194
CONSOLE_SCREEN_BUFFER_INFO ScreenBufferInfo
Definition: notevil.c:38
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
Definition: rtlfuncs.h:201
static COORD Position
Definition: mouse.c:34
LONG NTSTATUS
Definition: precomp.h:26
#define ConsoleAllocHeap(Flags, Size)
Definition: heap.h:14
#define TermDrawRegion(Console, Region)
Definition: term.h:22
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
NTSTATUS TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER *Buffer, IN PCONSOLE Console, IN HANDLE ProcessHandle, IN PTEXTMODE_BUFFER_INFO TextModeInfo)
Definition: text.c:62
NTSTATUS ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER *Buffer, IN PCONSOLE Console, IN HANDLE ProcessHandle OPTIONAL, IN ULONG BufferType, IN PVOID ScreenBufferInfo)
Definition: conoutput.c:79
static HPALETTE PaletteHandle
Definition: svga.c:215
#define TEXTMODE_BUFFER
Definition: pccons.c:21
NTSTATUS NTAPI ConDrvGetConsoleCursorInfo(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, OUT PCONSOLE_CURSOR_INFO CursorInfo)
Definition: conoutput.c:263
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
Definition: rtlfuncs.h:57
NTSTATUS CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER *Buffer, IN PCONSOLE Console, IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN SIZE_T Size)
Definition: conoutput.c:37
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
Definition: rtlfuncs.h:105
VOID TEXTMODE_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
Definition: text.c:123
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define TermSetScreenInfo(Console, ScreenBuffer, OldCursorX, OldCursorY)
Definition: term.h:26
short SHORT
Definition: pedump.c:59
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define TermSetActiveScreenBuffer(Console)
Definition: term.h:30
Definition: bufpool.h:45
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define NtCurrentProcess()
Definition: nt_native.h:1657
ULONG X
Definition: bl.h:1340
NTSTATUS NTAPI ConDrvSetConsolePalette(IN PCONSOLE Console, IN PCONSOLE_SCREEN_BUFFER Buffer, IN HPALETTE PaletteHandle, IN UINT PaletteUsage)
Definition: conoutput.c:219
#define SYSPAL_NOSTATIC256
Definition: wingdi.h:21
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER *Buffer, IN PCONSOLE Console, IN HANDLE ProcessHandle, IN PGRAPHICS_BUFFER_INFO GraphicsInfo)
Definition: graphics.c:44
NTSTATUS NTAPI ConDrvSetConsoleCursorPosition(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN PCOORD Position)
Definition: conoutput.c:311
static VOID ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
Definition: conoutput.c:161
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define SYSPAL_STATIC
Definition: wingdi.h:925
NTSTATUS NTAPI ConDrvSetConsoleCursorInfo(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN PCONSOLE_CURSOR_INFO CursorInfo)
Definition: conoutput.c:281
#define TermSetPalette(Console, PaletteHandle, PaletteUsage)
Definition: term.h:36
VOID ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, IN CONSOLE_IO_OBJECT_TYPE Type, IN PCONSOLE Console)
Definition: handle.c:294
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:359
Definition: bl.h:1338
#define SYSPAL_NOSTATIC
Definition: wingdi.h:924
Status
Definition: gdiplustypes.h:24
ULONG_PTR SIZE_T
Definition: typedefs.h:78
#define TermSetCursorInfo(Console, ScreenBuffer)
Definition: term.h:24
#define CONSOLE_TEXTMODE_BUFFER
Definition: wincon.h:59
#define CONSOLE_GRAPHICS_BUFFER
Definition: wincon.h:60
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
NTSTATUS NTAPI ConDrvInvalidateBitMapRect(IN PCONSOLE Console, IN PCONSOLE_SCREEN_BUFFER Buffer, IN PSMALL_RECT Region)
Definition: conoutput.c:202
CConsole Console
#define ConsoleFreeHeap(HeapBase)
Definition: heap.h:15
VOID GRAPHICS_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
Definition: graphics.c:249
#define OUT
Definition: typedefs.h:39
unsigned int ULONG
Definition: retypes.h:1
VOID CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
Definition: conoutput.c:55
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
return STATUS_SUCCESS
Definition: btrfs.c:2966
ULONG Y
Definition: bl.h:1341
#define TermReleaseScreenBuffer(Console, ScreenBuffer)
Definition: term.h:32
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68