Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wine-mirror
GitHub Repository: wine-mirror/wine
Path: blob/master/tools/winedump/minidump.c
4389 views
1
/*
2
* MiniDump dumping utility
3
*
4
* Copyright 2005 Eric Pouech
5
* 2024 Eric Pouech for CodeWeavers
6
*
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with this library; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20
*/
21
22
#include "config.h"
23
#include <stdarg.h>
24
25
#include "winedump.h"
26
#include "winver.h"
27
#include "dbghelp.h"
28
29
static void dump_mdmp_data(const MINIDUMP_LOCATION_DESCRIPTOR* md, const char* pfx)
30
{
31
if (md->DataSize)
32
dump_data(PRD(md->Rva, md->DataSize), md->DataSize, pfx);
33
}
34
35
static const char *get_mdmp_str(DWORD rva)
36
{
37
const MINIDUMP_STRING* ms;
38
if (!rva)
39
return "<<rva=0>>";
40
if ((ms = PRD(rva, sizeof(MINIDUMP_STRING))))
41
return get_unicode_str( ms->Buffer, ms->Length / sizeof(WCHAR) );
42
return "<<?>>";
43
}
44
45
enum FileSig get_kind_mdmp(void)
46
{
47
const DWORD* pdw;
48
49
pdw = PRD(0, sizeof(DWORD));
50
if (!pdw) {printf("Can't get main signature, aborting\n"); return SIG_UNKNOWN;}
51
52
if (*pdw == 0x504D444D /* "MDMP" */) return SIG_MDMP;
53
return SIG_UNKNOWN;
54
}
55
56
static void dump_system_time(const SYSTEMTIME *t, const char *pfx)
57
{
58
printf("%swYear: %u\n", pfx, t->wYear);
59
printf("%swMonth: %u\n", pfx, t->wYear);
60
printf("%swMonth: %u\n", pfx, t->wMonth);
61
printf("%swDayOfWeek: %u\n", pfx, t->wDayOfWeek);
62
printf("%swDay: %u\n", pfx, t->wDay);
63
printf("%swHour: %u\n", pfx, t->wHour);
64
printf("%swMinute: %u\n", pfx, t->wMinute);
65
printf("%swSecond: %u\n", pfx, t->wSecond);
66
printf("%swMilliseconds: %u\n", pfx, t->wMilliseconds);
67
}
68
69
void mdmp_dump(void)
70
{
71
const MINIDUMP_HEADER* hdr = PRD(0, sizeof(MINIDUMP_HEADER));
72
const MINIDUMP_DIRECTORY* dir;
73
const void* stream;
74
unsigned int i, idx;
75
const BYTE *ptr;
76
77
if (!hdr)
78
{
79
printf("Corrupt file, cannot get Minidump header\n");
80
return;
81
}
82
83
printf("Header\n");
84
printf(" Signature: %#x (%.4s)\n", hdr->Signature, (const char*)&hdr->Signature);
85
printf(" Version: %#x\n", hdr->Version);
86
printf(" NumberOfStreams: %u\n", hdr->NumberOfStreams);
87
printf(" StreamDirectoryRva: %#x\n", (UINT)hdr->StreamDirectoryRva);
88
printf(" CheckSum: %#x (%u)\n", hdr->CheckSum, hdr->CheckSum);
89
printf(" TimeDateStamp: %s\n", get_time_str(hdr->TimeDateStamp));
90
printf("Flags: %s\n", get_hexint64_str(hdr->Flags));
91
92
if (!PRD(hdr->StreamDirectoryRva, hdr->NumberOfStreams * sizeof(MINIDUMP_DIRECTORY)))
93
{
94
printf("Corrupt file, can't read all minidump directories\n");
95
return;
96
}
97
for (idx = 0; idx < hdr->NumberOfStreams; ++idx)
98
{
99
dir = PRD(hdr->StreamDirectoryRva + idx * sizeof(MINIDUMP_DIRECTORY), sizeof(*dir));
100
101
stream = PRD(dir->Location.Rva, dir->Location.DataSize);
102
if (!stream)
103
{
104
printf("Stream [%u]: corrupt file, stream is larger that file\n", idx);
105
continue;
106
}
107
switch (dir->StreamType)
108
{
109
case UnusedStream:
110
printf("Stream [%u]: Unused:\n", idx);
111
break;
112
case ThreadListStream:
113
if (globals_dump_sect("thread"))
114
{
115
const MINIDUMP_THREAD_LIST *mtl = stream;
116
const MINIDUMP_THREAD *mt = mtl->Threads;
117
118
printf("Stream [%u]: Threads:\n", idx);
119
printf(" NumberOfThreads: %u\n", mtl->NumberOfThreads);
120
for (i = 0; i < mtl->NumberOfThreads; i++, mt++)
121
{
122
printf(" Thread: #%d\n", i);
123
printf(" ThreadId: %#x\n", mt->ThreadId);
124
printf(" SuspendCount: %u\n", mt->SuspendCount);
125
printf(" PriorityClass: %u\n", mt->PriorityClass);
126
printf(" Priority: %u\n", mt->Priority);
127
printf(" Teb: %s\n", get_hexint64_str(mt->Teb));
128
printf(" Stack: %s +%#x\n", get_hexint64_str(mt->Stack.StartOfMemoryRange), mt->Stack.Memory.DataSize);
129
if (globals_dump_sect("content"))
130
dump_mdmp_data(&mt->Stack.Memory, " ");
131
printf(" ThreadContext:\n");
132
dump_mdmp_data(&mt->ThreadContext, " ");
133
}
134
}
135
break;
136
case ModuleListStream:
137
case 0xFFF0:
138
if (globals_dump_sect("module"))
139
{
140
const MINIDUMP_MODULE_LIST *mml = stream;
141
const MINIDUMP_MODULE* mm = mml->Modules;
142
const char* p1;
143
const char* p2;
144
145
printf("Stream [%u]: Modules (%s):\n", idx,
146
dir->StreamType == ModuleListStream ? "PE" : "ELF");
147
printf(" NumberOfModules: %u\n", mml->NumberOfModules);
148
for (i = 0; i < mml->NumberOfModules; i++, mm++)
149
{
150
printf(" Module #%d:\n", i);
151
printf(" BaseOfImage: %s\n", get_hexint64_str(mm->BaseOfImage));
152
printf(" SizeOfImage: %#x (%u)\n", mm->SizeOfImage, mm->SizeOfImage);
153
printf(" CheckSum: %#x (%u)\n", mm->CheckSum, mm->CheckSum);
154
printf(" TimeDateStamp: %s\n", get_time_str(mm->TimeDateStamp));
155
printf(" ModuleName: %s\n", get_mdmp_str(mm->ModuleNameRva));
156
printf(" VersionInfo:\n");
157
printf(" dwSignature: %x\n", (UINT)mm->VersionInfo.dwSignature);
158
printf(" dwStrucVersion: %x\n", (UINT)mm->VersionInfo.dwStrucVersion);
159
printf(" dwFileVersion: %d,%d,%d,%d\n",
160
HIWORD(mm->VersionInfo.dwFileVersionMS),
161
LOWORD(mm->VersionInfo.dwFileVersionMS),
162
HIWORD(mm->VersionInfo.dwFileVersionLS),
163
LOWORD(mm->VersionInfo.dwFileVersionLS));
164
printf(" dwProductVersion %d,%d,%d,%d\n",
165
HIWORD(mm->VersionInfo.dwProductVersionMS),
166
LOWORD(mm->VersionInfo.dwProductVersionMS),
167
HIWORD(mm->VersionInfo.dwProductVersionLS),
168
LOWORD(mm->VersionInfo.dwProductVersionLS));
169
printf(" dwFileFlagsMask: %x\n", (UINT)mm->VersionInfo.dwFileFlagsMask);
170
printf(" dwFileFlags: %s%s%s%s%s%s\n",
171
mm->VersionInfo.dwFileFlags & VS_FF_DEBUG ? "Debug " : "",
172
mm->VersionInfo.dwFileFlags & VS_FF_INFOINFERRED ? "Inferred " : "",
173
mm->VersionInfo.dwFileFlags & VS_FF_PATCHED ? "Patched " : "",
174
mm->VersionInfo.dwFileFlags & VS_FF_PRERELEASE ? "PreRelease " : "",
175
mm->VersionInfo.dwFileFlags & VS_FF_PRIVATEBUILD ? "PrivateBuild " : "",
176
mm->VersionInfo.dwFileFlags & VS_FF_SPECIALBUILD ? "SpecialBuild " : "");
177
if (mm->VersionInfo.dwFileOS)
178
{
179
switch (mm->VersionInfo.dwFileOS & 0x000F)
180
{
181
case VOS__BASE: p1 = "_base"; break;
182
case VOS__WINDOWS16:p1 = "16 bit Windows"; break;
183
case VOS__PM16: p1 = "16 bit Presentation Manager"; break;
184
case VOS__PM32: p1 = "32 bit Presentation Manager"; break;
185
case VOS__WINDOWS32:p1 = "32 bit Windows"; break;
186
default: p1 = "---"; break;
187
}
188
switch (mm->VersionInfo.dwFileOS & 0xF0000)
189
{
190
case VOS_UNKNOWN: p2 = "unknown"; break;
191
case VOS_DOS: p2 = "DOS"; break;
192
case VOS_OS216: p2 = "16 bit OS/2"; break;
193
case VOS_OS232: p2 = "32 bit OS/2"; break;
194
case VOS_NT: p2 = "Windows NT"; break;
195
default: p2 = "---"; break;
196
}
197
printf(" dwFileOS: %s running on %s\n", p1, p2);
198
}
199
else printf(" dwFileOS: 0\n");
200
switch (mm->VersionInfo.dwFileType)
201
{
202
case VFT_UNKNOWN: p1 = "Unknown"; break;
203
case VFT_APP: p1 = "Application"; break;
204
case VFT_DLL: p1 = "DLL"; break;
205
case VFT_DRV: p1 = "Driver"; break;
206
case VFT_FONT: p1 = "Font"; break;
207
case VFT_VXD: p1 = "VxD"; break;
208
case VFT_STATIC_LIB: p1 = "Static Library"; break;
209
default: p1 = "---"; break;
210
}
211
printf(" dwFileType: %s\n", p1);
212
printf(" dwFileSubtype: %u\n", (UINT)mm->VersionInfo.dwFileSubtype);
213
printf(" dwFileDate: %x%08x\n",
214
(UINT)mm->VersionInfo.dwFileDateMS, (UINT)mm->VersionInfo.dwFileDateLS);
215
printf(" CvRecord: <%u>\n", (UINT)mm->CvRecord.DataSize);
216
if (globals_dump_sect("content"))
217
dump_mdmp_data(&mm->CvRecord, " ");
218
printf(" MiscRecord: <%u>\n", (UINT)mm->MiscRecord.DataSize);
219
if (globals_dump_sect("content"))
220
dump_mdmp_data(&mm->MiscRecord, " ");
221
printf(" Reserved0: %s\n", get_hexint64_str(mm->Reserved0));
222
printf(" Reserved1: %s\n", get_hexint64_str(mm->Reserved1));
223
}
224
}
225
break;
226
case MemoryListStream:
227
if (globals_dump_sect("memory"))
228
{
229
const MINIDUMP_MEMORY_LIST *mml = stream;
230
const MINIDUMP_MEMORY_DESCRIPTOR* mmd = mml->MemoryRanges;
231
232
printf("Stream [%u]: Memory Ranges:\n", idx);
233
printf(" NumberOfMemoryRanges: %u\n", mml->NumberOfMemoryRanges);
234
for (i = 0; i < mml->NumberOfMemoryRanges; i++, mmd++)
235
{
236
printf(" Memory Range #%d:\n", i);
237
printf(" Range: %s +%#x\n", get_hexint64_str(mmd->StartOfMemoryRange), mmd->Memory.DataSize);
238
if (globals_dump_sect("content"))
239
dump_mdmp_data(&mmd->Memory, " ");
240
}
241
}
242
break;
243
case Memory64ListStream:
244
if (globals_dump_sect("memory"))
245
{
246
const MINIDUMP_MEMORY64_LIST *mml = stream;
247
const MINIDUMP_MEMORY_DESCRIPTOR64 *mmd = mml->MemoryRanges;
248
ULONG64 i64, base_rva;
249
printf("Stream [%u]: Memory64 Ranges:\n", idx);
250
printf(" NumberOfMemoryRanges: %s\n", get_uint64_str(mml->NumberOfMemoryRanges));
251
base_rva = mml->BaseRva;
252
for (i64 = 0; i64 < mml->NumberOfMemoryRanges; i64++, mmd++)
253
{
254
printf(" Memory Range #%s:\n", get_uint64_str(i64));
255
printf(" Range: %s +%s\n", get_hexint64_str(mmd->StartOfMemoryRange), get_hexint64_str(mmd->DataSize));
256
if (globals_dump_sect("content"))
257
dump_data(PRD(base_rva, mmd->DataSize), mmd->DataSize, " ");
258
base_rva += mmd->DataSize;
259
}
260
}
261
break;
262
case SystemInfoStream:
263
if (globals_dump_sect("info"))
264
{
265
const MINIDUMP_SYSTEM_INFO *msi = stream;
266
const char* str;
267
char tmp[128];
268
269
printf("Stream [%u]: System Information:\n", idx);
270
switch (msi->ProcessorArchitecture)
271
{
272
case PROCESSOR_ARCHITECTURE_UNKNOWN:
273
str = "Unknown";
274
break;
275
case PROCESSOR_ARCHITECTURE_INTEL:
276
strcpy(tmp, "Intel ");
277
switch (msi->ProcessorLevel)
278
{
279
case 3: str = "80386"; break;
280
case 4: str = "80486"; break;
281
case 5: str = "Pentium"; break;
282
case 6: str = "Pentium Pro/II or AMD Athlon"; break;
283
case 15: str = "Pentium 4 or AMD Athlon64"; break;
284
case 23: str = "AMD Zen 1 or 2"; break;
285
case 25: str = "AMD Zen 3 or 4"; break;
286
case 26: str = "AMD Zen 5"; break;
287
default: str = "???"; break;
288
}
289
strcat(tmp, str);
290
strcat(tmp, " (");
291
if (msi->ProcessorLevel == 3 || msi->ProcessorLevel == 4)
292
{
293
if (HIBYTE(msi->ProcessorRevision) == 0xFF)
294
sprintf(tmp + strlen(tmp), "%c%d", 'A' + ((msi->ProcessorRevision>>4)&0xf)-0x0a, msi->ProcessorRevision&0xf);
295
else
296
sprintf(tmp + strlen(tmp), "%c%d", 'A' + HIBYTE(msi->ProcessorRevision), LOBYTE(msi->ProcessorRevision));
297
}
298
else sprintf(tmp + strlen(tmp), "%d.%d", HIBYTE(msi->ProcessorRevision), LOBYTE(msi->ProcessorRevision));
299
str = tmp;
300
break;
301
case PROCESSOR_ARCHITECTURE_MIPS:
302
str = "Mips";
303
break;
304
case PROCESSOR_ARCHITECTURE_ALPHA:
305
str = "Alpha";
306
break;
307
case PROCESSOR_ARCHITECTURE_PPC:
308
str = "PowerPC";
309
break;
310
case PROCESSOR_ARCHITECTURE_ARM:
311
str = "ARM";
312
break;
313
case PROCESSOR_ARCHITECTURE_ARM64:
314
str = "ARM64";
315
break;
316
case PROCESSOR_ARCHITECTURE_AMD64:
317
str = "X86_64";
318
break;
319
case PROCESSOR_ARCHITECTURE_MSIL:
320
str = "MSIL";
321
break;
322
case PROCESSOR_ARCHITECTURE_NEUTRAL:
323
str = "Neutral";
324
break;
325
default:
326
str = "???";
327
break;
328
}
329
printf(" Processor: %s (#%d CPUs)\n", str, msi->NumberOfProcessors);
330
switch (msi->MajorVersion)
331
{
332
case 3:
333
switch (msi->MinorVersion)
334
{
335
case 51: str = "NT 3.51"; break;
336
default: str = "3-????"; break;
337
}
338
break;
339
case 4:
340
switch (msi->MinorVersion)
341
{
342
case 0: str = (msi->PlatformId == VER_PLATFORM_WIN32_NT) ? "NT 4.0" : "95"; break;
343
case 10: str = "98"; break;
344
case 90: str = "ME"; break;
345
default: str = "4-????"; break;
346
}
347
break;
348
case 5:
349
switch (msi->MinorVersion)
350
{
351
case 0: str = "2000"; break;
352
case 1: str = "XP"; break;
353
case 2:
354
if (msi->ProductType == 1) str = "XP";
355
else if (msi->ProductType == 3) str = "Server 2003";
356
else str = "5-????";
357
break;
358
default: str = "5-????"; break;
359
}
360
break;
361
case 6:
362
switch (msi->MinorVersion)
363
{
364
case 0:
365
if (msi->ProductType == 1) str = "Vista";
366
else if (msi->ProductType == 3) str = "Server 2008";
367
else str = "6-????";
368
break;
369
case 1:
370
if (msi->ProductType == 1) str = "Win7";
371
else if (msi->ProductType == 3) str = "Server 2008 R2";
372
else str = "6-????";
373
break;
374
case 2:
375
if (msi->ProductType == 1) str = "Win8";
376
else if (msi->ProductType == 3) str = "Server 2012";
377
else str = "6-????";
378
break;
379
case 3:
380
if (msi->ProductType == 1) str = "Win8.1";
381
else if (msi->ProductType == 3) str = "Server 2012 R2";
382
else str = "6-????";
383
break;
384
default: str = "6-????"; break;
385
}
386
break;
387
case 10:
388
switch (msi->MinorVersion)
389
{
390
case 0:
391
if (msi->ProductType == 1) str = "Win10";
392
else str = "10-????";
393
break;
394
default: str = "10-????"; break;
395
}
396
break;
397
default: str = "???"; break;
398
}
399
printf(" Version: Windows %s (%u)\n", str, msi->BuildNumber);
400
printf(" PlatformId: %u\n", msi->PlatformId);
401
printf(" CSD: %s\n", get_mdmp_str(msi->CSDVersionRva));
402
printf(" Reserved1: %u\n", msi->Reserved1);
403
if (msi->ProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
404
{
405
printf(" x86.VendorId: %.12s\n",
406
(const char*)msi->Cpu.X86CpuInfo.VendorId);
407
printf(" x86.VersionInformation: %x\n", msi->Cpu.X86CpuInfo.VersionInformation);
408
printf(" x86.FeatureInformation: %x\n", msi->Cpu.X86CpuInfo.FeatureInformation);
409
printf(" x86.AMDExtendedCpuFeatures: %x\n", msi->Cpu.X86CpuInfo.AMDExtendedCpuFeatures);
410
}
411
if (sizeof(MINIDUMP_SYSTEM_INFO) + 4 > dir->Location.DataSize &&
412
msi->CSDVersionRva >= dir->Location.Rva + 4)
413
{
414
const char* code = PRD(dir->Location.Rva + sizeof(MINIDUMP_SYSTEM_INFO), 4);
415
const DWORD* wes;
416
if (code && code[0] == 'W' && code[1] == 'I' && code[2] == 'N' && code[3] == 'E' &&
417
*(wes = (const DWORD*)(code += 4)) >= 3)
418
{
419
/* assume we have wine extensions */
420
printf(" Wine details:\n");
421
printf(" build-id: %s\n", code + wes[1]);
422
printf(" system: %s\n", code + wes[2]);
423
printf(" release: %s\n", code + wes[3]);
424
}
425
}
426
}
427
break;
428
case MiscInfoStream:
429
if (globals_dump_sect("info"))
430
{
431
const MINIDUMP_MISC_INFO_5 *mmi = stream;
432
433
printf("Stream [%u]: Misc Information:\n", idx);
434
printf(" Size: %u\n", mmi->SizeOfInfo);
435
printf(" Flags: %#x\n", mmi->Flags1);
436
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO) && mmi->Flags1 & MINIDUMP_MISC1_PROCESS_ID)
437
printf(" ProcessId: %u\n", mmi->ProcessId);
438
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO) && mmi->Flags1 & MINIDUMP_MISC1_PROCESS_TIMES)
439
{
440
printf(" ProcessCreateTime: %s\n", get_time_str(mmi->ProcessCreateTime));
441
printf(" ProcessUserTime: %u\n", mmi->ProcessUserTime);
442
printf(" ProcessKernelTime: %u\n", mmi->ProcessKernelTime);
443
}
444
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_2) && mmi->Flags1 & MINIDUMP_MISC1_PROCESSOR_POWER_INFO)
445
{
446
printf(" ProcessorMaxMhz: %u\n", mmi->ProcessorMaxMhz);
447
printf(" ProcessorCurrentMhz: %u\n", mmi->ProcessorCurrentMhz);
448
printf(" ProcessorMhzLimit: %u\n", mmi->ProcessorMhzLimit);
449
printf(" ProcessorMaxIdleState: %u\n", mmi->ProcessorMaxIdleState);
450
printf(" ProcessorCurrentIdleState: %u\n", mmi->ProcessorCurrentIdleState);
451
}
452
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_3) && mmi->Flags1 & MINIDUMP_MISC3_PROCESS_INTEGRITY)
453
printf(" ProcessIntegrityLevel: %u\n", mmi->ProcessIntegrityLevel);
454
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_3) && mmi->Flags1 & MINIDUMP_MISC3_PROCESS_EXECUTE_FLAGS)
455
printf(" ProcessExecuteFlags: %u\n", mmi->ProcessExecuteFlags);
456
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_3) && mmi->Flags1 & MINIDUMP_MISC3_PROTECTED_PROCESS)
457
printf(" ProtectedProcess: %u\n", mmi->ProtectedProcess);
458
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_3) && mmi->Flags1 & MINIDUMP_MISC3_TIMEZONE)
459
{
460
printf(" TimeZoneId: %u\n", mmi->TimeZoneId);
461
printf(" TimeZone:\n");
462
printf(" Bias: %d\n", (INT)mmi->TimeZone.Bias);
463
printf(" StandardName: %s\n", get_unicode_str(mmi->TimeZone.StandardName, -1));
464
printf(" StandardDate:\n");
465
dump_system_time(&mmi->TimeZone.StandardDate, " ");
466
printf(" StandardBias: %d\n", (INT)mmi->TimeZone.StandardBias);
467
printf(" DaylightName: %s\n", get_unicode_str(mmi->TimeZone.DaylightName, -1));
468
printf(" DaylightDate:\n");
469
dump_system_time(&mmi->TimeZone.DaylightDate, " ");
470
printf(" DaylightBias: %d\n", (INT)mmi->TimeZone.DaylightBias);
471
}
472
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_4) && mmi->Flags1 & MINIDUMP_MISC4_BUILDSTRING)
473
{
474
printf(" BuildString: %s\n", get_unicode_str(mmi->BuildString, -1));
475
printf(" DbgBldStr: %s\n", get_unicode_str(mmi->DbgBldStr, -1));
476
}
477
if (mmi->SizeOfInfo >= sizeof(MINIDUMP_MISC_INFO_5) && (mmi->Flags1 & MINIDUMP_MISC5_PROCESS_COOKIE))
478
printf(" ProcessCookie: %#x\n", mmi->ProcessCookie);
479
}
480
break;
481
case ExceptionStream:
482
if (globals_dump_sect("exception"))
483
{
484
const MINIDUMP_EXCEPTION_STREAM *mes = stream;
485
486
printf("Stream [%u]: Exception:\n", idx);
487
printf(" ThreadId: %#x\n", mes->ThreadId);
488
printf(" ExceptionRecord:\n");
489
printf(" ExceptionCode: %#x\n", mes->ExceptionRecord.ExceptionCode);
490
printf(" ExceptionFlags: %#x\n", mes->ExceptionRecord.ExceptionFlags);
491
printf(" ExceptionRecord: %s\n", get_hexint64_str( mes->ExceptionRecord.ExceptionRecord));
492
printf(" ExceptionAddress: %s\n", get_hexint64_str( mes->ExceptionRecord.ExceptionAddress));
493
printf(" ExceptionNumberParameters: %u\n", mes->ExceptionRecord.NumberParameters);
494
for (i = 0; i < mes->ExceptionRecord.NumberParameters; i++)
495
{
496
printf(" [%d] %s\n", i, get_hexint64_str(mes->ExceptionRecord.ExceptionInformation[i]));
497
}
498
printf(" ThreadContext:\n");
499
dump_mdmp_data(&mes->ThreadContext, " ");
500
}
501
break;
502
case HandleDataStream:
503
if (globals_dump_sect("handle"))
504
{
505
const MINIDUMP_HANDLE_DATA_STREAM *mhd = stream;
506
507
printf("Stream [%u]: Handle data:\n", idx);
508
printf(" SizeOfHeader: %u\n", mhd->SizeOfHeader);
509
printf(" SizeOfDescriptor: %u\n", mhd->SizeOfDescriptor);
510
printf(" NumberOfDescriptors: %u\n", mhd->NumberOfDescriptors);
511
512
ptr = (BYTE *)mhd + sizeof(*mhd);
513
for (i = 0; i < mhd->NumberOfDescriptors; ++i)
514
{
515
const MINIDUMP_HANDLE_DESCRIPTOR_2 *hd = (void *)ptr;
516
517
printf(" Handle [%u]:\n", i);
518
printf(" Handle: %s\n", get_hexint64_str(hd->Handle));
519
printf(" TypeName: %s\n", get_mdmp_str(hd->TypeNameRva));
520
printf(" ObjectName: %s\n", get_mdmp_str(hd->ObjectNameRva));
521
printf(" Attributes: %#x\n", hd->Attributes);
522
printf(" GrantedAccess: %#x\n", hd->GrantedAccess);
523
printf(" HandleCount: %u\n", hd->HandleCount);
524
printf(" PointerCount: %#x\n", hd->PointerCount);
525
526
if (mhd->SizeOfDescriptor >= sizeof(MINIDUMP_HANDLE_DESCRIPTOR_2))
527
{
528
MINIDUMP_HANDLE_OBJECT_INFORMATION *obj_info;
529
unsigned link_count = 0;
530
531
printf(" ObjectInfo: %#x\n", (UINT)hd->ObjectInfoRva);
532
printf(" Reserved0: %#x\n", hd->Reserved0);
533
534
if (hd->ObjectInfoRva)
535
{
536
for (obj_info = (void*)PRD(hd->ObjectInfoRva, sizeof(*obj_info));
537
obj_info;
538
obj_info = obj_info->NextInfoRva ? (void*)PRD(obj_info->NextInfoRva, sizeof(*obj_info)) : NULL)
539
{
540
printf(" Information[%u]\n", link_count++);
541
printf(" NextInfoRva: %#x\n", (UINT)obj_info->NextInfoRva);
542
printf(" InfoType: %u\n", obj_info->InfoType);
543
printf(" SizeOfInfo: %u\n", obj_info->SizeOfInfo);
544
if (globals_dump_sect("content"))
545
dump_data((const BYTE*)(obj_info + 1), obj_info->SizeOfInfo, " ");
546
}
547
}
548
}
549
550
ptr += mhd->SizeOfDescriptor;
551
}
552
}
553
break;
554
case ThreadInfoListStream:
555
if (globals_dump_sect("thread"))
556
{
557
const MINIDUMP_THREAD_INFO_LIST *til = stream;
558
559
printf("Stream [%u]: Thread Info List:\n", idx);
560
printf(" SizeOfHeader: %u\n", (UINT)til->SizeOfHeader);
561
printf(" SizeOfEntry: %u\n", (UINT)til->SizeOfEntry);
562
printf(" NumberOfEntries: %u\n", (UINT)til->NumberOfEntries);
563
564
ptr = (BYTE *)til + sizeof(*til);
565
for (i = 0; i < til->NumberOfEntries; ++i)
566
{
567
const MINIDUMP_THREAD_INFO *ti = (void *)ptr;
568
569
printf(" Thread [%u]:\n", i);
570
printf(" ThreadId: %#x\n", ti->ThreadId);
571
printf(" DumpFlags: %#x\n", ti->DumpFlags);
572
printf(" DumpError: %u\n", ti->DumpError);
573
printf(" ExitStatus: %u\n", ti->ExitStatus);
574
printf(" CreateTime: %s\n", get_uint64_str(ti->CreateTime));
575
printf(" ExitTime: %s\n", get_hexint64_str(ti->ExitTime));
576
printf(" KernelTime: %s\n", get_uint64_str(ti->KernelTime));
577
printf(" UserTime: %s\n", get_uint64_str(ti->UserTime));
578
printf(" StartAddress: %s\n", get_hexint64_str(ti->StartAddress));
579
printf(" Affinity: %s\n", get_uint64_str(ti->Affinity));
580
581
ptr += til->SizeOfEntry;
582
}
583
}
584
break;
585
case UnloadedModuleListStream:
586
if (globals_dump_sect("module"))
587
{
588
const MINIDUMP_UNLOADED_MODULE_LIST *uml = stream;
589
590
printf("Stream [%u]: Unloaded module list:\n", idx);
591
printf(" SizeOfHeader: %u\n", uml->SizeOfHeader);
592
printf(" SizeOfEntry: %u\n", uml->SizeOfEntry);
593
printf(" NumberOfEntries: %u\n", uml->NumberOfEntries);
594
595
ptr = (BYTE *)uml + sizeof(*uml);
596
for (i = 0; i < uml->NumberOfEntries; ++i)
597
{
598
const MINIDUMP_UNLOADED_MODULE *mod = (void *)ptr;
599
600
printf(" Module [%u]:\n", i);
601
printf(" BaseOfImage: %s\n", get_hexint64_str(mod->BaseOfImage));
602
printf(" SizeOfImage: %u\n", mod->SizeOfImage);
603
printf(" CheckSum: %#x\n", mod->CheckSum);
604
printf(" TimeDateStamp: %s\n", get_time_str(mod->TimeDateStamp));
605
printf(" ModuleName: %s\n", get_mdmp_str(mod->ModuleNameRva));
606
607
ptr += uml->SizeOfEntry;
608
}
609
}
610
break;
611
case MemoryInfoListStream:
612
if (globals_dump_sect("memory"))
613
{
614
const MINIDUMP_MEMORY_INFO_LIST *mil = stream;
615
const MINIDUMP_MEMORY_INFO *mi;
616
617
printf("Memory info list:\n");
618
printf(" SizeOfHeader: %u\n", (UINT)mil->SizeOfHeader);
619
printf(" SizeOfEntry: %u\n", (UINT)mil->SizeOfEntry);
620
printf(" NumberOfEntries: %s\n", get_uint64_str(mil->NumberOfEntries));
621
mi = (const MINIDUMP_MEMORY_INFO *)((BYTE *)mil + mil->SizeOfHeader);
622
dump_mdmp_data(&dir->Location, " ");
623
for (i = 0; i < mil->NumberOfEntries; ++i, ++mi)
624
{
625
printf(" Memory info [%u]:\n", i);
626
printf(" BaseAddress: %s\n", get_hexint64_str(mi->BaseAddress));
627
printf(" AllocationBase: %s\n", get_hexint64_str(mi->AllocationBase));
628
printf(" AllocationProtect: %#x\n", mi->AllocationProtect);
629
/* __alignment1 */
630
printf(" RegionSize: %s\n", get_hexint64_str(mi->RegionSize));
631
printf(" State: %x\n", mi->State);
632
printf(" Protect: %x\n", mi->Protect);
633
printf(" Type: %x\n", mi->Type);
634
/* __alignment2 */
635
}
636
}
637
break;
638
case SystemMemoryInfoStream:
639
if (globals_dump_sect("system"))
640
{
641
const MINIDUMP_SYSTEM_MEMORY_INFO_1 *smi = stream;
642
643
printf("Stream [%u]: System memory info:\n", idx);
644
printf(" Revision: %u\n", smi->Revision);
645
printf(" Flags: %#x\n", smi->Flags);
646
printf(" Basic info:\n");
647
printf(" TimerResolution: %u\n", (UINT)smi->BasicInfo.TimerResolution);
648
printf(" PageSize: %u\n", (UINT)smi->BasicInfo.PageSize);
649
printf(" NumberOfPhysicalPages: %u\n", (UINT)smi->BasicInfo.NumberOfPhysicalPages);
650
printf(" LowestPhysicalPageNumber: %u\n", (UINT)smi->BasicInfo.LowestPhysicalPageNumber);
651
printf(" HighestPhysicalPageNumber: %u\n", (UINT)smi->BasicInfo.HighestPhysicalPageNumber);
652
printf(" AllocationGranularity: %u\n", (UINT)smi->BasicInfo.AllocationGranularity);
653
printf(" MinimumUserModeAddress: %s\n", get_hexint64_str(smi->BasicInfo.MinimumUserModeAddress));
654
printf(" MaximumUserModeAddress: %s\n", get_hexint64_str(smi->BasicInfo.MaximumUserModeAddress));
655
printf(" ActiveProcessorsAffinityMask: %s\n", get_hexint64_str(smi->BasicInfo.ActiveProcessorsAffinityMask));
656
printf(" NumberOfProcessors: %u\n", (UINT)smi->BasicInfo.NumberOfProcessors);
657
printf(" File cache info:\n");
658
printf(" CurrentSize: %s\n", get_hexint64_str(smi->FileCacheInfo.CurrentSize));
659
printf(" PeakSize: %s\n", get_hexint64_str(smi->FileCacheInfo.PeakSize));
660
printf(" PageFaultCount: %u\n", (UINT)smi->FileCacheInfo.PageFaultCount);
661
printf(" MinimumWorkingSet: %s\n", get_hexint64_str(smi->FileCacheInfo.MinimumWorkingSet));
662
printf(" MaximumWorkingSet: %s\n", get_hexint64_str(smi->FileCacheInfo.MaximumWorkingSet));
663
printf(" CurrentSizeIncludingTransitionInPages: %s\n", get_hexint64_str(smi->FileCacheInfo.CurrentSizeIncludingTransitionInPages));
664
printf(" PeakSizeIncludingTransitionInPages: %s\n", get_hexint64_str(smi->FileCacheInfo.PeakSizeIncludingTransitionInPages));
665
if (smi->Flags & MINIDUMP_SYSMEMINFO1_FILECACHE_TRANSITIONREPURPOSECOUNT_FLAGS)
666
printf(" TransitionRePurposeCount: %u\n", (UINT)smi->FileCacheInfo.TransitionRePurposeCount);
667
printf(" Flags: %u\n", (UINT)smi->FileCacheInfo.Flags);
668
if (smi->Flags & MINIDUMP_SYSMEMINFO1_BASICPERF)
669
{
670
printf(" Basic perf:\n");
671
printf(" AvailablePages: %s\n", get_uint64_str(smi->BasicPerfInfo.AvailablePages));
672
printf(" CommittedPages: %s\n", get_uint64_str(smi->BasicPerfInfo.CommittedPages));
673
printf(" CommitLimit: %s\n", get_uint64_str(smi->BasicPerfInfo.CommitLimit));
674
printf(" PeakCommitment: %s\n", get_uint64_str(smi->BasicPerfInfo.PeakCommitment));
675
}
676
printf(" Perf:\n");
677
printf(" IdleProcessTime: %s\n", get_uint64_str(smi->PerfInfo.IdleProcessTime));
678
printf(" IoReadTransferCount: %s\n", get_uint64_str(smi->PerfInfo.IoReadTransferCount));
679
printf(" IoWriteTransferCount: %s\n", get_uint64_str(smi->PerfInfo.IoWriteTransferCount));
680
printf(" IoOtherTransferCount: %s\n", get_uint64_str(smi->PerfInfo.IoOtherTransferCount));
681
printf(" IoReadOperationCount: %u\n", (UINT)smi->PerfInfo.IoReadOperationCount);
682
printf(" IoWriteOperationCount: %u\n", (UINT)smi->PerfInfo.IoWriteOperationCount);
683
printf(" IoOtherOperationCount: %u\n", (UINT)smi->PerfInfo.IoOtherOperationCount);
684
printf(" AvailablePages: %u\n", (UINT)smi->PerfInfo.AvailablePages);
685
printf(" CommittedPages: %u\n", (UINT)smi->PerfInfo.CommittedPages);
686
printf(" CommitLimit: %u\n", (UINT)smi->PerfInfo.CommitLimit);
687
printf(" PeakCommitment: %u\n", (UINT)smi->PerfInfo.PeakCommitment);
688
printf(" PageFaultCount: %u\n", (UINT)smi->PerfInfo.PageFaultCount);
689
printf(" CopyOnWriteCount: %u\n", (UINT)smi->PerfInfo.CopyOnWriteCount);
690
printf(" TransitionCount: %u\n", (UINT)smi->PerfInfo.TransitionCount);
691
printf(" CacheTransitionCount: %u\n", (UINT)smi->PerfInfo.CacheTransitionCount);
692
printf(" DemandZeroCount: %u\n", (UINT)smi->PerfInfo.DemandZeroCount);
693
printf(" PageReadCount: %u\n", (UINT)smi->PerfInfo.PageReadCount);
694
printf(" PageReadIoCount: %u\n", (UINT)smi->PerfInfo.PageReadIoCount);
695
printf(" CacheReadCount: %u\n", (UINT)smi->PerfInfo.CacheReadCount);
696
printf(" CacheIoCount: %u\n", (UINT)smi->PerfInfo.CacheIoCount);
697
printf(" DirtyPagesWriteCount: %u\n", (UINT)smi->PerfInfo.DirtyPagesWriteCount);
698
printf(" DirtyWriteIoCount: %u\n", (UINT)smi->PerfInfo.DirtyWriteIoCount);
699
printf(" MappedPagesWriteCount: %u\n", (UINT)smi->PerfInfo.MappedPagesWriteCount);
700
printf(" MappedWriteIoCount: %u\n", (UINT)smi->PerfInfo.MappedWriteIoCount);
701
printf(" PagedPoolPages: %u\n", (UINT)smi->PerfInfo.PagedPoolPages);
702
printf(" NonPagedPoolPages: %u\n", (UINT)smi->PerfInfo.NonPagedPoolPages);
703
printf(" PagedPoolAllocs: %u\n", (UINT)smi->PerfInfo.PagedPoolAllocs);
704
printf(" PagedPoolFrees: %u\n", (UINT)smi->PerfInfo.PagedPoolFrees);
705
printf(" NonPagedPoolAllocs: %u\n", (UINT)smi->PerfInfo.NonPagedPoolAllocs);
706
printf(" NonPagedPoolFrees: %u\n", (UINT)smi->PerfInfo.NonPagedPoolFrees);
707
printf(" FreeSystemPtes: %u\n", (UINT)smi->PerfInfo.FreeSystemPtes);
708
printf(" ResidentSystemCodePage: %u\n", (UINT)smi->PerfInfo.ResidentSystemCodePage);
709
printf(" TotalSystemDriverPages: %u\n", (UINT)smi->PerfInfo.TotalSystemDriverPages);
710
printf(" TotalSystemCodePages: %u\n", (UINT)smi->PerfInfo.TotalSystemCodePages);
711
printf(" NonPagedPoolLookasideHits: %u\n", (UINT)smi->PerfInfo.NonPagedPoolLookasideHits);
712
printf(" PagedPoolLookasideHits: %u\n", (UINT)smi->PerfInfo.PagedPoolLookasideHits);
713
printf(" AvailablePagedPoolPages: %u\n", (UINT)smi->PerfInfo.AvailablePagedPoolPages);
714
printf(" ResidentSystemCachePage: %u\n", (UINT)smi->PerfInfo.ResidentSystemCachePage);
715
printf(" ResidentPagedPoolPage: %u\n", (UINT)smi->PerfInfo.ResidentPagedPoolPage);
716
printf(" ResidentSystemDriverPage: %u\n", (UINT)smi->PerfInfo.ResidentSystemDriverPage);
717
printf(" CcFastReadNoWait: %u\n", (UINT)smi->PerfInfo.CcFastReadNoWait);
718
printf(" CcFastReadWait: %u\n", (UINT)smi->PerfInfo.CcFastReadWait);
719
printf(" CcFastReadResourceMiss: %u\n", (UINT)smi->PerfInfo.CcFastReadResourceMiss);
720
printf(" CcFastReadNotPossible: %u\n", (UINT)smi->PerfInfo.CcFastReadNotPossible);
721
printf(" CcFastMdlReadNoWait: %u\n", (UINT)smi->PerfInfo.CcFastMdlReadNoWait);
722
printf(" CcFastMdlReadWait: %u\n", (UINT)smi->PerfInfo.CcFastMdlReadWait);
723
printf(" CcFastMdlReadResourceMiss: %u\n", (UINT)smi->PerfInfo.CcFastMdlReadResourceMiss);
724
printf(" CcFastMdlReadNotPossible: %u\n", (UINT)smi->PerfInfo.CcFastMdlReadNotPossible);
725
printf(" CcMapDataNoWait: %u\n", (UINT)smi->PerfInfo.CcMapDataNoWait);
726
printf(" CcMapDataWait: %u\n", (UINT)smi->PerfInfo.CcMapDataWait);
727
printf(" CcMapDataNoWaitMiss: %u\n", (UINT)smi->PerfInfo.CcMapDataNoWaitMiss);
728
printf(" CcMapDataWaitMiss: %u\n", (UINT)smi->PerfInfo.CcMapDataWaitMiss);
729
printf(" CcPinMappedDataCount: %u\n", (UINT)smi->PerfInfo.CcPinMappedDataCount);
730
printf(" CcPinReadNoWait: %u\n", (UINT)smi->PerfInfo.CcPinReadNoWait);
731
printf(" CcPinReadWait: %u\n", (UINT)smi->PerfInfo.CcPinReadWait);
732
printf(" CcPinReadNoWaitMiss: %u\n", (UINT)smi->PerfInfo.CcPinReadNoWaitMiss);
733
printf(" CcPinReadWaitMiss: %u\n", (UINT)smi->PerfInfo.CcPinReadWaitMiss);
734
printf(" CcCopyReadNoWait: %u\n", (UINT)smi->PerfInfo.CcCopyReadNoWait);
735
printf(" CcCopyReadWait: %u\n", (UINT)smi->PerfInfo.CcCopyReadWait);
736
printf(" CcCopyReadNoWaitMiss: %u\n", (UINT)smi->PerfInfo.CcCopyReadNoWaitMiss);
737
printf(" CcCopyReadWaitMiss: %u\n", (UINT)smi->PerfInfo.CcCopyReadWaitMiss);
738
printf(" CcMdlReadNoWait: %u\n", (UINT)smi->PerfInfo.CcMdlReadNoWait);
739
printf(" CcMdlReadWait: %u\n", (UINT)smi->PerfInfo.CcMdlReadWait);
740
printf(" CcMdlReadNoWaitMiss: %u\n", (UINT)smi->PerfInfo.CcMdlReadNoWaitMiss);
741
printf(" CcMdlReadWaitMiss: %u\n", (UINT)smi->PerfInfo.CcMdlReadWaitMiss);
742
printf(" CcReadAheadIos: %u\n", (UINT)smi->PerfInfo.CcReadAheadIos);
743
printf(" CcLazyWriteIos: %u\n", (UINT)smi->PerfInfo.CcLazyWriteIos);
744
printf(" CcLazyWritePages: %u\n", (UINT)smi->PerfInfo.CcLazyWritePages);
745
printf(" CcDataFlushes: %u\n", (UINT)smi->PerfInfo.CcDataFlushes);
746
printf(" CcDataPages: %u\n", (UINT)smi->PerfInfo.CcDataPages);
747
printf(" ContextSwitches: %u\n", (UINT)smi->PerfInfo.ContextSwitches);
748
printf(" FirstLevelTbFills: %u\n", (UINT)smi->PerfInfo.FirstLevelTbFills);
749
printf(" SecondLevelTbFills: %u\n", (UINT)smi->PerfInfo.SecondLevelTbFills);
750
printf(" SystemCalls: %u\n", (UINT)smi->PerfInfo.SystemCalls);
751
752
if (smi->Flags & MINIDUMP_SYSMEMINFO1_PERF_CCTOTALDIRTYPAGES_CCDIRTYPAGETHRESHOLD)
753
{
754
printf(" CcTotalDirtyPages: %s\n", get_uint64_str(smi->PerfInfo.CcTotalDirtyPages));
755
printf(" CcDirtyPageThreshold: %s\n", get_uint64_str(smi->PerfInfo.CcDirtyPageThreshold));
756
}
757
if (smi->Flags & MINIDUMP_SYSMEMINFO1_PERF_RESIDENTAVAILABLEPAGES_SHAREDCOMMITPAGES)
758
{
759
printf(" ResidentAvailablePages: %s\n", get_uint64_str(smi->PerfInfo.ResidentAvailablePages));
760
printf(" SharedCommittedPages: %s\n", get_uint64_str(smi->PerfInfo.SharedCommittedPages));
761
}
762
}
763
break;
764
case ProcessVmCountersStream:
765
if (globals_dump_sect("system"))
766
{
767
const MINIDUMP_PROCESS_VM_COUNTERS_2 *pvm = stream;
768
769
/* usage MINIDUMP_PROCESS_VM_COUNTERS to be asserted */
770
/* Note: contrary to other structures, _1 isn't a subset of _2... */
771
printf("Stream [%u]: Process VM counters:\n", idx);
772
printf(" Revision: %u\n", pvm->Revision);
773
if (pvm->Revision >= 2)
774
printf(" Flags: %#x\n", pvm->Flags);
775
printf(" PageFaultCount: %u\n", (UINT)pvm->PageFaultCount);
776
printf(" PeakWorkingSetSize: %s\n", get_hexint64_str(pvm->PeakWorkingSetSize));
777
printf(" WorkingSetSize: %s\n", get_hexint64_str(pvm->WorkingSetSize));
778
printf(" QuotaPeakPagedPoolUsage: %s\n", get_hexint64_str(pvm->QuotaPeakPagedPoolUsage));
779
printf(" QuotaPagedPoolUsage: %s\n", get_hexint64_str(pvm->QuotaPagedPoolUsage));
780
printf(" QuotaPeakNonPagedPoolUsage: %s\n", get_hexint64_str(pvm->QuotaPeakNonPagedPoolUsage));
781
printf(" QuotaNonPagedPoolUsage: %s\n", get_hexint64_str(pvm->QuotaNonPagedPoolUsage));
782
printf(" PagefileUsage: %s\n", get_hexint64_str(pvm->PagefileUsage));
783
printf(" PeakPagefileUsage: %s\n", get_hexint64_str(pvm->PeakPagefileUsage));
784
if (pvm->Revision == 1)
785
printf(" PrivateUsage: %s\n", get_hexint64_str(((const MINIDUMP_PROCESS_VM_COUNTERS_1 *)stream)->PrivateUsage));
786
else
787
{
788
if (pvm->Flags & MINIDUMP_PROCESS_VM_COUNTERS_VIRTUALSIZE)
789
{
790
printf(" PeakVirtualSize: %s\n", get_hexint64_str(pvm->PeakVirtualSize));
791
printf(" VirtualSize: %s\n", get_hexint64_str(pvm->VirtualSize));
792
}
793
if (pvm->Flags & MINIDUMP_PROCESS_VM_COUNTERS_EX)
794
printf(" PrivateUsage: %s\n", get_hexint64_str(pvm->PrivateUsage));
795
if (pvm->Flags & MINIDUMP_PROCESS_VM_COUNTERS_EX2)
796
{
797
printf(" PrivateWorkingSetSize: %s\n", get_hexint64_str(pvm->PrivateWorkingSetSize));
798
printf(" SharedCommitUsage: %s\n", get_hexint64_str(pvm->SharedCommitUsage));
799
}
800
801
if (pvm->Flags & MINIDUMP_PROCESS_VM_COUNTERS_JOB)
802
{
803
printf(" JobSharedCommitUsage: %s\n", get_hexint64_str(pvm->JobSharedCommitUsage));
804
printf(" JobPrivateCommitUsage: %s\n", get_hexint64_str(pvm->JobPrivateCommitUsage));
805
printf(" JobPeakPrivateCommitUsage: %s\n", get_hexint64_str(pvm->JobPeakPrivateCommitUsage));
806
printf(" JobPrivateCommitLimit: %s\n", get_hexint64_str(pvm->JobPrivateCommitLimit));
807
printf(" JobTotalCommitLimit: %s\n", get_hexint64_str(pvm->JobTotalCommitLimit));
808
}
809
}
810
}
811
break;
812
case TokenStream:
813
if (globals_dump_sect("token"))
814
{
815
const MINIDUMP_TOKEN_INFO_LIST *til = stream;
816
const MINIDUMP_TOKEN_INFO_HEADER *ti;
817
818
printf("Stream [%u]: Token info list:\n", idx);
819
printf(" TokenListSize: %u\n", til->TokenListSize);
820
printf(" TokenListEntries: %u\n", til->TokenListEntries);
821
printf(" ListHeaderSize: %u\n", til->ListHeaderSize);
822
printf(" ElementHeaderSize: %u\n", til->ElementHeaderSize);
823
824
ti = (const MINIDUMP_TOKEN_INFO_HEADER *)(til + 1);
825
if (til->ListHeaderSize >= sizeof(*ti))
826
{
827
for (i = 0; i < til->TokenListEntries; ++i)
828
{
829
printf(" Token #%u:\n", i);
830
printf(" TokenSize: %u\n", ti->TokenSize);
831
printf(" TokenId: %u\n", ti->TokenId);
832
printf(" TokenHandle:: %s\n", get_hexint64_str(ti->TokenHandle));
833
if (globals_dump_sect("content"))
834
dump_data((const BYTE *)ti + til->ListHeaderSize, ti->TokenSize - til->ListHeaderSize, " ");
835
ti = (const MINIDUMP_TOKEN_INFO_HEADER *)((const BYTE *)ti + ti->TokenSize);
836
}
837
}
838
else printf(" ### bad token entry\n");
839
}
840
break;
841
case ThreadNamesStream:
842
if (globals_dump_sect("thread"))
843
{
844
const MINIDUMP_THREAD_NAME_LIST *tnl = stream;
845
const MINIDUMP_THREAD_NAME *tn = tnl->ThreadNames;
846
847
printf("Stream [%u]: Thread name list:\n", idx);
848
printf(" NumberOfThreadNames: %u\n", (UINT)tnl->NumberOfThreadNames);
849
for (i = 0; i < tnl->NumberOfThreadNames; i++, tn++)
850
{
851
printf(" Thread #%u\n", i);
852
printf(" ThreadId: %#x\n", (UINT)tn->ThreadId);
853
printf(" ThreadName: %s\n", get_mdmp_str(tn->RvaOfThreadName));
854
}
855
}
856
break;
857
case CommentStreamA:
858
{
859
/* MSDN states an ANSI string, so stopping at first '\0' if any */
860
const char *end = memchr(stream, '\0', dir->Location.DataSize);
861
printf("Stream [%u]: CommentA\n", idx);
862
printf("--- start of comment\n");
863
write(1, stream, end ? end - (const char*)stream : dir->Location.DataSize);
864
printf("--- end of comment\n");
865
if (globals_dump_sect("content"))
866
dump_mdmp_data(&dir->Location, " ");
867
}
868
break;
869
case CommentStreamW:
870
{
871
const WCHAR *ptr;
872
873
/* MSDN states an UNICODE string, so stopping at first L'\0' if any */
874
printf("Stream [%u]: CommentW\n", idx);
875
printf("--- start of comment\n");
876
for (ptr = stream; ptr + 1 <= (const WCHAR *)((const char *)stream + dir->Location.DataSize) && *ptr; ptr++)
877
{
878
if (*ptr== L'\n' || *ptr== L'\r' || *ptr== L'\t' || (*ptr >= L' ' && *ptr < 127))
879
putchar((char)*ptr);
880
else printf("\\u%04x", *ptr);
881
}
882
printf("--- end of comment\n");
883
if (globals_dump_sect("content"))
884
dump_mdmp_data(&dir->Location, " ");
885
}
886
break;
887
default:
888
printf("Stream [%u]: NIY %d\n", idx, dir->StreamType);
889
printf(" RVA: %#x\n", (UINT)dir->Location.Rva);
890
printf(" Size: %u\n", dir->Location.DataSize);
891
if (globals_dump_sect("content"))
892
dump_mdmp_data(&dir->Location, " ");
893
break;
894
}
895
}
896
}
897
898