[NTVDM]: Use variable-length buffers in DisplayMessage, in case we display a very long message (uses the _vscwprintf CRT function, not available on Win2k. You need to recompile NTVDM with WIN2K_COMPLIANT define if you want to be able to run it on win2k. In that case DisplayMessage uses a quite large enough buffer for its needs). If somebody knows an alternative to _vscwprintf that does the very same job, and which exists on Win2k, I would be happy to use it instead.

svn path=/trunk/; revision=65336
This commit is contained in:
Hermès Bélusca-Maïto 2014-11-09 01:46:31 +00:00
parent 0a21e7b198
commit a36ff01e00

View file

@ -185,13 +185,48 @@ static VOID ShowHideMousePointer(HANDLE ConOutHandle, BOOLEAN ShowPtr)
VOID VOID
DisplayMessage(LPCWSTR Format, ...) DisplayMessage(LPCWSTR Format, ...)
{ {
WCHAR Buffer[256]; #ifndef WIN2K_COMPLIANT
WCHAR StaticBuffer[256];
LPWSTR Buffer = StaticBuffer; // Use the static buffer by default.
#else
WCHAR Buffer[2048]; // Large enough. If not, increase it by hand.
#endif
size_t MsgLen;
va_list Parameters; va_list Parameters;
va_start(Parameters, Format); va_start(Parameters, Format);
_vsnwprintf(Buffer, 256, Format, Parameters);
#ifndef WIN2K_COMPLIANT
/*
* Retrieve the message length and if it is too long, allocate
* an auxiliary buffer; otherwise use the static buffer.
*/
MsgLen = _vscwprintf(Format, Parameters) + 1; // NULL-terminated
if (MsgLen > sizeof(StaticBuffer)/sizeof(StaticBuffer[0]))
{
Buffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MsgLen * sizeof(WCHAR));
if (Buffer == NULL)
{
/* Allocation failed, use the static buffer and display a suitable error message */
Buffer = StaticBuffer;
Format = L"DisplayMessage()\nOriginal message is too long and allocating an auxiliary buffer failed.";
MsgLen = wcslen(Format);
}
}
#else
MsgLen = sizeof(Buffer)/sizeof(Buffer[0]);
#endif
/* Display the message */
_vsnwprintf(Buffer, MsgLen, Format, Parameters);
DPRINT1("\n\nNTVDM Subsystem\n%S\n\n", Buffer); DPRINT1("\n\nNTVDM Subsystem\n%S\n\n", Buffer);
MessageBoxW(NULL, Buffer, L"NTVDM Subsystem", MB_OK); MessageBoxW(NULL, Buffer, L"NTVDM Subsystem", MB_OK);
#ifndef WIN2K_COMPLIANT
/* Free the buffer if needed */
if (Buffer != StaticBuffer) HeapFree(GetProcessHeap(), 0, Buffer);
#endif
va_end(Parameters); va_end(Parameters);
} }
@ -205,8 +240,8 @@ ConsoleCtrlHandler(DWORD ControlType)
case CTRL_BREAK_EVENT: case CTRL_BREAK_EVENT:
{ {
/* HACK: Stop the VDM */ /* HACK: Stop the VDM */
DPRINT1("Ctrl-C/Break: Stop the VDM\n");
EmulatorTerminate(); EmulatorTerminate();
break; break;
} }
case CTRL_LAST_CLOSE_EVENT: case CTRL_LAST_CLOSE_EVENT: