ReactOS  0.4.13-dev-563-g0561610
video.c File Reference
#include <ntddvdeo.h>
Include dependency graph for video.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Functions

BOOL WINAPI __RegisterConsoleVDM (IN DWORD dwRegisterFlags, IN HANDLE hStartHardwareEvent, IN HANDLE hEndHardwareEvent, IN HANDLE hErrorHardwareEvent, IN DWORD dwUnusedVar, OUT LPDWORD lpVideoStateLength, OUT PVOID *lpVideoState, IN PVOID lpUnusedBuffer, IN DWORD dwUnusedBufferLength, IN COORD dwVDMBufferSize, OUT PVOID *lpVDMBuffer)
 
BOOL __InvalidateConsoleDIBits (IN HANDLE hConsoleOutput, IN PSMALL_RECT lpRect)
 
static VOID VgaUpdateTextCursor (VOID)
 
static DWORD VgaGetAddressSize (VOID)
 
static VOID ResizeTextConsole (PCOORD Resolution, PSMALL_RECT WindowSize OPTIONAL)
 
static VOID UpdateCursorPosition (VOID)
 
static BOOL AttachToConsoleInternal (PCOORD Resolution)
 
static VOID DetachFromConsoleInternal (VOID)
 
static VOID SetActiveScreenBuffer (HANDLE ScreenBuffer)
 
VOID ScreenEventHandler (PWINDOW_BUFFER_SIZE_RECORD ScreenEvent)
 
BOOLEAN VgaGetDoubleVisionState (PBOOLEAN Horizontal, PBOOLEAN Vertical)
 
BOOL VgaAttachToConsole (VOID)
 
VOID VgaDetachFromConsole (VOID)
 
VOID VgaConsoleUpdateTextCursor (BOOL CursorVisible, BYTE CursorStart, BYTE CursorEnd, BYTE TextSize, DWORD ScanlineSize, WORD Location)
 
BOOL VgaConsoleCreateGraphicsScreen (IN PCOORD Resolution, IN HANDLE PaletteHandle)
 
VOID VgaConsoleDestroyGraphicsScreen (VOID)
 
BOOL VgaConsoleCreateTextScreen (IN PCOORD Resolution, IN HANDLE PaletteHandle)
 
VOID VgaConsoleDestroyTextScreen (VOID)
 
VOID VgaConsoleRepaintScreen (PSMALL_RECT Rect)
 
BOOLEAN VgaConsoleInitialize (HANDLE TextHandle)
 
VOID VgaConsoleCleanup (VOID)
 

Variables

static CONSOLE_CURSOR_INFO OrgConsoleCursorInfo
 
static CONSOLE_SCREEN_BUFFER_INFO OrgConsoleBufferInfo
 
static HANDLE ScreenBufferHandle = NULL
 
static PVOID OldConsoleFramebuffer = NULL
 
static HANDLE TextConsoleBuffer = NULL
 
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
 
static COORD TextResolution = {0}
 
static HANDLE GraphicsConsoleBuffer = NULL
 static PCHAR_CELL TextFramebuffer = NULL; More...
 
static HANDLE ConsoleMutex = NULL
 static PVOID GraphicsFramebuffer = NULL; More...
 
static BOOLEAN DoubleWidth = FALSE
 
static BOOLEAN DoubleHeight = FALSE
 
static HANDLE StartEvent = NULL
 
static HANDLE EndEvent = NULL
 
static HANDLE AnotherEvent = NULL
 
static COORD VDMBufferSize = {0}
 
static PCHAR_CELL VDMBuffer = NULL
 
static PCHAR_INFO CharBuff = NULL
 

Function Documentation

◆ __InvalidateConsoleDIBits()

BOOL __InvalidateConsoleDIBits ( IN HANDLE  hConsoleOutput,
IN PSMALL_RECT  lpRect 
)

Definition at line 158 of file video.c.

160 {
161  if ((hConsoleOutput == TextConsoleBuffer) && (VDMBuffer != NULL))
162  {
163  /* HACK: Write the cached data to the console */
164 
165  COORD Origin = { lpRect->Left, lpRect->Top };
166  SHORT i, j;
167 
168  ASSERT(CharBuff);
169 
170  for (i = 0; i < VDMBufferSize.Y; i++)
171  {
172  for (j = 0; j < VDMBufferSize.X; j++)
173  {
176  }
177  }
178 
179  WriteConsoleOutputA(hConsoleOutput,
180  CharBuff,
182  Origin,
183  lpRect);
184  }
185 
186  return InvalidateConsoleDIBits(hConsoleOutput, lpRect);
187 }
BOOL WINAPI DECLSPEC_HOTPATCH WriteConsoleOutputA(IN HANDLE hConsoleOutput, IN CONST CHAR_INFO *lpBuffer, IN COORD dwBufferSize, IN COORD dwBufferCoord, IN OUT PSMALL_RECT lpWriteRegion)
Definition: readwrite.c:1592
static HANDLE TextConsoleBuffer
Definition: video.c:46
CHAR AsciiChar
Definition: wincon.h:170
BOOL WINAPI InvalidateConsoleDIBits(IN HANDLE hConsoleOutput, IN PSMALL_RECT lpRect)
Definition: console.c:756
static PCHAR_CELL VDMBuffer
Definition: video.c:89
BYTE Attributes
Definition: svga.h:393
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
short SHORT
Definition: pedump.c:59
smooth NULL
Definition: ftsmooth.c:416
static COORD VDMBufferSize
Definition: video.c:88
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
ULONG X
Definition: bl.h:1340
CHAR Char
Definition: svga.h:392
WORD Attributes
Definition: wincon.h:172
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
union _CHAR_INFO::@3150 Char
Definition: bl.h:1338
static PCHAR_INFO CharBuff
Definition: video.c:91
ULONG Y
Definition: bl.h:1341

Referenced by VgaConsoleRepaintScreen().

◆ __RegisterConsoleVDM()

BOOL WINAPI __RegisterConsoleVDM ( IN DWORD  dwRegisterFlags,
IN HANDLE  hStartHardwareEvent,
IN HANDLE  hEndHardwareEvent,
IN HANDLE  hErrorHardwareEvent,
IN DWORD  dwUnusedVar,
OUT LPDWORD  lpVideoStateLength,
OUT PVOID lpVideoState,
IN PVOID  lpUnusedBuffer,
IN DWORD  dwUnusedBufferLength,
IN COORD  dwVDMBufferSize,
OUT PVOID lpVDMBuffer 
)

