void Dump(
int
CObjectAddress , MY_INT BaseAddr, unsigned char
*
Buf ,
int
BufSize , MY_INT ImageBase, MY_INT PointerToRawData,
MY_INT VirtualAddress ,
int
Level , const char
*
parentInfo) {
/
/
如果该父类已经处理过,则直接返回
if
(g_visitedAddresses.find(CObjectAddress) !
=
g_visitedAddresses.end())
return
;
g_visitedAddresses.insert(CObjectAddress);
for
(
int
i
=
0
; i < BufSize; i
+
=
4
) {
if
(CObjectAddress
=
=
*
(
int
*
)(Buf
+
i)) {
CRuntimeClass
*
pRtti
=
(CRuntimeClass
*
)(Buf
+
i
-
sizeof(void
*
)
-
sizeof(UINT)
-
sizeof(
int
)
-
sizeof(void
*
));
MY_INT Va
=
FileOffsetToVa((MY_INT)pRtti
-
BaseAddr, PointerToRawData, VirtualAddress , ImageBase);
MY_INT FileOffset
=
VaToFileOffset((MY_INT)pRtti
-
>m_lpszClassName, PointerToRawData, VirtualAddress, ImageBase);
for
(
int
indent
=
0
; indent < Level; indent
+
+
) {
std::cout <<
" "
;
}
std::cout <<
"RootClassName: "
<< parentInfo << std::endl;
for
(
int
indent
=
0
; indent < Level; indent
+
+
) {
std::cout <<
" "
;
}
std::cout <<
"ClassName: "
<< (char
*
)(FileOffset
+
BaseAddr) << std::endl;
for
(
int
indent
=
0
; indent < Level; indent
+
+
) {
std::cout <<
" "
;
}
std::cout <<
"ObjSize: "
<< pRtti
-
>m_nObjectSize << std::endl;
Dump(Va, BaseAddr, Buf, BufSize, ImageBase, PointerToRawData, VirtualAddress , Level
+
1
, (char
*
)(FileOffset
+
BaseAddr));
}
}
}