Это связано с моим предыдущим вопросом , касающимся извлечения объектов из файла dmp.
Как я упоминал в предыдущем вопросе, я могу успешно извлечь объект из файла dmp, создав «удаленные» объекты-оболочки. Я реализовал некоторые из них до сих пор, и, кажется, это работает хорошо. Однако я столкнулся с загадкой.
В одном случае указатель хранится в классе, скажем, типа «SomeBaseClass», но на самом деле этот объект имеет тип «SomeDerivedClass», производный от «SomeBaseClass». Например, это будет что-то вроде этого:
MyApplication!SomeObject
+0x000 field1 : Ptr32 SomeBaseClass
+0x004 field2 : Ptr32 SomeOtherClass
+0x008 field3 : Ptr32 SomeOtherClass
Мне нужен какой-то способ узнать, что такое ФАКТИЧЕСКИЙ тип 'field1'.
Чтобы быть более конкретным, используя примеры адресов:
MyApplication!SomeObject
+0x000 field1 : 0cae2e24 SomeBaseClass
+0x004 field2 : 0x262c8d3c SomeOtherClass
+0x008 field3 : 0x262c8d3c SomeOtherClass
0:000> dt SomeBaseClass 0cae2e24
MyApplication!SomeBaseClass
+0x000 __VFN_table : 0x02de89e4
+0x038 basefield1 : (null)
+0x03c basefield2 : 3
0:000> dt SomeDerivedClass 0cae2e24
MyApplication!SomeDerivedClass
+0x000 __VFN_table : 0x02de89e4
+0x038 basefield1 : (null)
+0x03c basefield2 : 3
+0x040 derivedfield1 : 357
+0x044 derivedfield2 : timecode_t
Когда я нахожусь в WinDbg, я могу сделать это:
dt 0x02de89e4
И это покажет тип:
0:000> dt 0x02de89e4
SomeDerivedClass::`vftable'
Symbol not found.
Но как мне получить это внутри расширения? Могу ли я использовать SearchMemory () для поиска SomeDerivedClass :: `vftable '? Если вы следите за моим другим вопросом, мне нужна информация о типах, чтобы я знал, какой тип удаленных классов-оболочек создать. Я полагаю, что это может в конечном итоге быть своего рода оператором case, где я должен сопоставить строку с типом? Я в порядке с этим, но я все еще не знаю, где я могу получить эту строку, которая представляет тип рассматриваемого объекта (например, SomeObject-> field1 в приведенном выше примере).