[NTVDM]: Add a compile-time-defined switch to be able to use the RegisterConsoleVDM API of ReactOS/Windows, or an emulated one.

svn path=/trunk/; revision=63844
This commit is contained in:
Hermès Bélusca-Maïto 2014-08-09 13:22:50 +00:00
parent 3a6aa828e4
commit f9a6eb7bc4

View file

@ -21,6 +21,12 @@
static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 };
static CONST DWORD MemoryLimit[] = { 0xAFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF };
/*
* Activate this line if you want to use the real
* RegisterConsoleVDM API of Windows/ReactOS.
*/
// #define USE_REAL_REGISTERCONSOLEVDM
#define USE_REACTOS_COLORS
// #define USE_DOSBOX_COLORS
@ -288,44 +294,12 @@ static SMALL_RECT UpdateRectangle = { 0, 0, 0, 0 };
#include <ntddvdeo.h>
typedef
BOOL
(WINAPI *pRegisterConsoleVDM)
(
BOOL IsDosVDM_flag,
HANDLE EventHandle_1,
HANDLE EventHandle_2,
HANDLE EventHandle_3,
int Unused1,
PVOID returned_val_1,
PVOID *returned_val_2,
PVOID lpUnknownBuffer,
DWORD theUnknownBufferLength,
COORD theVDMBufferSize,
PCHAR *lpVDMBuffer
);
#ifdef USE_REAL_REGISTERCONSOLEVDM
#if 0
BOOL
WINAPI
RegisterConsoleVDM
(
BOOL IsDosVDM_flag,
HANDLE EventHandle_1,
HANDLE EventHandle_2,
HANDLE EventHandle_3,
int Unused1,
PVOID returned_val_1,
PVOID *returned_val_2,
PVOID lpUnknownBuffer,
DWORD theUnknownBufferLength,
COORD theVDMBufferSize,
PVOID *lpVDMBuffer
);
#define __RegisterConsoleVDM RegisterConsoleVDM
#define __InvalidateConsoleDIBits InvalidateConsoleDIBits
HMODULE hKernel32 = NULL;
pRegisterConsoleVDM RegisterConsoleVDM = NULL;
#endif
#else
/*
* This private buffer, per-console, is used by
@ -340,49 +314,49 @@ static PCHAR_INFO CharBuff = NULL; // This is a hack, which is unneeded
BOOL
WINAPI
__RegisterConsoleVDM(BOOL IsDosVDM_flag,
HANDLE EventHandle_1,
HANDLE EventHandle_2,
HANDLE EventHandle_3,
int Unused1,
PVOID returned_val_1,
PVOID *returned_val_2,
PVOID lpUnknownBuffer,
DWORD theUnknownBufferLength,
COORD theVDMBufferSize,
PCHAR *lpVDMBuffer)
__RegisterConsoleVDM(IN DWORD dwDosVDMFlag,
IN HANDLE hEventHandle1,
IN HANDLE hEventHandle2,
IN HANDLE hEventHandle3,
IN DWORD Unused1,
OUT PULONG returned_val_1,
OUT PVOID* returned_val_2,
IN PVOID lpUnknownBuffer,
IN DWORD dwUnknownBufferLength,
IN COORD dwVDMBufferSize,
OUT PVOID* lpVDMBuffer)
{
UNREFERENCED_PARAMETER(EventHandle_3);
UNREFERENCED_PARAMETER(hEventHandle3);
UNREFERENCED_PARAMETER(Unused1);
UNREFERENCED_PARAMETER(returned_val_1);
UNREFERENCED_PARAMETER(returned_val_2);
UNREFERENCED_PARAMETER(lpUnknownBuffer);
UNREFERENCED_PARAMETER(theUnknownBufferLength);
UNREFERENCED_PARAMETER(dwUnknownBufferLength);
SetLastError(0);
DPRINT1("__RegisterConsoleVDM(%d)\n", IsDosVDM_flag);
DPRINT1("__RegisterConsoleVDM(%d)\n", dwDosVDMFlag);
if (lpVDMBuffer == NULL) return FALSE;
if (IsDosVDM_flag)
if (dwDosVDMFlag != 0)
{
// if (EventHandle_1 == NULL || EventHandle_2 == NULL) return FALSE;
if (VDMBuffer != NULL) return FALSE;
VDMBufferSize = theVDMBufferSize;
VDMBufferSize = dwVDMBufferSize;
/* HACK: Cache -- to be removed in the real implementation */
CharBuff = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
theVDMBufferSize.X * theVDMBufferSize.Y
* sizeof(CHAR_INFO));
VDMBufferSize.X * VDMBufferSize.Y
* sizeof(CHAR_INFO));
ASSERT(CharBuff);
VDMBuffer = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
theVDMBufferSize.X * theVDMBufferSize.Y
* sizeof(CHAR_CELL));
*lpVDMBuffer = (PCHAR)VDMBuffer;
VDMBufferSize.X * VDMBufferSize.Y
* sizeof(CHAR_CELL));
*lpVDMBuffer = VDMBuffer;
return (VDMBuffer != NULL);
}
else
@ -432,6 +406,8 @@ __InvalidateConsoleDIBits(IN HANDLE hConsoleOutput,
return InvalidateConsoleDIBits(hConsoleOutput, lpRect);
}
#endif
/* PRIVATE FUNCTIONS **********************************************************/
static inline DWORD VgaGetAddressSize(VOID);
@ -458,6 +434,9 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution)
ULONG Length = 0;
PVIDEO_HARDWARE_STATE_HEADER State;
#ifdef USE_REAL_REGISTERCONSOLEVDM
PCHAR_INFO CharBuff = NULL;
#endif
SHORT i, j;
DWORD AddressSize, ScanlineSize;
DWORD Address = 0;
@ -492,7 +471,7 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution)
NULL,
0,
TextResolution,
(PCHAR*)&TextFramebuffer);
(PVOID*)&TextFramebuffer);
if (!Success)
{
DisplayMessage(L"RegisterConsoleVDM failed with error %d\n", GetLastError());
@ -500,6 +479,14 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution)
return FALSE;
}
#ifdef USE_REAL_REGISTERCONSOLEVDM
CharBuff = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY,
TextResolution.X * TextResolution.Y
* sizeof(CHAR_INFO));
ASSERT(CharBuff);
#endif
/*
* Resize the console
*/
@ -560,6 +547,10 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution)
Address += ScanlineSize;
}
#ifdef USE_REAL_REGISTERCONSOLEVDM
if (CharBuff) HeapFree(GetProcessHeap(), 0, CharBuff);
#endif
VgaUpdateCursorPosition();
return TRUE;
@ -1950,7 +1941,7 @@ VOID VgaDetachFromConsole(BOOL ChangingMode)
NULL,
0,
dummySize,
(PCHAR*)&dummyPtr);
&dummyPtr);
TextFramebuffer = NULL;
@ -2039,11 +2030,6 @@ VOID VgaCleanup(VOID)
CloseHandle(AnotherEvent);
CloseHandle(EndEvent);
CloseHandle(StartEvent);
#if 0
RegisterConsoleVDM = NULL;
FreeLibrary(hKernel32);
#endif
}
/* EOF */