diff --git a/reactos/subsystems/ntvdm/hardware/vga.c b/reactos/subsystems/ntvdm/hardware/vga.c index 4593a5d5188..a175c37faae 100644 --- a/reactos/subsystems/ntvdm/hardware/vga.c +++ b/reactos/subsystems/ntvdm/hardware/vga.c @@ -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 -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 */