From b0555a50040a3a7777868df1328a6f4c15a885af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 28 Sep 2014 16:27:30 +0000 Subject: [PATCH] [NTVDM] - Add the possibility to dump the VM memory either in text or binary mode. - Initialize the VM memory to 0xFF to track potential memory misuses (diagnostics purposes). Things may crash, or not! svn path=/trunk/; revision=64367 --- reactos/subsystems/ntvdm/emulator.c | 82 +++++++++++++++++--------- reactos/subsystems/ntvdm/emulator.h | 2 +- reactos/subsystems/ntvdm/lang/cs-CZ.rc | 5 +- reactos/subsystems/ntvdm/lang/de-DE.rc | 5 +- reactos/subsystems/ntvdm/lang/en-US.rc | 5 +- reactos/subsystems/ntvdm/lang/es-ES.rc | 5 +- reactos/subsystems/ntvdm/lang/fr-FR.rc | 5 +- reactos/subsystems/ntvdm/lang/it-IT.rc | 5 +- reactos/subsystems/ntvdm/lang/pl-PL.rc | 5 +- reactos/subsystems/ntvdm/lang/ro-RO.rc | 4 +- reactos/subsystems/ntvdm/lang/ru-RU.rc | 5 +- reactos/subsystems/ntvdm/ntvdm.c | 13 ++-- reactos/subsystems/ntvdm/resource.h | 10 ++-- 13 files changed, 98 insertions(+), 53 deletions(-) diff --git a/reactos/subsystems/ntvdm/emulator.c b/reactos/subsystems/ntvdm/emulator.c index ff01f259810..21a0644b985 100644 --- a/reactos/subsystems/ntvdm/emulator.c +++ b/reactos/subsystems/ntvdm/emulator.c @@ -430,13 +430,22 @@ static VOID EnableExtraHardware(HANDLE ConsoleInput) /* PUBLIC FUNCTIONS ***********************************************************/ -VOID DumpMemory(VOID) +static VOID +DumpMemoryRaw(HANDLE hFile) { - static ULONG DumpNumber = 0; + PVOID Buffer; + SIZE_T Size; - HANDLE hFile; - WCHAR FileName[MAX_PATH]; + /* Dump the VM memory */ + SetFilePointer(hFile, 0, NULL, FILE_BEGIN); + Buffer = REAL_TO_PHYS(NULL); + Size = MAX_ADDRESS - (ULONG_PTR)(NULL); + WriteFile(hFile, Buffer, Size, &Size, NULL); +} +static VOID +DumpMemoryTxt(HANDLE hFile) +{ #define LINE_SIZE 75 + 2 ULONG i; PBYTE Ptr1, Ptr2; @@ -444,28 +453,6 @@ VOID DumpMemory(VOID) PCHAR Line; SIZE_T LineSize; - /* Build a suitable file name */ - _snwprintf(FileName, MAX_PATH, L"memdump%lu.txt", DumpNumber); - ++DumpNumber; - - DPRINT1("Creating memory dump file '%S'...\n", FileName); - - /* Always create the dump file */ - hFile = CreateFileW(FileName, - GENERIC_WRITE, - 0, - NULL, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (hFile == INVALID_HANDLE_VALUE) - { - DPRINT1("Error when creating '%S' for memory dumping, GetLastError() = %u\n", - FileName, GetLastError()); - return; - } - /* Dump the VM memory */ SetFilePointer(hFile, 0, NULL, FILE_BEGIN); Ptr1 = Ptr2 = REAL_TO_PHYS(NULL); @@ -507,6 +494,45 @@ VOID DumpMemory(VOID) LineSize = Line - LineBuffer; WriteFile(hFile, LineBuffer, LineSize, &LineSize, NULL); } +} + +VOID DumpMemory(BOOLEAN TextFormat) +{ + static ULONG DumpNumber = 0; + + HANDLE hFile; + WCHAR FileName[MAX_PATH]; + + /* Build a suitable file name */ + _snwprintf(FileName, MAX_PATH, + L"memdump%lu.%s", + DumpNumber, + TextFormat ? L"txt" : L"dat"); + ++DumpNumber; + + DPRINT1("Creating memory dump file '%S'...\n", FileName); + + /* Always create the dump file */ + hFile = CreateFileW(FileName, + GENERIC_WRITE, + 0, + NULL, + CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (hFile == INVALID_HANDLE_VALUE) + { + DPRINT1("Error when creating '%S' for memory dumping, GetLastError() = %u\n", + FileName, GetLastError()); + return; + } + + /* Dump the VM memory in the chosen format */ + if (TextFormat) + DumpMemoryTxt(hFile); + else + DumpMemoryRaw(hFile); /* Close the file */ CloseHandle(hFile); @@ -517,12 +543,14 @@ VOID DumpMemory(VOID) BOOLEAN EmulatorInitialize(HANDLE ConsoleInput, HANDLE ConsoleOutput) { /* Allocate memory for the 16-bit address space */ - BaseAddress = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, MAX_ADDRESS); + BaseAddress = HeapAlloc(GetProcessHeap(), /*HEAP_ZERO_MEMORY*/ 0, MAX_ADDRESS); if (BaseAddress == NULL) { wprintf(L"FATAL: Failed to allocate VDM memory.\n"); return FALSE; } + // For diagnostics purposes!! + FillMemory(BaseAddress, MAX_ADDRESS, 0xFF); /* Initialize I/O ports */ /* Initialize RAM */ diff --git a/reactos/subsystems/ntvdm/emulator.h b/reactos/subsystems/ntvdm/emulator.h index 38450ecbd0e..b405c00355e 100644 --- a/reactos/subsystems/ntvdm/emulator.h +++ b/reactos/subsystems/ntvdm/emulator.h @@ -98,7 +98,7 @@ extern BOOLEAN VdmRunning; /* FUNCTIONS ******************************************************************/ -VOID DumpMemory(VOID); +VOID DumpMemory(BOOLEAN TextFormat); VOID WINAPI EmulatorReadMemory ( diff --git a/reactos/subsystems/ntvdm/lang/cs-CZ.rc b/reactos/subsystems/ntvdm/lang/cs-CZ.rc index 20d62ec5197..1e6df31eb8d 100644 --- a/reactos/subsystems/ntvdm/lang/cs-CZ.rc +++ b/reactos/subsystems/ntvdm/lang/cs-CZ.rc @@ -15,6 +15,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Dump &Memory" - IDS_VDM_QUIT , "&Ukončit ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "&Ukončit ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/de-DE.rc b/reactos/subsystems/ntvdm/lang/de-DE.rc index b6ee81afa1b..7ea43b3133d 100644 --- a/reactos/subsystems/ntvdm/lang/de-DE.rc +++ b/reactos/subsystems/ntvdm/lang/de-DE.rc @@ -9,6 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Dump &Memory" - IDS_VDM_QUIT , "ReactOS VDM b&eenden" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "ReactOS VDM b&eenden" END diff --git a/reactos/subsystems/ntvdm/lang/en-US.rc b/reactos/subsystems/ntvdm/lang/en-US.rc index a6373b8e908..518cb883265 100644 --- a/reactos/subsystems/ntvdm/lang/en-US.rc +++ b/reactos/subsystems/ntvdm/lang/en-US.rc @@ -9,6 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Dump &Memory" - IDS_VDM_QUIT , "&Quit the ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "&Quit the ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/es-ES.rc b/reactos/subsystems/ntvdm/lang/es-ES.rc index 00f69091b92..becd7c30daf 100644 --- a/reactos/subsystems/ntvdm/lang/es-ES.rc +++ b/reactos/subsystems/ntvdm/lang/es-ES.rc @@ -9,6 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Dump &Memory" - IDS_VDM_QUIT , "&Salir de ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "&Salir de ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/fr-FR.rc b/reactos/subsystems/ntvdm/lang/fr-FR.rc index 01a1d525f16..39f708b0980 100644 --- a/reactos/subsystems/ntvdm/lang/fr-FR.rc +++ b/reactos/subsystems/ntvdm/lang/fr-FR.rc @@ -9,6 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Vidage &Mémoire" - IDS_VDM_QUIT , "&Quitter la ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Vidage Mémoire (&Texte)" + IDS_VDM_DUMPMEM_BIN, "Vidage Mémoire (&Binaire)" + IDS_VDM_QUIT , "&Quitter la ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/it-IT.rc b/reactos/subsystems/ntvdm/lang/it-IT.rc index 9bce376dbac..800a8dbdfee 100644 --- a/reactos/subsystems/ntvdm/lang/it-IT.rc +++ b/reactos/subsystems/ntvdm/lang/it-IT.rc @@ -9,6 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Dump &Memory" - IDS_VDM_QUIT , "&Esci da ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "&Esci da ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/pl-PL.rc b/reactos/subsystems/ntvdm/lang/pl-PL.rc index ab931ef77bc..d393fbb848a 100644 --- a/reactos/subsystems/ntvdm/lang/pl-PL.rc +++ b/reactos/subsystems/ntvdm/lang/pl-PL.rc @@ -11,6 +11,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Zrzut &Pamięci" - IDS_VDM_QUIT , "&Wyjdź z ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "&Wyjdź z ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/ro-RO.rc b/reactos/subsystems/ntvdm/lang/ro-RO.rc index 80da090cd21..8212934b524 100644 --- a/reactos/subsystems/ntvdm/lang/ro-RO.rc +++ b/reactos/subsystems/ntvdm/lang/ro-RO.rc @@ -9,5 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_QUIT, "I&eșire din ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "I&eșire din ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/lang/ru-RU.rc b/reactos/subsystems/ntvdm/lang/ru-RU.rc index 404bc9fe4cc..813d972cdc1 100644 --- a/reactos/subsystems/ntvdm/lang/ru-RU.rc +++ b/reactos/subsystems/ntvdm/lang/ru-RU.rc @@ -9,6 +9,7 @@ END STRINGTABLE BEGIN - IDS_VDM_DUMPMEM, "Дамп &памяти" - IDS_VDM_QUIT , "&Выйти из ReactOS VDM" + IDS_VDM_DUMPMEM_TXT, "Dump Memory (&Text)" + IDS_VDM_DUMPMEM_BIN, "Dump Memory (&Binary)" + IDS_VDM_QUIT , "&Выйти из ReactOS VDM" END diff --git a/reactos/subsystems/ntvdm/ntvdm.c b/reactos/subsystems/ntvdm/ntvdm.c index 42ed45b7ebe..ecdaa7d2f5e 100644 --- a/reactos/subsystems/ntvdm/ntvdm.c +++ b/reactos/subsystems/ntvdm/ntvdm.c @@ -51,8 +51,9 @@ typedef struct _VDM_MENUITEM static const VDM_MENUITEM VdmMenuItems[] = { - { IDS_VDM_DUMPMEM, NULL, ID_VDM_DUMPMEM }, - { IDS_VDM_QUIT , NULL, ID_VDM_QUIT }, + { IDS_VDM_DUMPMEM_TXT, NULL, ID_VDM_DUMPMEM_TXT }, + { IDS_VDM_DUMPMEM_BIN, NULL, ID_VDM_DUMPMEM_BIN }, + { IDS_VDM_QUIT , NULL, ID_VDM_QUIT }, { 0, NULL, 0 } /* End of list */ }; @@ -337,8 +338,12 @@ VOID MenuEventHandler(PMENU_EVENT_RECORD MenuEvent) ShowPointer = !ShowPointer; break; - case ID_VDM_DUMPMEM: - DumpMemory(); + case ID_VDM_DUMPMEM_TXT: + DumpMemory(TRUE); + break; + + case ID_VDM_DUMPMEM_BIN: + DumpMemory(FALSE); break; case ID_VDM_QUIT: diff --git a/reactos/subsystems/ntvdm/resource.h b/reactos/subsystems/ntvdm/resource.h index 2534ff9b80d..b635cf971e6 100644 --- a/reactos/subsystems/ntvdm/resource.h +++ b/reactos/subsystems/ntvdm/resource.h @@ -2,16 +2,18 @@ /* Menu IDs */ #define ID_SHOWHIDE_MOUSE 1000 -#define ID_VDM_DUMPMEM 1001 -#define ID_VDM_QUIT 1002 +#define ID_VDM_DUMPMEM_TXT 1001 +#define ID_VDM_DUMPMEM_BIN 1002 +#define ID_VDM_QUIT 1003 /* String IDs */ #define IDS_HIDE_MOUSE 100 #define IDS_SHOW_MOUSE 101 #define IDS_VDM_MENU 102 -#define IDS_VDM_DUMPMEM 200 -#define IDS_VDM_QUIT 201 +#define IDS_VDM_DUMPMEM_TXT 200 +#define IDS_VDM_DUMPMEM_BIN 201 +#define IDS_VDM_QUIT 202 /* Icon */ #define IDI_APPICON 1