Definition at line 97 of file video.c.

108 {
109  UNREFERENCED_PARAMETER(hErrorHardwareEvent);
110  UNREFERENCED_PARAMETER(dwUnusedVar);
111  UNREFERENCED_PARAMETER(lpVideoStateLength);
112  UNREFERENCED_PARAMETER(lpVideoState);
113  UNREFERENCED_PARAMETER(lpUnusedBuffer);
114  UNREFERENCED_PARAMETER(dwUnusedBufferLength);
115 
116  SetLastError(0);
117  DPRINT1("__RegisterConsoleVDM(%d)\n", dwRegisterFlags);
118 
119  if (lpVDMBuffer == NULL) return FALSE;
120 
121  if (dwRegisterFlags != 0)
122  {
123  // if (hStartHardwareEvent == NULL || hEndHardwareEvent == NULL) return FALSE;
124  if (VDMBuffer != NULL) return FALSE;
125 
126  VDMBufferSize = dwVDMBufferSize;
127 
128  /* HACK: Cache -- to be removed in the real implementation */
129  CharBuff = RtlAllocateHeap(RtlGetProcessHeap(),
132  * sizeof(*CharBuff));
133  ASSERT(CharBuff);
134 
135  VDMBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
138  * sizeof(*VDMBuffer));
139  *lpVDMBuffer = VDMBuffer;
140  return (VDMBuffer != NULL);
141  }
142  else
143  {
144  /* HACK: Cache -- to be removed in the real implementation */
145  if (CharBuff) RtlFreeHeap(RtlGetProcessHeap(), 0, CharBuff);
146  CharBuff = NULL;
147 
148  if (VDMBuffer) RtlFreeHeap(RtlGetProcessHeap(), 0, VDMBuffer);
149  VDMBuffer = NULL;
150 
152 
153  return TRUE;
154  }
155 }
#define TRUE
Definition: types.h:120
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
static PCHAR_CELL VDMBuffer
Definition: video.c:89
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
smooth NULL
Definition: ftsmooth.c:416
static COORD VDMBufferSize
Definition: video.c:88
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
ULONG X
Definition: bl.h:1340
#define SetLastError(x)
Definition: compat.h:409
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
static PCHAR_INFO CharBuff
Definition: video.c:91
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
#define DPRINT1
Definition: precomp.h:8
ULONG Y
Definition: bl.h:1341

Referenced by AttachToConsoleInternal(), and DetachFromConsoleInternal().

◆ AttachToConsoleInternal()

static BOOL AttachToConsoleInternal ( PCOORD  Resolution)
static

Definition at line 304 of file video.c.

305 {
306  BOOL Success;
307  ULONG Length = 0;
309 
310 #ifdef USE_REAL_REGISTERCONSOLEVDM
312 #endif
313  SHORT i, j;
314  DWORD AddressSize, ScanlineSize;
315  DWORD Address = 0;
316  DWORD CurrentAddr;
317  SMALL_RECT ConRect;
318  COORD Origin = { 0, 0 };
319 
321 
323 
324  /*
325  * Windows 2k3 winsrv.dll calls NtVdmControl(VdmQueryVdmProcess == 14, &ConsoleHandle);
326  * in the two following APIs:
327  * SrvRegisterConsoleVDM (corresponding Win32 API: RegisterConsoleVDM)
328  * SrvVDMConsoleOperation (corresponding Win32 API: VDMConsoleOperation)
329  * to check whether the current process is a VDM process, and fails otherwise
330  * with the error 0xC0000022 (STATUS_ACCESS_DENIED).
331  *
332  * It is worth it to notice that also basesrv.dll does the same only for the
333  * BaseSrvIsFirstVDM API...
334  */
335 
336  /* Register with the console server */
337  Success =
339  StartEvent,
340  EndEvent,
341  AnotherEvent, // NULL,
342  0,
343  &Length, // NULL, <-- putting this (and null in the next var) makes the API returning error 12 "ERROR_INVALID_ACCESS"
344  (PVOID*)&State, // NULL,
345  NULL,
346  0,
349  if (!Success)
350  {
351  DisplayMessage(L"RegisterConsoleVDM failed with error %d\n", GetLastError());
353  return FALSE;
354  }
355 
356 #ifdef USE_REAL_REGISTERCONSOLEVDM
357  CharBuff = RtlAllocateHeap(RtlGetProcessHeap(),
360  * sizeof(*CharBuff));
361  ASSERT(CharBuff);
362 #endif
363 
364  /* Resize the console */
366 
367  /* Update the saved console information */
369 
370  /*
371  * Copy console data into VGA memory
372  */
373 
374  /* Read the data from the console into the framebuffer... */
375  ConRect.Left = ConRect.Top = 0;
376  ConRect.Right = TextResolution.X;
377  ConRect.Bottom = TextResolution.Y;
378 
380  CharBuff,
382  Origin,
383  &ConRect);
384 
385  /* ... and copy the framebuffer into the VGA memory */
386  AddressSize = VgaGetAddressSize();
387  ScanlineSize = (DWORD)VgaCrtcRegisters[VGA_CRTC_OFFSET_REG] * 2;
388 
389  /* Loop through the scanlines */
390  for (i = 0; i < TextResolution.Y; i++)
391  {
392  /* Loop through the characters */
393  for (j = 0; j < TextResolution.X; j++)
394  {
395  CurrentAddr = LOWORD((Address + j) * AddressSize);
396 
397  /* Store the character in plane 0 */
399 
400  /* Store the attribute in plane 1 */
401  VgaMemory[CurrentAddr * VGA_NUM_BANKS + 1] = (BYTE)CharBuff[i * TextResolution.X + j].Attributes;
402  }
403 
404  /* Move to the next scanline */
405  Address += ScanlineSize;
406  }
407 
408 #ifdef USE_REAL_REGISTERCONSOLEVDM
409  if (CharBuff) RtlFreeHeap(RtlGetProcessHeap(), 0, CharBuff);
410 #endif
411 
413 
414  return TRUE;
415 }
#define TRUE
Definition: types.h:120
static HANDLE TextConsoleBuffer
Definition: video.c:46
CHAR AsciiChar
Definition: wincon.h:170
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:606
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
static COORD TextResolution
Definition: video.c:48
static HANDLE AnotherEvent
Definition: video.c:71
static HANDLE StartEvent
Definition: video.c:69
#define DWORD
Definition: nt_native.h:44
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
static VOID ResizeTextConsole(PCOORD Resolution, PSMALL_RECT WindowSize OPTIONAL)
Definition: video.c:203
unsigned int BOOL
Definition: ntddk_ex.h:94
short SHORT
Definition: pedump.c:59
BOOL WINAPI DECLSPEC_HOTPATCH ReadConsoleOutputA(IN HANDLE hConsoleOutput, OUT PCHAR_INFO lpBuffer, IN COORD dwBufferSize, IN COORD dwBufferCoord, IN OUT PSMALL_RECT lpReadRegion)
Definition: readwrite.c:1361
smooth NULL
Definition: ftsmooth.c:416
static WCHAR Address[46]
Definition: ping.c:68
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:544
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
SHORT Left
Definition: blue.h:25
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:588
ULONG X
Definition: bl.h:1340
static HANDLE EndEvent
Definition: video.c:70
SHORT Bottom
Definition: blue.h:28
static DWORD VgaGetAddressSize(VOID)
WORD Attributes
Definition: wincon.h:172
unsigned long DWORD
Definition: ntddk_ex.h:95
static PCHAR_CELL TextFramebuffer
Definition: svga.c:224
SHORT Top
Definition: blue.h:26
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
union _CHAR_INFO::@3150 Char
#define VGA_NUM_BANKS
Definition: svga.h:14
static const WCHAR L[]
Definition: oid.c:1250
static VOID UpdateCursorPosition(VOID)
Definition: video.c:290
unsigned char BYTE
Definition: mem.h:68
VOID EmulatorTerminate(VOID)
Definition: emulator.c:503
Definition: bl.h:1338
enum State_ State
Definition: pofuncs.h:54
static PCHAR_INFO CharBuff
Definition: video.c:91
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
Definition: video.c:47
#define HEAP_ZERO_MEMORY
Definition: compat.h:123
static BYTE VgaCrtcRegisters[SVGA_CRTC_MAX_REG]
Definition: svga.c:255
static BYTE Resolution
Definition: mouse.c:35
BOOL WINAPI __RegisterConsoleVDM(IN DWORD dwRegisterFlags, IN HANDLE hStartHardwareEvent, IN HANDLE hEndHardwareEvent, IN HANDLE hErrorHardwareEvent, IN DWORD dwUnusedVar, OUT LPDWORD lpVideoStateLength, OUT PVOID *lpVideoState, IN PVOID lpUnusedBuffer, IN DWORD dwUnusedBufferLength, IN COORD dwVDMBufferSize, OUT PVOID *lpVDMBuffer)
Definition: video.c:97
unsigned int ULONG
Definition: retypes.h:1
SHORT Right
Definition: blue.h:27
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
ULONG Y
Definition: bl.h:1341
#define LOWORD(l)
Definition: pedump.c:82
static BYTE VgaMemory[VGA_NUM_BANKS *SVGA_BANK_SIZE]
Definition: svga.c:244

