Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
b8910217
Commit
b8910217
authored
Mar 21, 2024
by
Eric Pouech
Committed by
Alexandre Julliard
Apr 15, 2024
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winedump: Support a couple of 'section' options (minidump).
Signed-off-by:
Eric Pouech
<
epouech@codeweavers.com
>
parent
2253504a
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
363 additions
and
348 deletions
+363
-348
main.c
tools/winedump/main.c
+3
-1
minidump.c
tools/winedump/minidump.c
+360
-347
No files found.
tools/winedump/main.c
View file @
b8910217
...
...
@@ -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"
},
...
...
tools/winedump/minidump.c
View file @
b8910217
...
...
@@ -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
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment