From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- tools/winedump/main.c | 4 +- tools/winedump/minidump.c | 707 +++++++++++++++++++------------------- 2 files changed, 363 insertions(+), 348 deletions(-)
diff --git a/tools/winedump/main.c b/tools/winedump/main.c index 969b70d7d03..91f6b48baf2 100644 --- a/tools/winedump/main.c +++ b/tools/winedump/main.c @@ -228,7 +228,9 @@ static const struct my_option option_table[] = { " for NE: export, resource\n" " for PE: import, export, debug, resource, tls, loadcfg, clr, reloc, dynreloc, except, apiset\n" " for PDB: PDB, TPI, DBI, IPI, public, image\n" - " and suboptions: hash (PDB, TPI, TPI, DBI, public) and line (DBI)"}, + " and suboptions: hash (PDB, TPI, TPI, DBI, public) and line (DBI)\n" + " for minidump: exception, handle, info, memory, module, thread\n" + " and suboptions: content (memory, module, thread)\n"}, {"-t", DUMP, 0, do_symtable, "-t Dump symbol table"}, {"-x", DUMP, 0, do_dumpall, "-x Dump everything"}, {"sym", DMGL, 0, do_demangle, "sym <sym> Demangle C++ symbol <sym> and exit"}, diff --git a/tools/winedump/minidump.c b/tools/winedump/minidump.c index e93241ec1d0..e6faa7da5c1 100644 --- a/tools/winedump/minidump.c +++ b/tools/winedump/minidump.c @@ -85,234 +85,243 @@ void mdmp_dump(void) switch (dir->StreamType) { case ThreadListStream: - { - const MINIDUMP_THREAD_LIST *mtl = stream; - const MINIDUMP_THREAD *mt = mtl->Threads; - - printf("Threads: %u\n", (UINT)mtl->NumberOfThreads); - for (i = 0; i < mtl->NumberOfThreads; i++, mt++) + if (globals_dump_sect("thread")) { - printf("Thread: #%d\n", i); - printf(" ThreadId: %u\n", mt->ThreadId); - printf(" SuspendCount: %u\n", mt->SuspendCount); - printf(" PriorityClass: %u\n", mt->PriorityClass); - printf(" Priority: %u\n", mt->Priority); - printf(" Teb: %s\n", get_hexint64_str(mt->Teb)); - printf(" Stack: %s +%#x\n", get_hexint64_str(mt->Stack.StartOfMemoryRange), mt->Stack.Memory.DataSize); - dump_mdmp_data(&mt->Stack.Memory, " "); - printf(" ThreadContext:\n"); - dump_mdmp_data(&mt->ThreadContext, " "); + const MINIDUMP_THREAD_LIST *mtl = stream; + const MINIDUMP_THREAD *mt = mtl->Threads; + + printf("Threads: %u\n", (UINT)mtl->NumberOfThreads); + for (i = 0; i < mtl->NumberOfThreads; i++, mt++) + { + printf("Thread: #%d\n", i); + printf(" ThreadId: %u\n", mt->ThreadId); + printf(" SuspendCount: %u\n", mt->SuspendCount); + printf(" PriorityClass: %u\n", mt->PriorityClass); + printf(" Priority: %u\n", mt->Priority); + printf(" Teb: %s\n", get_hexint64_str(mt->Teb)); + printf(" Stack: %s +%#x\n", get_hexint64_str(mt->Stack.StartOfMemoryRange), mt->Stack.Memory.DataSize); + if (globals_dump_sect("content")) + dump_mdmp_data(&mt->Stack.Memory, " "); + printf(" ThreadContext:\n"); + dump_mdmp_data(&mt->ThreadContext, " "); + } } - } - break; + break; case ModuleListStream: case 0xFFF0: - { - const MINIDUMP_MODULE_LIST *mml = stream; - const MINIDUMP_MODULE* mm = mml->Modules; - const char* p1; - const char* p2; - - printf("Modules (%s): %u\n", - dir->StreamType == ModuleListStream ? "PE" : "ELF", - mml->NumberOfModules); - for (i = 0; i < mml->NumberOfModules; i++, mm++) + if (globals_dump_sect("module")) { - printf(" Module #%d:\n", i); - printf(" BaseOfImage: %s\n", get_hexint64_str(mm->BaseOfImage)); - printf(" SizeOfImage: %#x (%u)\n", mm->SizeOfImage, mm->SizeOfImage); - printf(" CheckSum: %#x (%u)\n", mm->CheckSum, mm->CheckSum); - printf(" TimeDateStamp: %s\n", get_time_str(mm->TimeDateStamp)); - printf(" ModuleName: %s\n", get_mdmp_str(mm->ModuleNameRva)); - printf(" VersionInfo:\n"); - printf(" dwSignature: %x\n", (UINT)mm->VersionInfo.dwSignature); - printf(" dwStrucVersion: %x\n", (UINT)mm->VersionInfo.dwStrucVersion); - printf(" dwFileVersion: %d,%d,%d,%d\n", - HIWORD(mm->VersionInfo.dwFileVersionMS), - LOWORD(mm->VersionInfo.dwFileVersionMS), - HIWORD(mm->VersionInfo.dwFileVersionLS), - LOWORD(mm->VersionInfo.dwFileVersionLS)); - printf(" dwProductVersion %d,%d,%d,%d\n", - HIWORD(mm->VersionInfo.dwProductVersionMS), - LOWORD(mm->VersionInfo.dwProductVersionMS), - HIWORD(mm->VersionInfo.dwProductVersionLS), - LOWORD(mm->VersionInfo.dwProductVersionLS)); - printf(" dwFileFlagsMask: %x\n", (UINT)mm->VersionInfo.dwFileFlagsMask); - printf(" dwFileFlags: %s%s%s%s%s%s\n", - mm->VersionInfo.dwFileFlags & VS_FF_DEBUG ? "Debug " : "", - mm->VersionInfo.dwFileFlags & VS_FF_INFOINFERRED ? "Inferred " : "", - mm->VersionInfo.dwFileFlags & VS_FF_PATCHED ? "Patched " : "", - mm->VersionInfo.dwFileFlags & VS_FF_PRERELEASE ? "PreRelease " : "", - mm->VersionInfo.dwFileFlags & VS_FF_PRIVATEBUILD ? "PrivateBuild " : "", - mm->VersionInfo.dwFileFlags & VS_FF_SPECIALBUILD ? "SpecialBuild " : ""); - if (mm->VersionInfo.dwFileOS) + const MINIDUMP_MODULE_LIST *mml = stream; + const MINIDUMP_MODULE* mm = mml->Modules; + const char* p1; + const char* p2; + + printf("Modules (%s): %u\n", + dir->StreamType == ModuleListStream ? "PE" : "ELF", + mml->NumberOfModules); + for (i = 0; i < mml->NumberOfModules; i++, mm++) { - switch (mm->VersionInfo.dwFileOS & 0x000F) + printf(" Module #%d:\n", i); + printf(" BaseOfImage: %s\n", get_hexint64_str(mm->BaseOfImage)); + printf(" SizeOfImage: %#x (%u)\n", mm->SizeOfImage, mm->SizeOfImage); + printf(" CheckSum: %#x (%u)\n", mm->CheckSum, mm->CheckSum); + printf(" TimeDateStamp: %s\n", get_time_str(mm->TimeDateStamp)); + printf(" ModuleName: %s\n", get_mdmp_str(mm->ModuleNameRva)); + printf(" VersionInfo:\n"); + printf(" dwSignature: %x\n", (UINT)mm->VersionInfo.dwSignature); + printf(" dwStrucVersion: %x\n", (UINT)mm->VersionInfo.dwStrucVersion); + printf(" dwFileVersion: %d,%d,%d,%d\n", + HIWORD(mm->VersionInfo.dwFileVersionMS), + LOWORD(mm->VersionInfo.dwFileVersionMS), + HIWORD(mm->VersionInfo.dwFileVersionLS), + LOWORD(mm->VersionInfo.dwFileVersionLS)); + printf(" dwProductVersion %d,%d,%d,%d\n", + HIWORD(mm->VersionInfo.dwProductVersionMS), + LOWORD(mm->VersionInfo.dwProductVersionMS), + HIWORD(mm->VersionInfo.dwProductVersionLS), + LOWORD(mm->VersionInfo.dwProductVersionLS)); + printf(" dwFileFlagsMask: %x\n", (UINT)mm->VersionInfo.dwFileFlagsMask); + printf(" dwFileFlags: %s%s%s%s%s%s\n", + mm->VersionInfo.dwFileFlags & VS_FF_DEBUG ? "Debug " : "", + mm->VersionInfo.dwFileFlags & VS_FF_INFOINFERRED ? "Inferred " : "", + mm->VersionInfo.dwFileFlags & VS_FF_PATCHED ? "Patched " : "", + mm->VersionInfo.dwFileFlags & VS_FF_PRERELEASE ? "PreRelease " : "", + mm->VersionInfo.dwFileFlags & VS_FF_PRIVATEBUILD ? "PrivateBuild " : "", + mm->VersionInfo.dwFileFlags & VS_FF_SPECIALBUILD ? "SpecialBuild " : ""); + if (mm->VersionInfo.dwFileOS) { - case VOS__BASE: p1 = "_base"; break; - case VOS__WINDOWS16:p1 = "16 bit Windows"; break; - case VOS__PM16: p1 = "16 bit Presentation Manager"; break; - case VOS__PM32: p1 = "32 bit Presentation Manager"; break; - case VOS__WINDOWS32:p1 = "32 bit Windows"; break; - default: p1 = "---"; break; + switch (mm->VersionInfo.dwFileOS & 0x000F) + { + case VOS__BASE: p1 = "_base"; break; + case VOS__WINDOWS16:p1 = "16 bit Windows"; break; + case VOS__PM16: p1 = "16 bit Presentation Manager"; break; + case VOS__PM32: p1 = "32 bit Presentation Manager"; break; + case VOS__WINDOWS32:p1 = "32 bit Windows"; break; + default: p1 = "---"; break; + } + switch (mm->VersionInfo.dwFileOS & 0xF0000) + { + case VOS_UNKNOWN: p2 = "unknown"; break; + case VOS_DOS: p2 = "DOS"; break; + case VOS_OS216: p2 = "16 bit OS/2"; break; + case VOS_OS232: p2 = "32 bit OS/2"; break; + case VOS_NT: p2 = "Windows NT"; break; + default: p2 = "---"; break; + } + printf(" dwFileOS: %s running on %s\n", p1, p2); } - switch (mm->VersionInfo.dwFileOS & 0xF0000) + else printf(" dwFileOS: 0\n"); + switch (mm->VersionInfo.dwFileType) { - case VOS_UNKNOWN: p2 = "unknown"; break; - case VOS_DOS: p2 = "DOS"; break; - case VOS_OS216: p2 = "16 bit OS/2"; break; - case VOS_OS232: p2 = "32 bit OS/2"; break; - case VOS_NT: p2 = "Windows NT"; break; - default: p2 = "---"; break; + case VFT_UNKNOWN: p1 = "Unknown"; break; + case VFT_APP: p1 = "Application"; break; + case VFT_DLL: p1 = "DLL"; break; + case VFT_DRV: p1 = "Driver"; break; + case VFT_FONT: p1 = "Font"; break; + case VFT_VXD: p1 = "VxD"; break; + case VFT_STATIC_LIB: p1 = "Static Library"; break; + default: p1 = "---"; break; } - printf(" dwFileOS: %s running on %s\n", p1, p2); - } - else printf(" dwFileOS: 0\n"); - switch (mm->VersionInfo.dwFileType) - { - case VFT_UNKNOWN: p1 = "Unknown"; break; - case VFT_APP: p1 = "Application"; break; - case VFT_DLL: p1 = "DLL"; break; - case VFT_DRV: p1 = "Driver"; break; - case VFT_FONT: p1 = "Font"; break; - case VFT_VXD: p1 = "VxD"; break; - case VFT_STATIC_LIB: p1 = "Static Library"; break; - default: p1 = "---"; break; + printf(" dwFileType: %s\n", p1); + printf(" dwFileSubtype: %u\n", (UINT)mm->VersionInfo.dwFileSubtype); + printf(" dwFileDate: %x%08x\n", + (UINT)mm->VersionInfo.dwFileDateMS, (UINT)mm->VersionInfo.dwFileDateLS); + printf(" CvRecord: <%u>\n", (UINT)mm->CvRecord.DataSize); + if (globals_dump_sect("content")) + dump_mdmp_data(&mm->CvRecord, " "); + printf(" MiscRecord: <%u>\n", (UINT)mm->MiscRecord.DataSize); + if (globals_dump_sect("content")) + dump_mdmp_data(&mm->MiscRecord, " "); + printf(" Reserved0: %s\n", get_hexint64_str(mm->Reserved0)); + printf(" Reserved1: %s\n", get_hexint64_str(mm->Reserved1)); } - printf(" dwFileType: %s\n", p1); - printf(" dwFileSubtype: %u\n", (UINT)mm->VersionInfo.dwFileSubtype); - printf(" dwFileDate: %x%08x\n", - (UINT)mm->VersionInfo.dwFileDateMS, (UINT)mm->VersionInfo.dwFileDateLS); - printf(" CvRecord: <%u>\n", (UINT)mm->CvRecord.DataSize); - dump_mdmp_data(&mm->CvRecord, " "); - printf(" MiscRecord: <%u>\n", (UINT)mm->MiscRecord.DataSize); - dump_mdmp_data(&mm->MiscRecord, " "); - printf(" Reserved0: %s\n", get_hexint64_str(mm->Reserved0)); - printf(" Reserved1: %s\n", get_hexint64_str(mm->Reserved1)); } - } - break; + break; case MemoryListStream: - { - const MINIDUMP_MEMORY_LIST *mml = stream; - const MINIDUMP_MEMORY_DESCRIPTOR* mmd = mml->MemoryRanges; - - printf("Memory Ranges: %u\n", mml->NumberOfMemoryRanges); - for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++) + if (globals_dump_sect("memory")) { - printf(" Memory Range #%d:\n", i); - printf(" Range: %s +%#x\n", get_hexint64_str(mmd->StartOfMemoryRange), mmd->Memory.DataSize); - dump_mdmp_data(&mmd->Memory, " "); - } - } - break; - case SystemInfoStream: - { - const MINIDUMP_SYSTEM_INFO *msi = stream; - const char* str; - char tmp[128]; + const MINIDUMP_MEMORY_LIST *mml = stream; + const MINIDUMP_MEMORY_DESCRIPTOR* mmd = mml->MemoryRanges;
- printf("System Information:\n"); - switch (msi->ProcessorArchitecture) - { - case PROCESSOR_ARCHITECTURE_UNKNOWN: - str = "Unknown"; - break; - case PROCESSOR_ARCHITECTURE_INTEL: - strcpy(tmp, "Intel "); - switch (msi->ProcessorLevel) + printf("Memory Ranges: %u\n", mml->NumberOfMemoryRanges); + for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++) { - case 3: str = "80386"; break; - case 4: str = "80486"; break; - case 5: str = "Pentium"; break; - case 6: str = "Pentium Pro/II or AMD Athlon"; break; - case 15: str = "Pentium 4 or AMD Athlon64"; break; - default: str = "???"; break; + printf(" Memory Range #%d:\n", i); + dump_mdmp_data(&mmd->Memory, " "); + printf(" Range: %s +%#x\n", get_hexint64_str(mmd->StartOfMemoryRange), mmd->Memory.DataSize); + if (globals_dump_sect("content")) + dump_mdmp_data(&mmd->Memory, " "); } - strcat(tmp, str); - strcat(tmp, " ("); - if (msi->ProcessorLevel == 3 || msi->ProcessorLevel == 4) - { - if (HIBYTE(msi->ProcessorRevision) == 0xFF) - sprintf(tmp + strlen(tmp), "%c%d", 'A' + ((msi->ProcessorRevision>>4)&0xf)-0x0a, msi->ProcessorRevision&0xf); - else - sprintf(tmp + strlen(tmp), "%c%d", 'A' + HIBYTE(msi->ProcessorRevision), LOBYTE(msi->ProcessorRevision)); - } - else sprintf(tmp + strlen(tmp), "%d.%d", HIBYTE(msi->ProcessorRevision), LOBYTE(msi->ProcessorRevision)); - str = tmp; - break; - case PROCESSOR_ARCHITECTURE_MIPS: - str = "Mips"; - break; - case PROCESSOR_ARCHITECTURE_ALPHA: - str = "Alpha"; - break; - case PROCESSOR_ARCHITECTURE_PPC: - str = "PowerPC"; - break; - case PROCESSOR_ARCHITECTURE_ARM: - str = "ARM"; - break; - case PROCESSOR_ARCHITECTURE_ARM64: - str = "ARM64"; - break; - case PROCESSOR_ARCHITECTURE_AMD64: - str = "X86_64"; - break; - case PROCESSOR_ARCHITECTURE_MSIL: - str = "MSIL"; - break; - case PROCESSOR_ARCHITECTURE_NEUTRAL: - str = "Neutral"; - break; - default: - str = "???"; - break; } - printf(" Processor: %s (#%d CPUs)\n", str, msi->NumberOfProcessors); - switch (msi->MajorVersion) + break; + case SystemInfoStream: + if (globals_dump_sect("info")) { - case 3: - switch (msi->MinorVersion) - { - case 51: str = "NT 3.51"; break; - default: str = "3-????"; break; - } - break; - case 4: - switch (msi->MinorVersion) - { - case 0: str = (msi->PlatformId == VER_PLATFORM_WIN32_NT) ? "NT 4.0" : "95"; break; - case 10: str = "98"; break; - case 90: str = "ME"; break; - default: str = "4-????"; break; - } - break; - case 5: - switch (msi->MinorVersion) + const MINIDUMP_SYSTEM_INFO *msi = stream; + const char* str; + char tmp[128]; + + printf("System Information:\n"); + switch (msi->ProcessorArchitecture) { - case 0: str = "2000"; break; - case 1: str = "XP"; break; - case 2: - if (msi->ProductType == 1) str = "XP"; - else if (msi->ProductType == 3) str = "Server 2003"; - else str = "5-????"; + case PROCESSOR_ARCHITECTURE_UNKNOWN: + str = "Unknown"; + break; + case PROCESSOR_ARCHITECTURE_INTEL: + strcpy(tmp, "Intel "); + switch (msi->ProcessorLevel) + { + case 3: str = "80386"; break; + case 4: str = "80486"; break; + case 5: str = "Pentium"; break; + case 6: str = "Pentium Pro/II or AMD Athlon"; break; + case 15: str = "Pentium 4 or AMD Athlon64"; break; + default: str = "???"; break; + } + strcat(tmp, str); + strcat(tmp, " ("); + if (msi->ProcessorLevel == 3 || msi->ProcessorLevel == 4) + { + if (HIBYTE(msi->ProcessorRevision) == 0xFF) + sprintf(tmp + strlen(tmp), "%c%d", 'A' + ((msi->ProcessorRevision>>4)&0xf)-0x0a, msi->ProcessorRevision&0xf); + else + sprintf(tmp + strlen(tmp), "%c%d", 'A' + HIBYTE(msi->ProcessorRevision), LOBYTE(msi->ProcessorRevision)); + } + else sprintf(tmp + strlen(tmp), "%d.%d", HIBYTE(msi->ProcessorRevision), LOBYTE(msi->ProcessorRevision)); + str = tmp; + break; + case PROCESSOR_ARCHITECTURE_MIPS: + str = "Mips"; + break; + case PROCESSOR_ARCHITECTURE_ALPHA: + str = "Alpha"; + break; + case PROCESSOR_ARCHITECTURE_PPC: + str = "PowerPC"; + break; + case PROCESSOR_ARCHITECTURE_ARM: + str = "ARM"; + break; + case PROCESSOR_ARCHITECTURE_ARM64: + str = "ARM64"; + break; + case PROCESSOR_ARCHITECTURE_AMD64: + str = "X86_64"; + break; + case PROCESSOR_ARCHITECTURE_MSIL: + str = "MSIL"; + break; + case PROCESSOR_ARCHITECTURE_NEUTRAL: + str = "Neutral"; + break; + default: + str = "???"; break; - default: str = "5-????"; break; } - break; - case 6: - switch (msi->MinorVersion) + printf(" Processor: %s (#%d CPUs)\n", str, msi->NumberOfProcessors); + switch (msi->MajorVersion) { - case 0: - if (msi->ProductType == 1) str = "Vista"; - else if (msi->ProductType == 3) str = "Server 2008"; - else str = "6-????"; + case 3: + switch (msi->MinorVersion) + { + case 51: str = "NT 3.51"; break; + default: str = "3-????"; break; + } break; - case 1: - if (msi->ProductType == 1) str = "Win7"; - else if (msi->ProductType == 3) str = "Server 2008 R2"; - else str = "6-????"; + case 4: + switch (msi->MinorVersion) + { + case 0: str = (msi->PlatformId == VER_PLATFORM_WIN32_NT) ? "NT 4.0" : "95"; break; + case 10: str = "98"; break; + case 90: str = "ME"; break; + default: str = "4-????"; break; + } + break; + case 5: + switch (msi->MinorVersion) + { + case 0: str = "2000"; break; + case 1: str = "XP"; break; + case 2: + if (msi->ProductType == 1) str = "XP"; + else if (msi->ProductType == 3) str = "Server 2003"; + else str = "5-????"; + break; + default: str = "5-????"; break; + } + break; + case 6: + switch (msi->MinorVersion) + { + case 0: + if (msi->ProductType == 1) str = "Vista"; + else if (msi->ProductType == 3) str = "Server 2008"; + else str = "6-????"; + break; + case 1: + if (msi->ProductType == 1) str = "Win7"; + else if (msi->ProductType == 3) str = "Server 2008 R2"; + else str = "6-????"; break; case 2: if (msi->ProductType == 1) str = "Win8"; @@ -325,181 +334,185 @@ void mdmp_dump(void) else str = "6-????"; break; default: str = "6-????"; break; + } + break; + case 10: + switch (msi->MinorVersion) + { + case 0: + if (msi->ProductType == 1) str = "Win10"; + else str = "10-????"; + break; + default: str = "10-????"; break; + } + break; + default: str = "???"; break; } - break; - case 10: - switch (msi->MinorVersion) + printf(" Version: Windows %s (%u)\n", str, msi->BuildNumber); + printf(" PlatformId: %u\n", msi->PlatformId); + printf(" CSD: %s\n", get_mdmp_str(msi->CSDVersionRva)); + printf(" Reserved1: %u\n", msi->Reserved1); + if (msi->ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) { - case 0: - if (msi->ProductType == 1) str = "Win10"; - else str = "10-????"; - break; - default: str = "10-????"; break; + printf(" x86.VendorId: %.12s\n", + (const char*)msi->Cpu.X86CpuInfo.VendorId); + printf(" x86.VersionInformation: %x\n", msi->Cpu.X86CpuInfo.VersionInformation); + printf(" x86.FeatureInformation: %x\n", msi->Cpu.X86CpuInfo.FeatureInformation); + printf(" x86.AMDExtendedCpuFeatures: %x\n", msi->Cpu.X86CpuInfo.AMDExtendedCpuFeatures); } - break; - default: str = "???"; break; - } - printf(" Version: Windows %s (%u)\n", str, msi->BuildNumber); - printf(" PlatformId: %u\n", msi->PlatformId); - printf(" CSD: %s\n", get_mdmp_str(msi->CSDVersionRva)); - printf(" Reserved1: %u\n", msi->Reserved1); - if (msi->ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) - { - printf(" x86.VendorId: %.12s\n", - (const char*)msi->Cpu.X86CpuInfo.VendorId); - printf(" x86.VersionInformation: %x\n", msi->Cpu.X86CpuInfo.VersionInformation); - printf(" x86.FeatureInformation: %x\n", msi->Cpu.X86CpuInfo.FeatureInformation); - printf(" x86.AMDExtendedCpuFeatures: %x\n", msi->Cpu.X86CpuInfo.AMDExtendedCpuFeatures); - } - if (sizeof(MINIDUMP_SYSTEM_INFO) + 4 > dir->Location.DataSize && - msi->CSDVersionRva >= dir->Location.Rva + 4) - { - const char* code = PRD(dir->Location.Rva + sizeof(MINIDUMP_SYSTEM_INFO), 4); - const DWORD* wes; - if (code && code[0] == 'W' && code[1] == 'I' && code[2] == 'N' && code[3] == 'E' && - *(wes = (const DWORD*)(code += 4)) >= 3) + if (sizeof(MINIDUMP_SYSTEM_INFO) + 4 > dir->Location.DataSize && + msi->CSDVersionRva >= dir->Location.Rva + 4) { - /* assume we have wine extensions */ - printf(" Wine details:\n"); - printf(" build-id: %s\n", code + wes[1]); - printf(" system: %s\n", code + wes[2]); - printf(" release: %s\n", code + wes[3]); + const char* code = PRD(dir->Location.Rva + sizeof(MINIDUMP_SYSTEM_INFO), 4); + const DWORD* wes; + if (code && code[0] == 'W' && code[1] == 'I' && code[2] == 'N' && code[3] == 'E' && + *(wes = (const DWORD*)(code += 4)) >= 3) + { + /* assume we have wine extensions */ + printf(" Wine details:\n"); + printf(" build-id: %s\n", code + wes[1]); + printf(" system: %s\n", code + wes[2]); + printf(" release: %s\n", code + wes[3]); + } } } - } - break; + break; case MiscInfoStream: - { - const MINIDUMP_MISC_INFO *mmi = stream; - - printf("Misc Information\n"); - printf(" Size: %u\n", mmi->SizeOfInfo); - printf(" Flags: %#x\n", mmi->Flags1); - if (mmi->Flags1 & MINIDUMP_MISC1_PROCESS_ID) - printf(" ProcessId: %u\n", mmi->ProcessId); - if (mmi->Flags1 & MINIDUMP_MISC1_PROCESS_TIMES) + if (globals_dump_sect("info")) { - printf(" ProcessCreateTime: %s\n", get_time_str(mmi->ProcessCreateTime)); - printf(" ProcessUserTime: %u\n", mmi->ProcessUserTime); - printf(" ProcessKernelTime: %u\n", mmi->ProcessKernelTime); + const MINIDUMP_MISC_INFO *mmi = stream; + + printf("Misc Information\n"); + printf(" Size: %u\n", mmi->SizeOfInfo); + printf(" Flags: %#x\n", mmi->Flags1); + if (mmi->Flags1 & MINIDUMP_MISC1_PROCESS_ID) + printf(" ProcessId: %u\n", mmi->ProcessId); + if (mmi->Flags1 & MINIDUMP_MISC1_PROCESS_TIMES) + { + printf(" ProcessCreateTime: %s\n", get_time_str(mmi->ProcessCreateTime)); + printf(" ProcessUserTime: %u\n", mmi->ProcessUserTime); + printf(" ProcessKernelTime: %u\n", mmi->ProcessKernelTime); + } } - } - break; + break; case ExceptionStream: - { - const MINIDUMP_EXCEPTION_STREAM *mes = stream; - - printf("Exception:\n"); - printf(" ThreadId: %#x\n", mes->ThreadId); - printf(" ExceptionRecord:\n"); - printf(" ExceptionCode: %#x\n", mes->ExceptionRecord.ExceptionCode); - printf(" ExceptionFlags: %#x\n", mes->ExceptionRecord.ExceptionFlags); - printf(" ExceptionRecord: %s\n", get_hexint64_str( mes->ExceptionRecord.ExceptionRecord)); - printf(" ExceptionAddress: %s\n", get_hexint64_str( mes->ExceptionRecord.ExceptionAddress)); - printf(" ExceptionNumberParameters: %u\n", mes->ExceptionRecord.NumberParameters); - for (i = 0; i < mes->ExceptionRecord.NumberParameters; i++) + if (globals_dump_sect("exception")) { - printf(" [%d] %s\n", i, get_hexint64_str(mes->ExceptionRecord.ExceptionInformation[i])); + const MINIDUMP_EXCEPTION_STREAM *mes = stream; + + printf("Exception:\n"); + printf(" ThreadId: %#x\n", mes->ThreadId); + printf(" ExceptionRecord:\n"); + printf(" ExceptionCode: %#x\n", mes->ExceptionRecord.ExceptionCode); + printf(" ExceptionFlags: %#x\n", mes->ExceptionRecord.ExceptionFlags); + printf(" ExceptionRecord: %s\n", get_hexint64_str( mes->ExceptionRecord.ExceptionRecord)); + printf(" ExceptionAddress: %s\n", get_hexint64_str( mes->ExceptionRecord.ExceptionAddress)); + printf(" ExceptionNumberParameters: %u\n", mes->ExceptionRecord.NumberParameters); + for (i = 0; i < mes->ExceptionRecord.NumberParameters; i++) + { + printf(" [%d] %s\n", i, get_hexint64_str(mes->ExceptionRecord.ExceptionInformation[i])); + } + printf(" ThreadContext:\n"); + dump_mdmp_data(&mes->ThreadContext, " "); } - printf(" ThreadContext:\n"); - dump_mdmp_data(&mes->ThreadContext, " "); - } - break; + break; case HandleDataStream: - { - const MINIDUMP_HANDLE_DATA_STREAM *mhd = stream; + if (globals_dump_sect("handle")) + { + const MINIDUMP_HANDLE_DATA_STREAM *mhd = stream;
- printf("Handle data:\n"); - printf(" SizeOfHeader: %u\n", mhd->SizeOfHeader); - printf(" SizeOfDescriptor: %u\n", mhd->SizeOfDescriptor); - printf(" NumberOfDescriptors: %u\n", mhd->NumberOfDescriptors); + printf("Handle data:\n"); + printf(" SizeOfHeader: %u\n", mhd->SizeOfHeader); + printf(" SizeOfDescriptor: %u\n", mhd->SizeOfDescriptor); + printf(" NumberOfDescriptors: %u\n", mhd->NumberOfDescriptors);
- ptr = (BYTE *)mhd + sizeof(*mhd); - for (i = 0; i < mhd->NumberOfDescriptors; ++i) - { - const MINIDUMP_HANDLE_DESCRIPTOR_2 *hd = (void *)ptr; - - printf(" Handle [%u]:\n", i); - printf(" Handle: %s\n", get_hexint64_str(hd->Handle)); - printf(" TypeName: %s\n", get_mdmp_str(hd->TypeNameRva)); - printf(" ObjectName: %s\n", get_mdmp_str(hd->ObjectNameRva)); - printf(" Attributes: %#x\n", hd->Attributes); - printf(" GrantedAccess: %#x\n", hd->GrantedAccess); - printf(" HandleCount: %u\n", hd->HandleCount); - printf(" PointerCount: %#x\n", hd->PointerCount); - - if (mhd->SizeOfDescriptor >= sizeof(MINIDUMP_HANDLE_DESCRIPTOR_2)) + ptr = (BYTE *)mhd + sizeof(*mhd); + for (i = 0; i < mhd->NumberOfDescriptors; ++i) { - printf(" ObjectInfo: %s\n", get_mdmp_str(hd->ObjectInfoRva)); - printf(" Reserved0: %#x\n", hd->Reserved0); - } + const MINIDUMP_HANDLE_DESCRIPTOR_2 *hd = (void *)ptr; + + printf(" Handle [%u]:\n", i); + printf(" Handle: %s\n", get_hexint64_str(hd->Handle)); + printf(" TypeName: %s\n", get_mdmp_str(hd->TypeNameRva)); + printf(" ObjectName: %s\n", get_mdmp_str(hd->ObjectNameRva)); + printf(" Attributes: %#x\n", hd->Attributes); + printf(" GrantedAccess: %#x\n", hd->GrantedAccess); + printf(" HandleCount: %u\n", hd->HandleCount); + printf(" PointerCount: %#x\n", hd->PointerCount); + + if (mhd->SizeOfDescriptor >= sizeof(MINIDUMP_HANDLE_DESCRIPTOR_2)) + { + printf(" ObjectInfo: %s\n", get_mdmp_str(hd->ObjectInfoRva)); + printf(" Reserved0: %#x\n", hd->Reserved0); + }
- ptr += mhd->SizeOfDescriptor; + ptr += mhd->SizeOfDescriptor; + } } - } - break; + break; case ThreadInfoListStream: - { - const MINIDUMP_THREAD_INFO_LIST *til = stream; + if (globals_dump_sect("thread")) + { + const MINIDUMP_THREAD_INFO_LIST *til = stream;
- printf("Thread Info List:\n"); - printf(" SizeOfHeader: %u\n", (UINT)til->SizeOfHeader); - printf(" SizeOfEntry: %u\n", (UINT)til->SizeOfEntry); - printf(" NumberOfEntries: %u\n", (UINT)til->NumberOfEntries); + printf("Thread Info List:\n"); + printf(" SizeOfHeader: %u\n", (UINT)til->SizeOfHeader); + printf(" SizeOfEntry: %u\n", (UINT)til->SizeOfEntry); + printf(" NumberOfEntries: %u\n", (UINT)til->NumberOfEntries);
- ptr = (BYTE *)til + sizeof(*til); - for (i = 0; i < til->NumberOfEntries; ++i) - { - const MINIDUMP_THREAD_INFO *ti = (void *)ptr; - - printf(" Thread [%u]:\n", i); - printf(" ThreadId: %u\n", ti->ThreadId); - printf(" DumpFlags: %#x\n", ti->DumpFlags); - printf(" DumpError: %u\n", ti->DumpError); - printf(" ExitStatus: %u\n", ti->ExitStatus); - printf(" CreateTime: %s\n", get_uint64_str(ti->CreateTime)); - printf(" ExitTime: %s\n", get_hexint64_str(ti->ExitTime)); - printf(" KernelTime: %s\n", get_uint64_str(ti->KernelTime)); - printf(" UserTime: %s\n", get_uint64_str(ti->UserTime)); - printf(" StartAddress: %s\n", get_hexint64_str(ti->StartAddress)); - printf(" Affinity: %s\n", get_uint64_str(ti->Affinity)); - - ptr += til->SizeOfEntry; + ptr = (BYTE *)til + sizeof(*til); + for (i = 0; i < til->NumberOfEntries; ++i) + { + const MINIDUMP_THREAD_INFO *ti = (void *)ptr; + + printf(" Thread [%u]:\n", i); + printf(" ThreadId: %u\n", ti->ThreadId); + printf(" DumpFlags: %#x\n", ti->DumpFlags); + printf(" DumpError: %u\n", ti->DumpError); + printf(" ExitStatus: %u\n", ti->ExitStatus); + printf(" CreateTime: %s\n", get_uint64_str(ti->CreateTime)); + printf(" ExitTime: %s\n", get_hexint64_str(ti->ExitTime)); + printf(" KernelTime: %s\n", get_uint64_str(ti->KernelTime)); + printf(" UserTime: %s\n", get_uint64_str(ti->UserTime)); + printf(" StartAddress: %s\n", get_hexint64_str(ti->StartAddress)); + printf(" Affinity: %s\n", get_uint64_str(ti->Affinity)); + + ptr += til->SizeOfEntry; + } } - } - break; - + break; case UnloadedModuleListStream: - { - const MINIDUMP_UNLOADED_MODULE_LIST *uml = stream; + if (globals_dump_sect("module")) + { + const MINIDUMP_UNLOADED_MODULE_LIST *uml = stream;
- printf("Unloaded module list:\n"); - printf(" SizeOfHeader: %u\n", uml->SizeOfHeader); - printf(" SizeOfEntry: %u\n", uml->SizeOfEntry); - printf(" NumberOfEntries: %u\n", uml->NumberOfEntries); + printf("Unloaded module list:\n"); + printf(" SizeOfHeader: %u\n", uml->SizeOfHeader); + printf(" SizeOfEntry: %u\n", uml->SizeOfEntry); + printf(" NumberOfEntries: %u\n", uml->NumberOfEntries);
- ptr = (BYTE *)uml + sizeof(*uml); - for (i = 0; i < uml->NumberOfEntries; ++i) - { - const MINIDUMP_UNLOADED_MODULE *mod = (void *)ptr; + ptr = (BYTE *)uml + sizeof(*uml); + for (i = 0; i < uml->NumberOfEntries; ++i) + { + const MINIDUMP_UNLOADED_MODULE *mod = (void *)ptr;
- printf(" Module [%u]:\n", i); - printf(" BaseOfImage: %s\n", get_hexint64_str(mod->BaseOfImage)); - printf(" SizeOfImage: %u\n", mod->SizeOfImage); - printf(" CheckSum: %#x\n", mod->CheckSum); - printf(" TimeDateStamp: %s\n", get_time_str(mod->TimeDateStamp)); - printf(" ModuleName: %s\n", get_mdmp_str(mod->ModuleNameRva)); + printf(" Module [%u]:\n", i); + printf(" BaseOfImage: %s\n", get_hexint64_str(mod->BaseOfImage)); + printf(" SizeOfImage: %u\n", mod->SizeOfImage); + printf(" CheckSum: %#x\n", mod->CheckSum); + printf(" TimeDateStamp: %s\n", get_time_str(mod->TimeDateStamp)); + printf(" ModuleName: %s\n", get_mdmp_str(mod->ModuleNameRva));
- ptr += uml->SizeOfEntry; + ptr += uml->SizeOfEntry; + } } - } - break; - + break; default: printf("NIY %d\n", dir->StreamType); printf(" RVA: %u\n", (UINT)dir->Location.Rva); printf(" Size: %u\n", dir->Location.DataSize); - dump_mdmp_data(&dir->Location, " "); + if (globals_dump_sect("content")) + dump_mdmp_data(&dir->Location, " "); break; } }