Referenced by VgaAttachToConsole(), and VgaConsoleCreateTextScreen().

◆ DetachFromConsoleInternal()

static VOID DetachFromConsoleInternal ( VOID  )
static

Definition at line 417 of file video.c.

418 {
419  ULONG dummyLength;
420  PVOID dummyPtr;
421  COORD dummySize = {0};
422 
423  /* Deregister with the console server */
425  NULL,
426  NULL,
427  NULL,
428  0,
429  &dummyLength,
430  &dummyPtr,
431  NULL,
432  0,
433  dummySize,
434  &dummyPtr);
435 
437 }
smooth NULL
Definition: ftsmooth.c:416
static PCHAR_CELL TextFramebuffer
Definition: svga.c:224
Definition: bl.h:1338
BOOL WINAPI __RegisterConsoleVDM(IN DWORD dwRegisterFlags, IN HANDLE hStartHardwareEvent, IN HANDLE hEndHardwareEvent, IN HANDLE hErrorHardwareEvent, IN DWORD dwUnusedVar, OUT LPDWORD lpVideoStateLength, OUT PVOID *lpVideoState, IN PVOID lpUnusedBuffer, IN DWORD dwUnusedBufferLength, IN COORD dwVDMBufferSize, OUT PVOID *lpVDMBuffer)
Definition: video.c:97
unsigned int ULONG
Definition: retypes.h:1

Referenced by VgaConsoleCreateTextScreen(), and VgaDetachFromConsole().

◆ ResizeTextConsole()

static VOID ResizeTextConsole ( PCOORD  Resolution,
PSMALL_RECT WindowSize  OPTIONAL 
)
static

Definition at line 203 of file video.c.

204 {
205  BOOL Success;
206  SMALL_RECT ConRect;
207  SHORT oldWidth, oldHeight;
208 
209  /*
210  * Use this trick to effectively resize the console buffer and window,
211  * because:
212  * - SetConsoleScreenBufferSize fails if the new console screen buffer size
213  * is smaller than the current console window size, and:
214  * - SetConsoleWindowInfo fails if the new console window size is larger
215  * than the current console screen buffer size.
216  */
217 
218 
219  /* Retrieve the latest console information */
221 
224 
225  /*
226  * If the current console window is too large to hold the full contents
227  * of the new screen buffer, resize it first.
228  */
229  if (oldWidth > Resolution->X || oldHeight > Resolution->Y)
230  {
231  //
232  // NOTE: This is not a problem if we move the window back to (0,0)
233  // because when we resize the screen buffer, the window will move back
234  // to where the cursor is. Or, if the screen buffer is not resized,
235  // when we readjust again the window, we will move back to a correct
236  // position. This is what we wanted after all...
237  //
238 
239  ConRect.Left = ConRect.Top = 0;
240  ConRect.Right = ConRect.Left + min(oldWidth , Resolution->X) - 1;
241  ConRect.Bottom = ConRect.Top + min(oldHeight, Resolution->Y) - 1;
242 
244  if (!Success) DPRINT1("(resize) SetConsoleWindowInfo(1) failed with error %d\n", GetLastError());
245  }
246 
247  /* Resize the screen buffer if needed */
249  {
250  /*
251  * SetConsoleScreenBufferSize automatically takes into account the current
252  * cursor position when it computes starting which row it should copy text
253  * when resizing the sceenbuffer, and scrolls the console window such that
254  * the cursor is placed in it again. We therefore do not need to care about
255  * the cursor position and do the maths ourselves.
256  */
258  if (!Success) DPRINT1("(resize) SetConsoleScreenBufferSize failed with error %d\n", GetLastError());
259 
260  /*
261  * Setting a new screen buffer size can change other information,
262  * so update the saved console information.
263  */
265  }
266 
267  if (!WindowSize)
268  {
269  ConRect.Left = 0;
270  ConRect.Right = ConRect.Left + Resolution->X - 1;
271  ConRect.Bottom = max(ConsoleInfo.dwCursorPosition.Y, Resolution->Y - 1);
272  ConRect.Top = ConRect.Bottom - Resolution->Y + 1;
273 
274  // NOTE: We may take ConsoleInfo.dwMaximumWindowSize into account
275  }
276  else
277  {
278  ConRect.Left = ConRect.Top = 0;
279  ConRect.Right = ConRect.Left + WindowSize->Right - WindowSize->Left;
280  ConRect.Bottom = ConRect.Top + WindowSize->Bottom - WindowSize->Top ;
281  }
282 
284  if (!Success) DPRINT1("(resize) SetConsoleWindowInfo(2) failed with error %d\n", GetLastError());
285 
286  /* Update the saved console information */
288 }
#define max(a, b)
Definition: svc.c:63
#define TRUE
Definition: types.h:120
static HANDLE TextConsoleBuffer
Definition: video.c:46
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleScreenBufferSize(HANDLE hConsoleOutput, COORD dwSize)
Definition: console.c:1857
unsigned int BOOL
Definition: ntddk_ex.h:94
short SHORT
Definition: pedump.c:59
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:544
SHORT Left
Definition: blue.h:25
ULONG X
Definition: bl.h:1340
SHORT Bottom
Definition: blue.h:28
SHORT Top
Definition: blue.h:26
_In_ ULONGLONG _In_ ULONGLONG _In_ BOOLEAN _In_opt_ ULONG WindowSize
Definition: ntddpcm.h:140
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
Definition: video.c:47
#define min(a, b)
Definition: monoChain.cc:55
#define DPRINT1
Definition: precomp.h:8
static BYTE Resolution
Definition: mouse.c:35
SHORT Right
Definition: blue.h:27
BOOL WINAPI SetConsoleWindowInfo(HANDLE hConsoleOutput, BOOL bAbsolute, CONST SMALL_RECT *lpConsoleWindow)
Definition: console.c:1972
ULONG Y
Definition: bl.h:1341

Referenced by AttachToConsoleInternal(), ScreenEventHandler(), and VgaDetachFromConsole().

◆ ScreenEventHandler()

VOID ScreenEventHandler ( PWINDOW_BUFFER_SIZE_RECORD  ScreenEvent)

Definition at line 448 of file video.c.

449 {
450  /*
451  * This function monitors and allows console resizings only if they are triggered by us.
452  * User-driven resizings via the console properties, or programmatical console resizings
453  * made by explicit calls to SetConsoleScreenBufferSize by external applications, are forbidden.
454  * In that case only a console window resize is done in case the size is reduced.
455  * This protection is enabled in CONSRV side when NTVDM registers as a VDM to CONSRV,
456  * but we also implement it there in case we are running in STANDALONE mode without
457  * CONSRV registration.
458  *
459  * The only potential problem we have is that, when this handler is called,
460  * the console is already resized. In case this corresponds to a forbidden resize,
461  * we resize the console back to its original size from inside the handler.
462  * This will trigger a recursive call to the handler, that should be detected.
463  */
464 
465  if (CurrResolution.X == ScreenEvent->dwSize.X &&
466  CurrResolution.Y == ScreenEvent->dwSize.Y)
467  {
468  /* Allowed resize, we are OK */
469  return;
470  }
471 
472  DPRINT1("ScreenEventHandler - Detected forbidden resize! Reset console screenbuffer size back to (X = %d ; Y = %d)\n", CurrResolution.X, CurrResolution.Y);
473 
474  // FIXME: If we're detaching, then stop monitoring for changes!!
475 
476  /* Restore the original console size */
478 
479  /* Force refresh of all the screen */
480  NeedsUpdate = TRUE;
481  UpdateRectangle.Left = 0;
482  UpdateRectangle.Top = 0;
486 }
#define TRUE
Definition: types.h:120
static COORD CurrResolution
Definition: svga.c:296
static VOID ResizeTextConsole(PCOORD Resolution, PSMALL_RECT WindowSize OPTIONAL)
Definition: video.c:203
static SMALL_RECT UpdateRectangle
Definition: svga.c:298
smooth NULL
Definition: ftsmooth.c:416
SHORT Left
Definition: blue.h:25
ULONG X
Definition: bl.h:1340
SHORT Bottom
Definition: blue.h:28
VOID VgaRefreshDisplay(VOID)
Definition: svga.c:1783
SHORT Top
Definition: blue.h:26
#define DPRINT1
Definition: precomp.h:8
SHORT Right
Definition: blue.h:27
ULONG Y
Definition: bl.h:1341
static BOOLEAN NeedsUpdate
Definition: svga.c:281

Referenced by ConsoleEventThread().

◆ SetActiveScreenBuffer()

static VOID SetActiveScreenBuffer ( HANDLE  ScreenBuffer)
static

Definition at line 439 of file video.c.

440 {
442 
443  /* Set the active buffer and reattach the VDM UI to it */
446 }
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleActiveScreenBuffer(HANDLE hConsoleOutput)
Definition: console.c:1801
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
VOID ConsoleReattach(HANDLE ConOutHandle)
Definition: console.c:435
HANDLE ScreenBuffer
Definition: notevil.c:37

Referenced by VgaAttachToConsole(), VgaConsoleCreateGraphicsScreen(), VgaConsoleCreateTextScreen(), VgaConsoleInitialize(), and VgaDetachFromConsole().

◆ UpdateCursorPosition()

static VOID UpdateCursorPosition ( VOID  )
static

Definition at line 290 of file video.c.

291 {
292  /*
293  * Update the cursor position in the VGA registers.
294  */
297 
300 
302 }
#define LOBYTE(W)
Definition: jmemdos.c:487
#define HIBYTE(W)
Definition: jmemdos.c:486
static COORD TextResolution
Definition: video.c:48
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
ULONG X
Definition: bl.h:1340
unsigned short WORD
Definition: ntddk_ex.h:93
static VOID VgaUpdateTextCursor(VOID)
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
Definition: video.c:47
static BYTE VgaCrtcRegisters[SVGA_CRTC_MAX_REG]
Definition: svga.c:255
ULONG Y
Definition: bl.h:1341

Referenced by AttachToConsoleInternal(), and VgaConsoleCreateTextScreen().

◆ VgaAttachToConsole()

BOOL VgaAttachToConsole ( VOID  )

Definition at line 496 of file video.c.

497 {
498  if (TextResolution.X == 0 || TextResolution.Y == 0)
499  DPRINT1("VgaAttachToConsole -- TextResolution uninitialized\n");
500 
501  if (TextResolution.X == 0) TextResolution.X = 80;
502  if (TextResolution.Y == 0) TextResolution.Y = 25;
503 
504  // DetachFromConsoleInternal();
505 
506  /*
507  * AttachToConsoleInternal sets TextResolution
508  * to the new resolution and updates ConsoleInfo.
509  */
511  {
512  DisplayMessage(L"An unexpected error occurred!\n");
514  return FALSE;
515  }
516 
517  /* Restore the original screen buffer */
520 
521  /* Restore the screen state */
522  if (ScreenMode == TEXT_MODE)
523  {
524  /* The text mode framebuffer was recreated */
526  }
527  else
528  {
529  /* The graphics mode framebuffer is unchanged */
531  }
533 
534  return TRUE;
535 }
#define TRUE
Definition: types.h:120
static PVOID ActiveFramebuffer
ConsoleFramebuffer.
Definition: svga.c:211
static COORD TextResolution
Definition: video.c:48
static PVOID OldConsoleFramebuffer
Definition: video.c:36
static BOOL AttachToConsoleInternal(PCOORD Resolution)
Definition: video.c:304
static SCREEN_MODE ScreenMode
Definition: svga.c:295
smooth NULL
Definition: ftsmooth.c:416
ULONG X
Definition: bl.h:1340
static HANDLE ScreenBufferHandle
Definition: video.c:35
static PCHAR_CELL TextFramebuffer
Definition: svga.c:224
static const WCHAR L[]
Definition: oid.c:1250
VOID EmulatorTerminate(VOID)
Definition: emulator.c:503
static VOID SetActiveScreenBuffer(HANDLE ScreenBuffer)
Definition: video.c:439
#define DPRINT1
Definition: precomp.h:8
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
ULONG Y
Definition: bl.h:1341

Referenced by VidBiosAttachToConsole().

◆ VgaConsoleCleanup()

VOID VgaConsoleCleanup ( VOID  )

Definition at line 807 of file video.c.

808 {
809  /* If the console video was not initialized, just return */
810  if (!TextConsoleBuffer)
811  return;
812 
814 
815  // TODO: We need to initialize those events before using them!
819 }
static HANDLE TextConsoleBuffer
Definition: video.c:46
#define CloseHandle
Definition: compat.h:398
VOID VgaDetachFromConsole(VOID)
Definition: video.c:537
static HANDLE AnotherEvent
Definition: video.c:71
static HANDLE StartEvent
Definition: video.c:69
static HANDLE EndEvent
Definition: video.c:70

Referenced by VgaCleanup().

◆ VgaConsoleCreateGraphicsScreen()

BOOL VgaConsoleCreateGraphicsScreen ( IN PCOORD  Resolution,
IN HANDLE  PaletteHandle 
)

Definition at line 610 of file video.c.

613 {
614  DWORD i;
615  CONSOLE_GRAPHICS_BUFFER_INFO GraphicsBufferInfo;
616  BYTE BitmapInfoBuffer[VGA_BITMAP_INFO_SIZE];
617  LPBITMAPINFO BitmapInfo = (LPBITMAPINFO)BitmapInfoBuffer;
618  LPWORD PaletteIndex = (LPWORD)(BitmapInfo->bmiColors);
619 
620  LONG Width = Resolution->X;
621  LONG Height = Resolution->Y;
622 
623  /* Use DoubleVision mode if the resolution is too small */
624  DoubleWidth = (Width < VGA_MINIMUM_WIDTH);
625  if (DoubleWidth) Width *= 2;
626  DoubleHeight = (Height < VGA_MINIMUM_HEIGHT);
627  if (DoubleHeight) Height *= 2;
628 
629  /* Fill the bitmap info header */
630  RtlZeroMemory(&BitmapInfo->bmiHeader, sizeof(BitmapInfo->bmiHeader));
631  BitmapInfo->bmiHeader.biSize = sizeof(BitmapInfo->bmiHeader);
632  BitmapInfo->bmiHeader.biWidth = Width;
633  BitmapInfo->bmiHeader.biHeight = Height;
634  BitmapInfo->bmiHeader.biBitCount = 8;
635  BitmapInfo->bmiHeader.biPlanes = 1;
636  BitmapInfo->bmiHeader.biCompression = BI_RGB;
637  BitmapInfo->bmiHeader.biSizeImage = Width * Height /* * 1 == biBitCount / 8 */;
638 
639  /* Fill the palette data */
640  for (i = 0; i < (VGA_PALETTE_SIZE / 3); i++) PaletteIndex[i] = (WORD)i;
641 
642  /* Fill the console graphics buffer info */
643  GraphicsBufferInfo.dwBitMapInfoLength = VGA_BITMAP_INFO_SIZE;
644  GraphicsBufferInfo.lpBitMapInfo = BitmapInfo;
645  GraphicsBufferInfo.dwUsage = DIB_PAL_COLORS;
646 
647  /* Create the buffer */
650  NULL,
652  &GraphicsBufferInfo);
654 
655  /* Save the framebuffer address and mutex */
656  // *GraphicsFramebuffer = GraphicsBufferInfo.lpBitMap;
657  GraphicsFramebuffer = GraphicsBufferInfo.lpBitMap;
658  ConsoleMutex = GraphicsBufferInfo.hMutex;
659 
660  /* Clear the framebuffer */
661  // RtlZeroMemory(*GraphicsFramebuffer, BitmapInfo->bmiHeader.biSizeImage);
663 
664  /* Set the graphics mode palette */
668 
669  /* Set the active buffer */
671 
672  return TRUE;
673 }
#define VGA_BITMAP_INFO_SIZE
Definition: svga.h:18
#define TRUE
Definition: types.h:120
BITMAPINFOHEADER bmiHeader
Definition: wingdi.h:1454
struct tagBITMAPINFO * LPBITMAPINFO
#define DIB_PAL_COLORS
Definition: wingdi.h:365
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
static HPALETTE PaletteHandle
Definition: svga.c:215
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
#define FILE_SHARE_READ
Definition: compat.h:125
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
long LONG
Definition: pedump.c:60
#define GENERIC_WRITE
Definition: nt_native.h:90
static PBYTE GraphicsFramebuffer
Definition: svga.c:229
DWORD biCompression
Definition: amvideo.idl:35
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI DECLSPEC_HOTPATCH SetConsolePalette(HANDLE hConsoleOutput, HPALETTE hPalette, UINT dwUsage)
Definition: console.c:1041
#define VGA_PALETTE_SIZE
Definition: svga.h:17
#define VGA_MINIMUM_HEIGHT
Definition: svga.h:20
static HANDLE GraphicsConsoleBuffer
static PCHAR_CELL TextFramebuffer = NULL;
Definition: video.c:54
RGBQUAD bmiColors[1]
Definition: wingdi.h:1455
#define SYSPAL_NOSTATIC256
Definition: wingdi.h:21
static BOOLEAN DoubleHeight
Definition: video.c:59
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD biSizeImage
Definition: amvideo.idl:36
#define VGA_MINIMUM_WIDTH
Definition: svga.h:19
static HANDLE ConsoleMutex
static PVOID GraphicsFramebuffer = NULL;
Definition: video.c:56
static BOOLEAN DoubleWidth
Definition: video.c:58
unsigned char BYTE
Definition: mem.h:68
#define GENERIC_READ
Definition: compat.h:124
static VOID SetActiveScreenBuffer(HANDLE ScreenBuffer)
Definition: video.c:439
uint16_t * LPWORD
Definition: typedefs.h:54
#define CONSOLE_GRAPHICS_BUFFER
Definition: wincon.h:60
static BYTE Resolution
Definition: mouse.c:35
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define BI_RGB
Definition: precomp.h:34
HANDLE WINAPI CreateConsoleScreenBuffer(DWORD dwDesiredAccess, DWORD dwShareMode, CONST SECURITY_ATTRIBUTES *lpSecurityAttributes, DWORD dwFlags, LPVOID lpScreenBufferData)
Definition: console.c:2315

Referenced by VgaEnterNewMode().

◆ VgaConsoleCreateTextScreen()

BOOL VgaConsoleCreateTextScreen ( IN PCOORD  Resolution,
IN HANDLE  PaletteHandle 
)

Definition at line 698 of file video.c.

701 {
702  /* Switch to the text buffer */
703  // FIXME: Wouldn't it be preferrable to switch to it AFTER we reset everything??
705 
706  /* Adjust the text framebuffer if we changed the resolution */
707  if (TextResolution.X != Resolution->X ||
709  {
711 
712  /*
713  * AttachToConsoleInternal sets TextResolution
714  * to the new resolution and updates ConsoleInfo.
715  */
717  {
718  DisplayMessage(L"An unexpected error occurred!\n");
720  return FALSE;
721  }
722  }
723  else
724  {
726  }
727 
728  /*
729  * Set the text mode palette.
730  *
731  * INFORMATION: This call should fail on Windows (and therefore
732  * we get the default palette and our external behaviour is
733  * just like Windows' one), but it should success on ReactOS
734  * (so that we get console palette changes even for text-mode
735  * screen buffers, which is a new feature on ReactOS).
736  */
740 
741  return TRUE;
742 }
#define TRUE
Definition: types.h:120
static HANDLE TextConsoleBuffer
Definition: video.c:46
static COORD TextResolution
Definition: video.c:48
static HPALETTE PaletteHandle
Definition: svga.c:215
static BOOL AttachToConsoleInternal(PCOORD Resolution)
Definition: video.c:304
BOOL WINAPI DECLSPEC_HOTPATCH SetConsolePalette(HANDLE hConsoleOutput, HPALETTE hPalette, UINT dwUsage)
Definition: console.c:1041
ULONG X
Definition: bl.h:1340
#define SYSPAL_NOSTATIC256
Definition: wingdi.h:21
static VOID DetachFromConsoleInternal(VOID)
Definition: video.c:417
static const WCHAR L[]
Definition: oid.c:1250
static VOID UpdateCursorPosition(VOID)
Definition: video.c:290
VOID EmulatorTerminate(VOID)
Definition: emulator.c:503
static VOID SetActiveScreenBuffer(HANDLE ScreenBuffer)
Definition: video.c:439
static BYTE Resolution
Definition: mouse.c:35
void DisplayMessage(BOOL bConsole, BOOL bSilent, LPCTSTR lpMessage, LPCTSTR lpTitle, UINT uType)
Definition: regsvr32.c:239
ULONG Y
Definition: bl.h:1341

Referenced by VgaEnterNewMode().

◆ VgaConsoleDestroyGraphicsScreen()

VOID VgaConsoleDestroyGraphicsScreen ( VOID  )

Definition at line 675 of file video.c.

676 {
677  /* Release the console framebuffer mutex */
679 
680  /* Switch back to the default console text buffer */
681  // SetActiveScreenBuffer(TextConsoleBuffer);
682 
683  /* Cleanup the video data */
685  ConsoleMutex = NULL;
686  // GraphicsFramebuffer = NULL;
689 
690  // /* Reset the active framebuffer */
691  // ActiveFramebuffer = NULL;
692 
693  DoubleWidth = FALSE;
695 }
#define CloseHandle
Definition: compat.h:398
smooth NULL
Definition: ftsmooth.c:416
static HANDLE GraphicsConsoleBuffer
static PCHAR_CELL TextFramebuffer = NULL;
Definition: video.c:54
static BOOLEAN DoubleHeight
Definition: video.c:59
static HANDLE ConsoleMutex
static PVOID GraphicsFramebuffer = NULL;
Definition: video.c:56
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:564
static BOOLEAN DoubleWidth
Definition: video.c:58

Referenced by VgaLeaveCurrentMode().

◆ VgaConsoleDestroyTextScreen()

VOID VgaConsoleDestroyTextScreen ( VOID  )

Definition at line 744 of file video.c.

745 {
746 }

Referenced by VgaLeaveCurrentMode().

◆ VgaConsoleInitialize()

BOOLEAN VgaConsoleInitialize ( HANDLE  TextHandle)

Definition at line 783 of file video.c.

784 {
785  /*
786  * Initialize the console video by saving the default
787  * text-mode console output handle, if it is valid.
788  */
789  if (!IsConsoleHandle(TextHandle)) return FALSE;
790  TextConsoleBuffer = TextHandle;
791 
792  /* Save the original cursor and console screen buffer information */
795  {
797  return FALSE;
798  }
800 
801  /* Switch to the text buffer, but do not enter into a text mode */
803 
804  return TRUE;
805 }
#define TRUE
Definition: types.h:120
static HANDLE TextConsoleBuffer
Definition: video.c:46
static CONSOLE_SCREEN_BUFFER_INFO OrgConsoleBufferInfo
Definition: video.c:32
smooth NULL
Definition: ftsmooth.c:416
BOOL WINAPI GetConsoleScreenBufferInfo(IN HANDLE hConsoleOutput, OUT PCONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo)
Definition: console.c:544
static CONSOLE_CURSOR_INFO OrgConsoleCursorInfo
Definition: video.c:31
#define IsConsoleHandle(h)
Definition: console.h:14
BOOL WINAPI GetConsoleCursorInfo(HANDLE hConsoleOutput, PCONSOLE_CURSOR_INFO lpConsoleCursorInfo)
Definition: console.c:1704
static VOID SetActiveScreenBuffer(HANDLE ScreenBuffer)
Definition: video.c:439
static CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo
Definition: video.c:47

Referenced by VgaInitialize().

◆ VgaConsoleRepaintScreen()

VOID VgaConsoleRepaintScreen ( PSMALL_RECT  Rect)

Definition at line 750 of file video.c.

751 {
752  HANDLE ConsoleBufferHandle = NULL;
754 
755  /* Check if we are in text or graphics mode */
756  if (ScreenMode == GRAPHICS_MODE)
757  {
758  /* Graphics mode */
759  ConsoleBufferHandle = GraphicsConsoleBuffer;
760 
761  /* In DoubleVision mode, scale the update rectangle */
762  if (DoubleWidth)
763  {
764  UpdateRectangle.Left *= 2;
766  }
767  if (DoubleHeight)
768  {
769  UpdateRectangle.Top *= 2;
771  }
772  }
773  else
774  {
775  /* Text mode */
776  ConsoleBufferHandle = TextConsoleBuffer;
777  }
778 
779  /* Redraw the screen */
780  __InvalidateConsoleDIBits(ConsoleBufferHandle, &UpdateRectangle);
781 }
static HANDLE TextConsoleBuffer
Definition: video.c:46
BOOL __InvalidateConsoleDIBits(IN HANDLE hConsoleOutput, IN PSMALL_RECT lpRect)
Definition: video.c:158
static SCREEN_MODE ScreenMode
Definition: svga.c:295
static SMALL_RECT UpdateRectangle
Definition: svga.c:298
smooth NULL
Definition: ftsmooth.c:416
SHORT Left
Definition: blue.h:25
static HANDLE GraphicsConsoleBuffer
static PCHAR_CELL TextFramebuffer = NULL;
Definition: video.c:54
SHORT Bottom
Definition: blue.h:28
static BOOLEAN DoubleHeight
Definition: video.c:59
SHORT Top
Definition: blue.h:26
static BOOLEAN DoubleWidth
Definition: video.c:58
SHORT Right
Definition: blue.h:27
struct Rect Rect

Referenced by VgaVerticalRetrace().

◆ VgaConsoleUpdateTextCursor()

VOID VgaConsoleUpdateTextCursor ( BOOL  CursorVisible,
BYTE  CursorStart,
BYTE  CursorEnd,
BYTE  TextSize,
DWORD  ScanlineSize,
WORD  Location 
)

Definition at line 575 of file video.c.

581 {
582  COORD Position;
583  CONSOLE_CURSOR_INFO CursorInfo;
584 
585  if (CursorStart < CursorEnd)
586  {
587  /* Visible cursor */
588  CursorInfo.bVisible = CursorVisible;
589  CursorInfo.dwSize = (100 * (CursorEnd - CursorStart)) / TextSize;
590  }
591  else
592  {
593  /* Hidden cursor */
594  CursorInfo.bVisible = FALSE;
595  CursorInfo.dwSize = 1; // The size needs to be non-zero for SetConsoleCursorInfo to succeed.
596  }
597 
598  /* Find the coordinates of the new position */
599  Position.X = (SHORT)(Location % ScanlineSize);
600  Position.Y = (SHORT)(Location / ScanlineSize);
601 
602  DPRINT("VgaConsoleUpdateTextCursor: (X = %d ; Y = %d)\n", Position.X, Position.Y);
603 
604  /* Update the physical cursor */
607 }
static HANDLE TextConsoleBuffer
Definition: video.c:46
static COORD Position
Definition: mouse.c:34
short SHORT
Definition: pedump.c:59
BOOL WINAPI SetConsoleCursorPosition(IN HANDLE hConsoleOutput, IN COORD dwCursorPosition)
Definition: console.c:590
void DPRINT(...)
Definition: polytest.cpp:61
ULONG X
Definition: bl.h:1340
BOOLEAN bVisible
Definition: blue.h:41
BOOL WINAPI SetConsoleCursorInfo(IN HANDLE hConsoleOutput, IN const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
Definition: console.c:567
Definition: bl.h:1338
ULONG Y
Definition: bl.h:1341

Referenced by VgaUpdateTextCursor().

◆ VgaDetachFromConsole()

VOID VgaDetachFromConsole ( VOID  )
  • Update the physical cursor */

Definition at line 537 of file video.c.

538 {
540 
541  /* Save the screen state */
542  if (ScreenMode == TEXT_MODE)
544  else
546 
547  /* Reset the active framebuffer */
550 
551  /* Restore the original console size */
553 
554  /* Restore the original cursor shape */
556 
557  // FIXME: Should we copy back the screen data to the screen buffer??
558  // WriteConsoleOutputA(...);
559 
560  // FIXME: Should we change cursor POSITION??
561  // VgaUpdateTextCursor();
562 
564  //SetConsoleCursorInfo(TextConsoleBuffer, &CursorInfo);
565  //SetConsoleCursorPosition(TextConsoleBuffer, Position /*OrgConsoleBufferInfo.dwCursorPosition*/);
566 
567  /* Restore the old text-mode screen buffer */
569 }
static HANDLE TextConsoleBuffer
Definition: video.c:46
static PVOID ActiveFramebuffer
ConsoleFramebuffer.
Definition: svga.c:211
static CONSOLE_SCREEN_BUFFER_INFO OrgConsoleBufferInfo
Definition: video.c:32
static PVOID OldConsoleFramebuffer
Definition: video.c:36
static SCREEN_MODE ScreenMode
Definition: svga.c:295
static VOID ResizeTextConsole(PCOORD Resolution, PSMALL_RECT WindowSize OPTIONAL)
Definition: video.c:203
smooth NULL
Definition: ftsmooth.c:416
static CONSOLE_CURSOR_INFO OrgConsoleCursorInfo
Definition: video.c:31
static HANDLE GraphicsConsoleBuffer
static PCHAR_CELL TextFramebuffer = NULL;
Definition: video.c:54
BOOL WINAPI SetConsoleCursorInfo(IN HANDLE hConsoleOutput, IN const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo)
Definition: console.c:567
static HANDLE ScreenBufferHandle
Definition: video.c:35
static VOID DetachFromConsoleInternal(VOID)
Definition: video.c:417
static VOID SetActiveScreenBuffer(HANDLE ScreenBuffer)
Definition: video.c:439

Referenced by VgaConsoleCleanup(), and VidBiosDetachFromConsole().

◆ VgaGetAddressSize()

static DWORD VgaGetAddressSize ( VOID  )
inlinestatic

Referenced by AttachToConsoleInternal().

◆ VgaGetDoubleVisionState()

BOOLEAN VgaGetDoubleVisionState ( PBOOLEAN  Horizontal,
PBOOLEAN  Vertical 
)

Definition at line 488 of file video.c.

489 {
490  if (GraphicsConsoleBuffer == NULL) return FALSE;
491  if (Horizontal) *Horizontal = DoubleWidth;
492  if (Vertical) *Vertical = DoubleHeight;
493  return TRUE;
494 }
#define TRUE
Definition: types.h:120
smooth NULL
Definition: ftsmooth.c:416
static HANDLE GraphicsConsoleBuffer
static PCHAR_CELL TextFramebuffer = NULL;
Definition: video.c:54
static BOOLEAN DoubleHeight
Definition: video.c:59
static BOOLEAN DoubleWidth
Definition: video.c:58

Referenced by DosMouseService(), DosUpdatePosition(), FromMouseCoordinates(), MouseEventHandler(), and ToMouseCoordinates().

◆ VgaUpdateTextCursor()

static VOID VgaUpdateTextCursor ( VOID  )
static

Referenced by UpdateCursorPosition().

Variable Documentation

◆ AnotherEvent

HANDLE AnotherEvent = NULL
static

Definition at line 71 of file video.c.

Referenced by AttachToConsoleInternal(), and VgaConsoleCleanup().

◆ CharBuff

PCHAR_INFO CharBuff = NULL
static

◆ ConsoleInfo

◆ ConsoleMutex

HANDLE ConsoleMutex = NULL
static

static PVOID GraphicsFramebuffer = NULL;

Definition at line 56 of file video.c.

Referenced by VgaConsoleCreateGraphicsScreen(), VgaConsoleDestroyGraphicsScreen(), and VgaUpdateFramebuffer().

◆ DoubleHeight

◆ DoubleWidth

◆ EndEvent

HANDLE EndEvent = NULL
static

Definition at line 70 of file video.c.

Referenced by AttachToConsoleInternal(), and VgaConsoleCleanup().

◆ GraphicsConsoleBuffer

HANDLE GraphicsConsoleBuffer = NULL
static

static PCHAR_CELL TextFramebuffer = NULL;

Definition at line 54 of file video.c.

Referenced by VgaConsoleCreateGraphicsScreen(), VgaConsoleDestroyGraphicsScreen(), VgaConsoleRepaintScreen(), VgaDetachFromConsole(), and VgaGetDoubleVisionState().

◆ OldConsoleFramebuffer

PVOID OldConsoleFramebuffer = NULL
static

Definition at line 36 of file video.c.

Referenced by VgaAttachToConsole(), and VgaDetachFromConsole().

◆ OrgConsoleBufferInfo

CONSOLE_SCREEN_BUFFER_INFO OrgConsoleBufferInfo
static

Definition at line 32 of file video.c.

Referenced by VgaConsoleInitialize(), and VgaDetachFromConsole().

◆ OrgConsoleCursorInfo

CONSOLE_CURSOR_INFO OrgConsoleCursorInfo
static

HACK!! HACK!!

Definition at line 31 of file video.c.

Referenced by VgaConsoleInitialize(), and VgaDetachFromConsole().

◆ ScreenBufferHandle

HANDLE ScreenBufferHandle = NULL
static

Definition at line 35 of file video.c.

Referenced by VgaAttachToConsole(), and VgaDetachFromConsole().

◆ StartEvent

HANDLE StartEvent = NULL
static

Definition at line 69 of file video.c.

Referenced by AttachToConsoleInternal(), and VgaConsoleCleanup().

◆ TextConsoleBuffer

◆ TextResolution

COORD TextResolution = {0}
static

◆ VDMBuffer

PCHAR_CELL VDMBuffer = NULL
static

Definition at line 89 of file video.c.

Referenced by __InvalidateConsoleDIBits(), and __RegisterConsoleVDM().

◆ VDMBufferSize

COORD VDMBufferSize = {0}
static

Definition at line 88 of file video.c.

Referenced by __InvalidateConsoleDIBits(), and __RegisterConsoleVDM().