mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
GP-5874 - PDB CPP - Fix month's old regression in assigning vxt types;
add tests to prevent further regression
This commit is contained in:
parent
e355d86144
commit
c1dbadade8
12 changed files with 916 additions and 72 deletions
|
@ -53,10 +53,11 @@ import mdemangler.typeinfo.*;
|
||||||
* {@link #createVirtualTable(CategoryPath, String, Address, TaskMonitor)} methods demangle
|
* {@link #createVirtualTable(CategoryPath, String, Address, TaskMonitor)} methods demangle
|
||||||
* the strings and created tables within a owner/parentage tree based on the demangled information.
|
* the strings and created tables within a owner/parentage tree based on the demangled information.
|
||||||
* <p><p>
|
* <p><p>
|
||||||
* The {@link #findVbt(ClassID, List, Integer)} and {@link #findVft(ClassID, List, Integer)} methods
|
* The {@link #findCreateVbt(ClassID, List, Integer)} and
|
||||||
* attempt to find the VF/VB tables by finding the appropriate node in the tree based upon owner
|
* {@link #findCreateVft(ClassID, List, Integer)} methods attempt to find the VF/VB tables by
|
||||||
* and at-times-mismatched parentage information from the user. This mismatch is not necessarily
|
* finding the appropriate node in the tree based upon owner and at-times-mismatched parentage
|
||||||
* the fault of the user, but more due to what parentage is incorporated into the mangled name.
|
* information from the user. This mismatch is not necessarily the fault of the user, but more
|
||||||
|
* due to what parentage is incorporated into the mangled name.
|
||||||
* <p><p>
|
* <p><p>
|
||||||
* <B> DESIGN of find mechanism</B>
|
* <B> DESIGN of find mechanism</B>
|
||||||
* <p>
|
* <p>
|
||||||
|
@ -338,7 +339,7 @@ public class MsVxtManager extends VxtManager {
|
||||||
* @param ordinal ordinal of table for owner as sorted by address
|
* @param ordinal ordinal of table for owner as sorted by address
|
||||||
* @return the table
|
* @return the table
|
||||||
*/
|
*/
|
||||||
public VirtualBaseTable findVbt(ClassID owner, List<ClassID> parentage, Integer ordinal) {
|
public VirtualBaseTable findCreateVbt(ClassID owner, List<ClassID> parentage, Integer ordinal) {
|
||||||
OwnerParentage op = new OwnerParentage(owner, parentage);
|
OwnerParentage op = new OwnerParentage(owner, parentage);
|
||||||
VirtualBaseTable vbt = vbtsByOwnerParentage.get(op);
|
VirtualBaseTable vbt = vbtsByOwnerParentage.get(op);
|
||||||
if (vbt != null) {
|
if (vbt != null) {
|
||||||
|
@ -424,7 +425,8 @@ public class MsVxtManager extends VxtManager {
|
||||||
* @param ordinal ordinal of table for owner as sorted by address
|
* @param ordinal ordinal of table for owner as sorted by address
|
||||||
* @return the table
|
* @return the table
|
||||||
*/
|
*/
|
||||||
public VirtualFunctionTable findVft(ClassID owner, List<ClassID> parentage, Integer ordinal) {
|
public VirtualFunctionTable findCreateVft(ClassID owner, List<ClassID> parentage,
|
||||||
|
Integer ordinal) {
|
||||||
OwnerParentage op = new OwnerParentage(owner, parentage);
|
OwnerParentage op = new OwnerParentage(owner, parentage);
|
||||||
VirtualFunctionTable vft = vftsByOwnerParentage.get(op);
|
VirtualFunctionTable vft = vftsByOwnerParentage.get(op);
|
||||||
if (vft != null) {
|
if (vft != null) {
|
||||||
|
|
|
@ -72,7 +72,7 @@ public abstract class VirtualBaseTable implements VBTable {
|
||||||
public void addEntry(int tableIndex, ClassID baseId) {
|
public void addEntry(int tableIndex, ClassID baseId) {
|
||||||
VirtualBaseTableEntry entry = getNewEntry(baseId);
|
VirtualBaseTableEntry entry = getNewEntry(baseId);
|
||||||
entryByTableIndex.put(tableIndex, entry);
|
entryByTableIndex.put(tableIndex, entry);
|
||||||
maxTableIndexSeen = Integer.max(maxTableIndexSeen, tableIndex);
|
witnessTableIndex(tableIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
int getMaxTableIndex() {
|
int getMaxTableIndex() {
|
||||||
|
@ -115,7 +115,7 @@ public abstract class VirtualBaseTable implements VBTable {
|
||||||
else {
|
else {
|
||||||
entry.setClassId(baseId);
|
entry.setClassId(baseId);
|
||||||
}
|
}
|
||||||
maxTableIndexSeen = Integer.max(maxTableIndexSeen, tableIndex);
|
witnessTableIndex(tableIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,10 +130,14 @@ public abstract class VirtualBaseTable implements VBTable {
|
||||||
if (entry == null) {
|
if (entry == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
maxTableIndexSeen = Integer.max(maxTableIndexSeen, tableIndex);
|
witnessTableIndex(tableIndex);
|
||||||
return entry.getClassId();
|
return entry.getClassId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void witnessTableIndex(int tableIndex) {
|
||||||
|
maxTableIndexSeen = Integer.max(maxTableIndexSeen, tableIndex);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the owning class
|
* Returns the owning class
|
||||||
* @return the owner
|
* @return the owner
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
*/
|
*/
|
||||||
package ghidra.app.util.pdb.classtype;
|
package ghidra.app.util.pdb.classtype;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import ghidra.program.model.address.Address;
|
import ghidra.program.model.address.Address;
|
||||||
import ghidra.program.model.data.PointerDataType;
|
import ghidra.program.model.data.PointerDataType;
|
||||||
|
@ -28,8 +27,8 @@ public class VxtManager {
|
||||||
|
|
||||||
protected ClassTypeManager ctm;
|
protected ClassTypeManager ctm;
|
||||||
|
|
||||||
protected Map<Address, VirtualBaseTable> vbtByAddress;
|
protected TreeMap<Address, VirtualBaseTable> vbtByAddress;
|
||||||
protected Map<Address, VirtualFunctionTable> vftByAddress;
|
protected TreeMap<Address, VirtualFunctionTable> vftByAddress;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Virtual Base Table Lookup Manager
|
* Virtual Base Table Lookup Manager
|
||||||
|
@ -37,8 +36,8 @@ public class VxtManager {
|
||||||
*/
|
*/
|
||||||
public VxtManager(ClassTypeManager ctm) {
|
public VxtManager(ClassTypeManager ctm) {
|
||||||
this.ctm = ctm;
|
this.ctm = ctm;
|
||||||
vbtByAddress = new HashMap<>();
|
vbtByAddress = new TreeMap<>();
|
||||||
vftByAddress = new HashMap<>();
|
vftByAddress = new TreeMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,4 +74,20 @@ public class VxtManager {
|
||||||
return vftByAddress.get(address);
|
return vftByAddress.get(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps vbt addresses
|
||||||
|
* @return the addresses
|
||||||
|
*/
|
||||||
|
public List<Address> dumpVbtAddresses() {
|
||||||
|
return new ArrayList<Address>(vbtByAddress.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dumps fbt addresses
|
||||||
|
* @return the addresses
|
||||||
|
*/
|
||||||
|
public List<Address> dumpVftAddresses() {
|
||||||
|
return new ArrayList<Address>(vftByAddress.keySet());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,8 +149,10 @@ public class CppCompositeType {
|
||||||
private TreeSet<VxtPtrInfo> propagatedIndirectVirtualBaseVbts;
|
private TreeSet<VxtPtrInfo> propagatedIndirectVirtualBaseVbts;
|
||||||
private TreeMap<Long, VxtPtrInfo> finalVftPtrInfoByOffset;
|
private TreeMap<Long, VxtPtrInfo> finalVftPtrInfoByOffset;
|
||||||
private TreeMap<Long, VxtPtrInfo> finalVbtPtrInfoByOffset;
|
private TreeMap<Long, VxtPtrInfo> finalVbtPtrInfoByOffset;
|
||||||
private TreeMap<Long, VXT> finalVftByOffset;
|
private LinkedHashMap<Long, VXT> finalVftByOffset;
|
||||||
private TreeMap<Long, VXT> finalVbtByOffset;
|
private LinkedHashMap<Long, VXT> finalVbtByOffset;
|
||||||
|
private List<VxtPtrInfo> orderedVfts;
|
||||||
|
private List<VxtPtrInfo> orderedVbts;
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -831,6 +833,9 @@ public class CppCompositeType {
|
||||||
|
|
||||||
createClassLayout(vxtManager, layoutOptions, monitor);
|
createClassLayout(vxtManager, layoutOptions, monitor);
|
||||||
|
|
||||||
|
// See comment located with this method regardign possible future removal.
|
||||||
|
updateOrderedVxtsInVirtualBases(vxtManager);
|
||||||
|
|
||||||
finalizeAllVxtParentage();
|
finalizeAllVxtParentage();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -864,8 +869,11 @@ public class CppCompositeType {
|
||||||
propagatedIndirectVirtualBaseVbts = new TreeSet<>();
|
propagatedIndirectVirtualBaseVbts = new TreeSet<>();
|
||||||
finalVftPtrInfoByOffset = new TreeMap<>();
|
finalVftPtrInfoByOffset = new TreeMap<>();
|
||||||
finalVbtPtrInfoByOffset = new TreeMap<>();
|
finalVbtPtrInfoByOffset = new TreeMap<>();
|
||||||
finalVftByOffset = new TreeMap<>();
|
orderedVfts = new ArrayList<>();
|
||||||
finalVbtByOffset = new TreeMap<>();
|
orderedVbts = new ArrayList<>();
|
||||||
|
|
||||||
|
finalVftByOffset = new LinkedHashMap<>();
|
||||||
|
finalVbtByOffset = new LinkedHashMap<>();
|
||||||
|
|
||||||
vxtPtrSummary = new TreeMap<>();
|
vxtPtrSummary = new TreeMap<>();
|
||||||
}
|
}
|
||||||
|
@ -923,16 +931,15 @@ public class CppCompositeType {
|
||||||
for (VxtPtrInfo info : finalVftPtrInfoByOffset.values()) {
|
for (VxtPtrInfo info : finalVftPtrInfoByOffset.values()) {
|
||||||
List<ClassID> altParentage =
|
List<ClassID> altParentage =
|
||||||
finalizeVxtPtrParentage(vftChildToParentRoot, vftParentToChildRoot, info);
|
finalizeVxtPtrParentage(vftChildToParentRoot, vftParentToChildRoot, info);
|
||||||
String name = ClassUtils.getSpecialVxTableName(info.finalOffset);
|
String name = ClassUtils.getSpecialVxTableName(info.finalOffset());
|
||||||
String result = dumpVxtPtrResult("vft", info, altParentage.reversed());
|
String result = dumpVxtPtrResult("vft", info, altParentage.reversed());
|
||||||
builder.append(result + "\n");
|
builder.append(result + "\n");
|
||||||
results.put(name, result);
|
results.put(name, result);
|
||||||
|
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : finalVbtPtrInfoByOffset.values()) {
|
for (VxtPtrInfo info : finalVbtPtrInfoByOffset.values()) {
|
||||||
List<ClassID> altParentage =
|
List<ClassID> altParentage =
|
||||||
finalizeVxtPtrParentage(vbtChildToParentRoot, vbtParentToChildRoot, info);
|
finalizeVxtPtrParentage(vbtChildToParentRoot, vbtParentToChildRoot, info);
|
||||||
String name = ClassUtils.getSpecialVxTableName(info.finalOffset);
|
String name = ClassUtils.getSpecialVxTableName(info.finalOffset());
|
||||||
String result = dumpVxtPtrResult("vbt", info, altParentage.reversed());
|
String result = dumpVxtPtrResult("vbt", info, altParentage.reversed());
|
||||||
builder.append(result + "\n");
|
builder.append(result + "\n");
|
||||||
results.put(name, result);
|
results.put(name, result);
|
||||||
|
@ -1094,10 +1101,13 @@ public class CppCompositeType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (VXT t : finalVftByOffset.values()) {
|
// Save for possible future reincorporation if we can get back to better updateVft and
|
||||||
VirtualFunctionTable vft = (VirtualFunctionTable) t;
|
// updateVbt models... of coures this is only updating vfts... this code is found
|
||||||
updateVftFromSelf(vft);
|
// else where now, but might move back here.
|
||||||
}
|
// for (VXT t : finalVftByOffset.values()) {
|
||||||
|
// VirtualFunctionTable vft = (VirtualFunctionTable) t;
|
||||||
|
// updateVftFromSelf(vft);
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1288,33 +1298,46 @@ public class CppCompositeType {
|
||||||
private void findVirtualBaseVxtPtrs(MsVxtManager vxtManager) throws PdbException {
|
private void findVirtualBaseVxtPtrs(MsVxtManager vxtManager) throws PdbException {
|
||||||
// Walk direct bases to find vxts of virtual bases. TODO: also notate all rolled up
|
// Walk direct bases to find vxts of virtual bases. TODO: also notate all rolled up
|
||||||
// virtuals for each direct base.
|
// virtuals for each direct base.
|
||||||
|
|
||||||
|
// We have to defer updating the vxts; the orderedVfts and orderredVbts lists are created
|
||||||
|
// and used for updating the vxts in the same order that they occur here. And they are
|
||||||
|
// only used for the virtual bases (not used in for the direct bases above.) The reason
|
||||||
|
// why they cannot be updated here is that we need the full lists before so that the
|
||||||
|
// updates can try to find the correct vxt in the MsVxtManager by its ordinal position
|
||||||
|
// (of the vbt or vft type) within the current class. If we can get a fully error-free
|
||||||
|
// vxtManager by which we can find owner/parentage vxts without error, then we have the
|
||||||
|
// change to eliminate the ordinal lookup and can then add back the updateVft() and
|
||||||
|
// updateVbt() methods here. We aim to maintain the older versions of these methods
|
||||||
|
// for that possible improvement. The older methods are, nicely, still used above for
|
||||||
|
// the direct bases.
|
||||||
|
|
||||||
for (DirectLayoutBaseClass base : directLayoutBaseClasses) {
|
for (DirectLayoutBaseClass base : directLayoutBaseClasses) {
|
||||||
|
|
||||||
CppCompositeType cppBaseType = base.getBaseClassType();
|
CppCompositeType cppBaseType = base.getBaseClassType();
|
||||||
ClassID baseId = cppBaseType.getClassId();
|
//ClassID baseId = cppBaseType.getClassId(); // for the update commented above
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVfts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVfts()) {
|
||||||
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVft(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedDirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
storeVxtInfo(propagatedDirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
||||||
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
||||||
|
orderedVfts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVbts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVbts()) {
|
||||||
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVbt(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedDirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
storeVxtInfo(propagatedDirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
||||||
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
||||||
|
orderedVbts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVfts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVfts()) {
|
||||||
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVft(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatededIndirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
storeVxtInfo(propagatededIndirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
||||||
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
||||||
|
orderedVfts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVbts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVbts()) {
|
||||||
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createSelfOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVbt(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedIndirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
storeVxtInfo(propagatedIndirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
||||||
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
||||||
|
orderedVbts.add(newInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1328,44 +1351,65 @@ public class CppCompositeType {
|
||||||
|
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedSelfBaseVfts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedSelfBaseVfts()) {
|
||||||
VxtPtrInfo newInfo = createVirtualOwnedSelfVxtPtrInfo(info, baseId);
|
VxtPtrInfo newInfo = createVirtualOwnedSelfVxtPtrInfo(info, baseId);
|
||||||
updateVft(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedDirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
storeVxtInfo(propagatedDirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
||||||
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
||||||
|
orderedVfts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedSelfBaseVbts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedSelfBaseVbts()) {
|
||||||
VxtPtrInfo newInfo = createVirtualOwnedSelfVxtPtrInfo(info, baseId);
|
VxtPtrInfo newInfo = createVirtualOwnedSelfVxtPtrInfo(info, baseId);
|
||||||
updateVbt(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedDirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
storeVxtInfo(propagatedDirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
||||||
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
||||||
|
orderedVbts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVfts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVfts()) {
|
||||||
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVft(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatededIndirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
storeVxtInfo(propagatededIndirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
||||||
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
||||||
|
orderedVfts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVbts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedDirectVirtualBaseVbts()) {
|
||||||
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVbt(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedIndirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
storeVxtInfo(propagatedIndirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
||||||
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
||||||
|
orderedVbts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVfts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVfts()) {
|
||||||
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVft(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatededIndirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
storeVxtInfo(propagatededIndirectVirtualBaseVfts, finalVftPtrInfoByOffset,
|
||||||
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
vfTableIdByOffset, vftOffsetByTableId, newInfo);
|
||||||
|
orderedVfts.add(newInfo);
|
||||||
}
|
}
|
||||||
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVbts()) {
|
for (VxtPtrInfo info : cppBaseType.getPropagatedIndirectVirtualBaseVbts()) {
|
||||||
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
VxtPtrInfo newInfo = createVirtualOwnedVirtualVxtPtrInfo(info);
|
||||||
updateVbt(vxtManager, baseId, newInfo, info);
|
|
||||||
storeVxtInfo(propagatedIndirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
storeVxtInfo(propagatedIndirectVirtualBaseVbts, finalVbtPtrInfoByOffset,
|
||||||
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
vbTableIdByOffset, vbtOffsetByTableId, newInfo);
|
||||||
|
orderedVbts.add(newInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See comment in findVirtualBaseVxtPtrs(). The method here is new and called from the main
|
||||||
|
// createHierarchicalClassLayout() method, but we might eventually be able to eliminate it.
|
||||||
|
private void updateOrderedVxtsInVirtualBases(MsVxtManager vxtManager) {
|
||||||
|
List<Long> vftOffsets = List.copyOf(finalVftPtrInfoByOffset.keySet());
|
||||||
|
List<Long> vbtOffsets = List.copyOf(finalVbtPtrInfoByOffset.keySet());
|
||||||
|
|
||||||
|
for (VxtPtrInfo info : orderedVfts) {
|
||||||
|
int ordinal = vftOffsets.indexOf(info.finalOffset());
|
||||||
|
updateVft(vxtManager, info, ordinal == -1 ? null : ordinal);
|
||||||
|
}
|
||||||
|
for (VxtPtrInfo info : orderedVbts) {
|
||||||
|
int ordinal = vbtOffsets.indexOf(info.finalOffset());
|
||||||
|
updateVbt(vxtManager, info, ordinal == -1 ? null : ordinal);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (VXT t : finalVftByOffset.values()) {
|
||||||
|
VirtualFunctionTable vft = (VirtualFunctionTable) t;
|
||||||
|
updateVftFromSelf(vft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Note sure what the final information will look like when we are done. For this stopping
|
// Note sure what the final information will look like when we are done. For this stopping
|
||||||
// point, this method stores what we currently want to store
|
// point, this method stores what we currently want to store
|
||||||
/**
|
/**
|
||||||
|
@ -1529,7 +1573,7 @@ public class CppCompositeType {
|
||||||
myVftPtrOffset = vftPtrTypeByOffset.firstKey();
|
myVftPtrOffset = vftPtrTypeByOffset.firstKey();
|
||||||
VxtPtrInfo info =
|
VxtPtrInfo info =
|
||||||
new VxtPtrInfo(myVftPtrOffset, myVftPtrOffset, myId, List.of(myId));
|
new VxtPtrInfo(myVftPtrOffset, myVftPtrOffset, myId, List.of(myId));
|
||||||
VirtualFunctionTable myVft = vxtManager.findVft(myId, info.parentage(), 0);
|
VirtualFunctionTable myVft = vxtManager.findCreateVft(myId, info.parentage(), 0);
|
||||||
myVft.setPtrOffsetInClass(info.finalOffset());
|
myVft.setPtrOffsetInClass(info.finalOffset());
|
||||||
propagatedSelfBaseVfts.add(info);
|
propagatedSelfBaseVfts.add(info);
|
||||||
finalVftByOffset.put(info.finalOffset(), myVft);
|
finalVftByOffset.put(info.finalOffset(), myVft);
|
||||||
|
@ -1566,7 +1610,7 @@ public class CppCompositeType {
|
||||||
Msg.warn(this, "Mismatch vbt location for " + myId);
|
Msg.warn(this, "Mismatch vbt location for " + myId);
|
||||||
}
|
}
|
||||||
VxtPtrInfo info = new VxtPtrInfo(vbtPtrOffset, vbtPtrOffset, myId, List.of(myId));
|
VxtPtrInfo info = new VxtPtrInfo(vbtPtrOffset, vbtPtrOffset, myId, List.of(myId));
|
||||||
VirtualBaseTable myVbt = vxtManager.findVbt(myId, info.parentage(), 0);
|
VirtualBaseTable myVbt = vxtManager.findCreateVbt(myId, info.parentage(), 0);
|
||||||
myVbt.setPtrOffsetInClass(info.finalOffset());
|
myVbt.setPtrOffsetInClass(info.finalOffset());
|
||||||
propagatedSelfBaseVbts.add(info);
|
propagatedSelfBaseVbts.add(info);
|
||||||
finalVbtByOffset.put(info.finalOffset(), myVbt);
|
finalVbtByOffset.put(info.finalOffset(), myVbt);
|
||||||
|
@ -1600,6 +1644,77 @@ public class CppCompositeType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This method might eventually go away if we are able to eliminate the method that calls it.
|
||||||
|
// See those comments. We would keep the other version of this method that is found below it.
|
||||||
|
/**
|
||||||
|
* Updates vftable entries with values from this class that override those of parent classes
|
||||||
|
*/
|
||||||
|
private VirtualFunctionTable updateVft(VxtManager vxtManager, VxtPtrInfo info,
|
||||||
|
Integer ordinal) {
|
||||||
|
if (!(vxtManager instanceof MsVxtManager mvxtManager)) {
|
||||||
|
// error
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<ClassID> parentage = info.parentage();
|
||||||
|
List<ClassID> parentParentage = parentage.subList(0, parentage.size() - 1);
|
||||||
|
|
||||||
|
Long finalOffset = info.finalOffset();
|
||||||
|
VirtualFunctionTable myVft = (VirtualFunctionTable) finalVftByOffset.get(finalOffset);
|
||||||
|
if (myVft == null) {
|
||||||
|
myVft = mvxtManager.findCreateVft(myId, info.parentage(), ordinal);
|
||||||
|
if (myVft == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
finalVftByOffset.put(finalOffset, myVft);
|
||||||
|
}
|
||||||
|
|
||||||
|
myVft.setPtrOffsetInClass(finalOffset);
|
||||||
|
if (parentParentage.isEmpty()) {
|
||||||
|
return myVft;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassID parentId = parentParentage.getLast();
|
||||||
|
VirtualFunctionTable parentVft = mvxtManager.findCreateVft(parentId, parentParentage, null);
|
||||||
|
if (parentVft == null) {
|
||||||
|
// this is an error
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<Integer, VirtualFunctionTableEntry> mapEntry : parentVft
|
||||||
|
.getEntriesByTableIndex()
|
||||||
|
.entrySet()) {
|
||||||
|
int tableOffset = mapEntry.getKey();
|
||||||
|
VFTableEntry e = mapEntry.getValue();
|
||||||
|
SymbolPath parentOrigPath = e.getOriginalPath();
|
||||||
|
SymbolPath parentPath = e.getOverridePath();
|
||||||
|
VFTableEntry currentEntry = myVft.getEntry(tableOffset);
|
||||||
|
if (currentEntry != null) {
|
||||||
|
SymbolPath currentOrigPath = currentEntry.getOriginalPath();
|
||||||
|
SymbolPath currentPath = currentEntry.getOverridePath();
|
||||||
|
// Note that this check also checks the method name
|
||||||
|
if (!parentOrigPath.equals(currentOrigPath)) {
|
||||||
|
// problem
|
||||||
|
}
|
||||||
|
boolean parentOverride = !parentOrigPath.equals(parentPath);
|
||||||
|
boolean currentOverride = !currentOrigPath.equals(currentPath);
|
||||||
|
if (!currentOverride && parentOverride) {
|
||||||
|
myVft.addEntry(tableOffset, parentOrigPath, parentPath, e.getFunctionPointer());
|
||||||
|
}
|
||||||
|
else if (currentOverride && !parentOverride) {
|
||||||
|
myVft.addEntry(tableOffset, currentOrigPath, currentPath,
|
||||||
|
e.getFunctionPointer());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// maybe order matters?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
myVft.addEntry(tableOffset, parentOrigPath, parentPath, e.getFunctionPointer());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return myVft;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates vftable entries with values from this class that override those of parent classes
|
* Updates vftable entries with values from this class that override those of parent classes
|
||||||
*/
|
*/
|
||||||
|
@ -1624,8 +1739,8 @@ public class CppCompositeType {
|
||||||
Long finalOffset = info.finalOffset();
|
Long finalOffset = info.finalOffset();
|
||||||
VirtualFunctionTable myVft = (VirtualFunctionTable) finalVftByOffset.get(finalOffset);
|
VirtualFunctionTable myVft = (VirtualFunctionTable) finalVftByOffset.get(finalOffset);
|
||||||
if (myVft == null) {
|
if (myVft == null) {
|
||||||
Integer ordinal = getOrdinalOfKey(finalVftByOffset, finalOffset);
|
Integer ordinal = getOrdinalOfKey(finalVftPtrInfoByOffset, finalOffset);
|
||||||
myVft = mvxtManager.findVft(myId, info.parentage(), ordinal);
|
myVft = mvxtManager.findCreateVft(myId, info.parentage(), ordinal);
|
||||||
if (myVft == null) {
|
if (myVft == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1633,7 +1748,7 @@ public class CppCompositeType {
|
||||||
}
|
}
|
||||||
|
|
||||||
myVft.setPtrOffsetInClass(finalOffset);
|
myVft.setPtrOffsetInClass(finalOffset);
|
||||||
VirtualFunctionTable parentVft = mvxtManager.findVft(parentId, parentParentage, null);
|
VirtualFunctionTable parentVft = mvxtManager.findCreateVft(parentId, parentParentage, null);
|
||||||
|
|
||||||
if (parentVft == null) {
|
if (parentVft == null) {
|
||||||
// this is an error
|
// this is an error
|
||||||
|
@ -1727,6 +1842,51 @@ public class CppCompositeType {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This method might eventually go away if we are able to eliminate the method that calls it.
|
||||||
|
// See those comments. We would keep the other version of this method that is found below it.
|
||||||
|
|
||||||
|
// TODO: Remove? Believe that only the main VBT should ever possibly get updated. The others
|
||||||
|
// will only get updated in size when they are the main VBT within those respective base
|
||||||
|
// classes.
|
||||||
|
private VirtualBaseTable updateVbt(VxtManager vxtManager, VxtPtrInfo info, Integer ordinal) {
|
||||||
|
if (!(vxtManager instanceof MsVxtManager mvxtManager)) {
|
||||||
|
// error
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
List<ClassID> parentage = info.parentage();
|
||||||
|
List<ClassID> parentParentage = parentage.subList(0, parentage.size() - 1);
|
||||||
|
|
||||||
|
Long finalOffset = info.finalOffset();
|
||||||
|
VirtualBaseTable myVbt = (VirtualBaseTable) finalVbtByOffset.get(finalOffset);
|
||||||
|
if (myVbt == null) {
|
||||||
|
myVbt = mvxtManager.findCreateVbt(myId, info.parentage(), ordinal);
|
||||||
|
if (myVbt == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
finalVbtByOffset.put(finalOffset, myVbt);
|
||||||
|
}
|
||||||
|
|
||||||
|
myVbt.setPtrOffsetInClass(finalOffset);
|
||||||
|
if (parentParentage.isEmpty()) {
|
||||||
|
return myVbt;
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassID parentId = parentParentage.getLast();
|
||||||
|
VirtualBaseTable parentVbt = mvxtManager.findCreateVbt(parentId, parentParentage, null);
|
||||||
|
if (parentVbt == null) {
|
||||||
|
// this is an error
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
for (Map.Entry<Integer, VirtualBaseTableEntry> mapEntry : parentVbt.getEntriesByTableIndex()
|
||||||
|
.entrySet()) {
|
||||||
|
int tableOffset = mapEntry.getKey();
|
||||||
|
VBTableEntry e = mapEntry.getValue();
|
||||||
|
myVbt.addEntry(tableOffset, e.getClassId());
|
||||||
|
}
|
||||||
|
|
||||||
|
return myVbt;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Remove? Believe that only the main VBT should ever possibly get updated. The others
|
// TODO: Remove? Believe that only the main VBT should ever possibly get updated. The others
|
||||||
// will only get updated in size when they are the main VBT within those respective base
|
// will only get updated in size when they are the main VBT within those respective base
|
||||||
// classes.
|
// classes.
|
||||||
|
@ -1751,8 +1911,8 @@ public class CppCompositeType {
|
||||||
Long finalOffset = info.finalOffset();
|
Long finalOffset = info.finalOffset();
|
||||||
VirtualBaseTable myVbt = (VirtualBaseTable) finalVbtByOffset.get(finalOffset);
|
VirtualBaseTable myVbt = (VirtualBaseTable) finalVbtByOffset.get(finalOffset);
|
||||||
if (myVbt == null) {
|
if (myVbt == null) {
|
||||||
Integer ordinal = getOrdinalOfKey(finalVbtByOffset, finalOffset);
|
Integer ordinal = getOrdinalOfKey(finalVbtPtrInfoByOffset, finalOffset);
|
||||||
myVbt = mvxtManager.findVbt(myId, info.parentage(), ordinal);
|
myVbt = mvxtManager.findCreateVbt(myId, info.parentage(), ordinal);
|
||||||
if (myVbt == null) {
|
if (myVbt == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
@ -1760,7 +1920,7 @@ public class CppCompositeType {
|
||||||
}
|
}
|
||||||
|
|
||||||
myVbt.setPtrOffsetInClass(finalOffset);
|
myVbt.setPtrOffsetInClass(finalOffset);
|
||||||
VirtualBaseTable parentVbt = mvxtManager.findVbt(parentId, parentParentage, null);
|
VirtualBaseTable parentVbt = mvxtManager.findCreateVbt(parentId, parentParentage, null);
|
||||||
if (parentVbt == null) {
|
if (parentVbt == null) {
|
||||||
// this is an error
|
// this is an error
|
||||||
return null;
|
return null;
|
||||||
|
@ -1775,9 +1935,9 @@ public class CppCompositeType {
|
||||||
return myVbt;
|
return myVbt;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Integer getOrdinalOfKey(Map<Long, VXT> map, Long key) {
|
private Integer getOrdinalOfKey(TreeMap<Long, VxtPtrInfo> map, Long key) {
|
||||||
int index = 0;
|
int index = 0;
|
||||||
for (Long offset : finalVftByOffset.keySet()) {
|
for (Long offset : map.keySet()) {
|
||||||
if (offset == key) {
|
if (offset == key) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7184,6 +7184,132 @@ public class Cfb432ProgramCreator extends ProgramCreator {
|
||||||
speculatedVxtStructs.put(M, getSpeculatedVxtStructsM());
|
speculatedVxtStructs.put(M, getSpeculatedVxtStructsM());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, String> expectedVxtAddressTypes = new LinkedHashMap<>();
|
||||||
|
static {
|
||||||
|
expectedVxtAddressTypes.put("00458268", "/ANS/A/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004582bc", "/BNS/B/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00458310", "/CNS/C/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("0045837c", "/DNS/D/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00458390", "/DNS/D/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("0045839c", "/DNS/D/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004583f8", "/ENS/E/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00458410", "/ENS/E/!internal/VTABLE_00000034");
|
||||||
|
expectedVxtAddressTypes.put("0045842c", "/FNS/F/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458444", "/GNS/G/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0045845c", "/HNS/H/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458474", "/INS/I/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0045847c", "/INS/I/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00458494", "/JNS/J/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004584ac", "/KNS/K/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004584c4", "/LNS/L/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458564", "/MNS/M/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00458584", "/MNS/M/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00458598", "/MNS/M/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("004585a4", "/MNS/M/!internal/VTABLE_0000002c");
|
||||||
|
expectedVxtAddressTypes.put("004585b0", "/MNS/M/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("004585b8", "/MNS/M/!internal/VTABLE_00000044");
|
||||||
|
expectedVxtAddressTypes.put("004585c0", "/MNS/M/!internal/VTABLE_00000054");
|
||||||
|
expectedVxtAddressTypes.put("004585c8", "/MNS/M/!internal/VTABLE_00000094");
|
||||||
|
expectedVxtAddressTypes.put("00458628", "/O1NS/O1/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("0045863c", "/O1NS/O1/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("0045869c", "/O2NS/O2/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004586b4", "/O2NS/O2/!internal/VTABLE_00000034");
|
||||||
|
expectedVxtAddressTypes.put("00458714", "/O3NS/O3/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00458728", "/O3NS/O3/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00458788", "/O4NS/O4/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004587a0", "/O4NS/O4/!internal/VTABLE_00000034");
|
||||||
|
expectedVxtAddressTypes.put("00458838", "/ONS/O/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00458858", "/ONS/O/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00458864", "/ONS/O/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("0045887c", "/ONS/O/!internal/VTABLE_00000054");
|
||||||
|
expectedVxtAddressTypes.put("00458888", "/ONS/O/!internal/VTABLE_00000060");
|
||||||
|
expectedVxtAddressTypes.put("0045889c", "/ONS/O/!internal/VTABLE_0000006c");
|
||||||
|
expectedVxtAddressTypes.put("004588a8", "/ONS/O/!internal/VTABLE_0000007c");
|
||||||
|
expectedVxtAddressTypes.put("00458224", "/A1NS/A1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458234", "/A2NS/A2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458244", "/ANS/A/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0045824c", "/ANS/A/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("0045825c", "/ANS/A/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00458278", "/B1NS/B1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458288", "/B2NS/B2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458298", "/BNS/B/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004582a0", "/BNS/B/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004582b0", "/BNS/B/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004582cc", "/CNS/C/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004582d4", "/CNS/C/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004582e4", "/CNS/C/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004582f4", "/CNS/C/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("00458304", "/CNS/C/!internal/VTABLE_00000024");
|
||||||
|
expectedVxtAddressTypes.put("00458328", "/DNS/D/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458330", "/DNS/D/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00458338", "/DNS/D/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("00458340", "/DNS/D/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("00458350", "/DNS/D/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("00458360", "/DNS/D/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("00458370", "/DNS/D/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("004583ac", "/ENS/E/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004583b4", "/ENS/E/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004583c4", "/ENS/E/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("004583d4", "/ENS/E/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("004583e4", "/ENS/E/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("004583f4", "/ENS/E/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("00458420", "/FNS/F/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00458438", "/GNS/G/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00458450", "/HNS/H/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00458468", "/INS/I/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("00458488", "/JNS/J/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004584a0", "/KNS/K/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004584b8", "/LNS/L/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004584d0", "/N1NS/N1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004584dc", "/N2NS/N2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004584e8", "/MNS/M/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004584f0", "/MNS/M/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004584f8", "/MNS/M/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("00458500", "/MNS/M/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("00458508", "/MNS/M/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("00458514", "/MNS/M/!internal/VTABLE_00000070");
|
||||||
|
expectedVxtAddressTypes.put("00458524", "/MNS/M/!internal/VTABLE_00000078");
|
||||||
|
expectedVxtAddressTypes.put("00458534", "/MNS/M/!internal/VTABLE_00000080");
|
||||||
|
expectedVxtAddressTypes.put("00458544", "/MNS/M/!internal/VTABLE_00000088");
|
||||||
|
expectedVxtAddressTypes.put("00458554", "/MNS/M/!internal/VTABLE_00000090");
|
||||||
|
expectedVxtAddressTypes.put("0045855c", "/MNS/M/!internal/VTABLE_0000009c");
|
||||||
|
expectedVxtAddressTypes.put("004585d8", "/O1NS/O1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004585e4", "/O1NS/O1/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004585ec", "/O1NS/O1/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004585fc", "/O1NS/O1/!internal/VTABLE_00000024");
|
||||||
|
expectedVxtAddressTypes.put("0045860c", "/O1NS/O1/!internal/VTABLE_0000002c");
|
||||||
|
expectedVxtAddressTypes.put("0045861c", "/O1NS/O1/!internal/VTABLE_00000034");
|
||||||
|
expectedVxtAddressTypes.put("0045864c", "/O2NS/O2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458658", "/O2NS/O2/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00458668", "/O2NS/O2/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("00458678", "/O2NS/O2/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("00458688", "/O2NS/O2/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("00458698", "/O2NS/O2/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("004586c4", "/O3NS/O3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004586d0", "/O3NS/O3/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004586d8", "/O3NS/O3/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004586e8", "/O3NS/O3/!internal/VTABLE_00000024");
|
||||||
|
expectedVxtAddressTypes.put("004586f8", "/O3NS/O3/!internal/VTABLE_0000002c");
|
||||||
|
expectedVxtAddressTypes.put("00458708", "/O3NS/O3/!internal/VTABLE_00000034");
|
||||||
|
expectedVxtAddressTypes.put("00458738", "/O4NS/O4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00458744", "/O4NS/O4/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00458754", "/O4NS/O4/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("00458764", "/O4NS/O4/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("00458774", "/O4NS/O4/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("00458784", "/O4NS/O4/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("004587b0", "/ONS/O/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004587c0", "/ONS/O/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004587c8", "/ONS/O/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004587d4", "/ONS/O/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("004587e4", "/ONS/O/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("004587f4", "/ONS/O/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("00458804", "/ONS/O/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("00458814", "/ONS/O/!internal/VTABLE_00000050");
|
||||||
|
expectedVxtAddressTypes.put("0045881c", "/ONS/O/!internal/VTABLE_0000005c");
|
||||||
|
expectedVxtAddressTypes.put("00458828", "/ONS/O/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("00458830", "/ONS/O/!internal/VTABLE_00000078");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -7225,6 +7351,10 @@ public class Cfb432ProgramCreator extends ProgramCreator {
|
||||||
return speculatedVxtStructs;
|
return speculatedVxtStructs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExpectedVxtAddressTypes() {
|
||||||
|
return expectedVxtAddressTypes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|
|
@ -7323,6 +7323,132 @@ public class Cfb464ProgramCreator extends ProgramCreator {
|
||||||
speculatedVxtStructs.put(M, getSpeculatedVxtStructsM());
|
speculatedVxtStructs.put(M, getSpeculatedVxtStructsM());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, String> expectedVxtAddressTypes = new LinkedHashMap<>();
|
||||||
|
static {
|
||||||
|
expectedVxtAddressTypes.put("14006f518", "/ANS/A/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006f5b8", "/BNS/B/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006f658", "/CNS/C/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006f720", "/DNS/D/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006f734", "/DNS/D/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006f740", "/DNS/D/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006f7f0", "/ENS/E/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006f808", "/ENS/E/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("14006f838", "/FNS/F/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f860", "/GNS/G/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f888", "/HNS/H/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f8b0", "/INS/I/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f8b8", "/INS/I/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f8e0", "/JNS/J/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f908", "/KNS/K/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f930", "/LNS/L/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006fa68", "/MNS/M/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006fa88", "/MNS/M/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("14006fa9c", "/MNS/M/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("14006faa8", "/MNS/M/!internal/VTABLE_00000058");
|
||||||
|
expectedVxtAddressTypes.put("14006fab4", "/MNS/M/!internal/VTABLE_00000070");
|
||||||
|
expectedVxtAddressTypes.put("14006fabc", "/MNS/M/!internal/VTABLE_00000088");
|
||||||
|
expectedVxtAddressTypes.put("14006fac4", "/MNS/M/!internal/VTABLE_000000a8");
|
||||||
|
expectedVxtAddressTypes.put("14006facc", "/MNS/M/!internal/VTABLE_00000128");
|
||||||
|
expectedVxtAddressTypes.put("14006fb80", "/O1NS/O1/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006fb94", "/O1NS/O1/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006fc48", "/O2NS/O2/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006fc60", "/O2NS/O2/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("14006fd18", "/O3NS/O3/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006fd2c", "/O3NS/O3/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006fde0", "/O4NS/O4/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006fdf8", "/O4NS/O4/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("14006ff20", "/ONS/O/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("14006ff40", "/ONS/O/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006ff4c", "/ONS/O/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("14006ff64", "/ONS/O/!internal/VTABLE_000000a8");
|
||||||
|
expectedVxtAddressTypes.put("14006ff70", "/ONS/O/!internal/VTABLE_000000c0");
|
||||||
|
expectedVxtAddressTypes.put("14006ff84", "/ONS/O/!internal/VTABLE_000000d8");
|
||||||
|
expectedVxtAddressTypes.put("14006ff90", "/ONS/O/!internal/VTABLE_000000f8");
|
||||||
|
expectedVxtAddressTypes.put("14006f490", "/A1NS/A1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f4b0", "/A2NS/A2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f4d0", "/ANS/A/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f4e0", "/ANS/A/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f500", "/ANS/A/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("14006f530", "/B1NS/B1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f550", "/B2NS/B2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f570", "/BNS/B/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f580", "/BNS/B/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f5a0", "/BNS/B/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("14006f5d0", "/CNS/C/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f5e0", "/CNS/C/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f600", "/CNS/C/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("14006f620", "/CNS/C/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006f640", "/CNS/C/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("14006f678", "/DNS/D/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f688", "/DNS/D/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f698", "/DNS/D/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("14006f6a8", "/DNS/D/!internal/VTABLE_00000050");
|
||||||
|
expectedVxtAddressTypes.put("14006f6c8", "/DNS/D/!internal/VTABLE_00000060");
|
||||||
|
expectedVxtAddressTypes.put("14006f6e8", "/DNS/D/!internal/VTABLE_00000070");
|
||||||
|
expectedVxtAddressTypes.put("14006f708", "/DNS/D/!internal/VTABLE_00000080");
|
||||||
|
expectedVxtAddressTypes.put("14006f758", "/ENS/E/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f768", "/ENS/E/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006f788", "/ENS/E/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("14006f7a8", "/ENS/E/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("14006f7c8", "/ENS/E/!internal/VTABLE_00000050");
|
||||||
|
expectedVxtAddressTypes.put("14006f7e8", "/ENS/E/!internal/VTABLE_00000060");
|
||||||
|
expectedVxtAddressTypes.put("14006f820", "/FNS/F/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("14006f848", "/GNS/G/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f870", "/HNS/H/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f898", "/INS/I/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006f8c8", "/JNS/J/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("14006f8f0", "/KNS/K/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006f918", "/LNS/L/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006f940", "/N1NS/N1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f958", "/N2NS/N2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f970", "/MNS/M/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006f980", "/MNS/M/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006f990", "/MNS/M/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006f9a0", "/MNS/M/!internal/VTABLE_00000050");
|
||||||
|
expectedVxtAddressTypes.put("14006f9b0", "/MNS/M/!internal/VTABLE_000000d0");
|
||||||
|
expectedVxtAddressTypes.put("14006f9c8", "/MNS/M/!internal/VTABLE_000000e0");
|
||||||
|
expectedVxtAddressTypes.put("14006f9e8", "/MNS/M/!internal/VTABLE_000000f0");
|
||||||
|
expectedVxtAddressTypes.put("14006fa08", "/MNS/M/!internal/VTABLE_00000100");
|
||||||
|
expectedVxtAddressTypes.put("14006fa28", "/MNS/M/!internal/VTABLE_00000110");
|
||||||
|
expectedVxtAddressTypes.put("14006fa48", "/MNS/M/!internal/VTABLE_00000120");
|
||||||
|
expectedVxtAddressTypes.put("14006fa58", "/MNS/M/!internal/VTABLE_00000138");
|
||||||
|
expectedVxtAddressTypes.put("14006fae0", "/O1NS/O1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006faf8", "/O1NS/O1/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006fb08", "/O1NS/O1/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006fb28", "/O1NS/O1/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("14006fb48", "/O1NS/O1/!internal/VTABLE_00000058");
|
||||||
|
expectedVxtAddressTypes.put("14006fb68", "/O1NS/O1/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("14006fba8", "/O2NS/O2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006fbc0", "/O2NS/O2/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006fbe0", "/O2NS/O2/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("14006fc00", "/O2NS/O2/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("14006fc20", "/O2NS/O2/!internal/VTABLE_00000050");
|
||||||
|
expectedVxtAddressTypes.put("14006fc40", "/O2NS/O2/!internal/VTABLE_00000060");
|
||||||
|
expectedVxtAddressTypes.put("14006fc78", "/O3NS/O3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006fc90", "/O3NS/O3/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006fca0", "/O3NS/O3/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006fcc0", "/O3NS/O3/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("14006fce0", "/O3NS/O3/!internal/VTABLE_00000058");
|
||||||
|
expectedVxtAddressTypes.put("14006fd00", "/O3NS/O3/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("14006fd40", "/O4NS/O4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006fd58", "/O4NS/O4/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("14006fd78", "/O4NS/O4/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("14006fd98", "/O4NS/O4/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("14006fdb8", "/O4NS/O4/!internal/VTABLE_00000050");
|
||||||
|
expectedVxtAddressTypes.put("14006fdd8", "/O4NS/O4/!internal/VTABLE_00000060");
|
||||||
|
expectedVxtAddressTypes.put("14006fe10", "/ONS/O/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("14006fe30", "/ONS/O/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("14006fe40", "/ONS/O/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("14006fe58", "/ONS/O/!internal/VTABLE_00000060");
|
||||||
|
expectedVxtAddressTypes.put("14006fe78", "/ONS/O/!internal/VTABLE_00000070");
|
||||||
|
expectedVxtAddressTypes.put("14006fe98", "/ONS/O/!internal/VTABLE_00000080");
|
||||||
|
expectedVxtAddressTypes.put("14006feb8", "/ONS/O/!internal/VTABLE_00000090");
|
||||||
|
expectedVxtAddressTypes.put("14006fed8", "/ONS/O/!internal/VTABLE_000000a0");
|
||||||
|
expectedVxtAddressTypes.put("14006fee8", "/ONS/O/!internal/VTABLE_000000b8");
|
||||||
|
expectedVxtAddressTypes.put("14006ff00", "/ONS/O/!internal/VTABLE_000000d0");
|
||||||
|
expectedVxtAddressTypes.put("14006ff10", "/ONS/O/!internal/VTABLE_000000f0");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -7364,6 +7490,10 @@ public class Cfb464ProgramCreator extends ProgramCreator {
|
||||||
return speculatedVxtStructs;
|
return speculatedVxtStructs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExpectedVxtAddressTypes() {
|
||||||
|
return expectedVxtAddressTypes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|
|
@ -17643,6 +17643,146 @@ public class Egray832ProgramCreator extends ProgramCreator {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, String> expectedVxtAddressTypes = new LinkedHashMap<>();
|
||||||
|
static {
|
||||||
|
expectedVxtAddressTypes.put("0044619c", "/G/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461a4", "/H/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461ac", "/GG1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461b4", "/GG2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461bc", "/GG3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461c4", "/GG4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461cc", "/I/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461d4", "/I/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004461dc", "/GX1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461e4", "/HX1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461ec", "/IX1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004461f4", "/IX1/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004461fc", "/G1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446208", "/H1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446214", "/I1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446220", "/I1/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446228", "/I2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446234", "/I2/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446240", "/I3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0044624c", "/I3/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446258", "/I4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446264", "/I5/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446270", "/J1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0044627c", "/J1/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446284", "/J1/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446290", "/J1/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("0044629c", "/J2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004462a8", "/J2/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004462b4", "/J2/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004462c0", "/J2/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004462c8", "/J3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004462d4", "/J3/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004462e0", "/J3/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004462ec", "/J3/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004462f4", "/J4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446310", "/J4/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("0044631c", "/J4/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446324", "/J4/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("0044632c", "/J4/!internal/VTABLE_00000024");
|
||||||
|
expectedVxtAddressTypes.put("00446334", "/J4/!internal/VTABLE_0000004c");
|
||||||
|
expectedVxtAddressTypes.put("0044633c", "/J4/!internal/VTABLE_00000054");
|
||||||
|
expectedVxtAddressTypes.put("00446344", "/J5/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446360", "/J5/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("0044636c", "/J5/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446374", "/J5/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("0044637c", "/J5/!internal/VTABLE_00000024");
|
||||||
|
expectedVxtAddressTypes.put("00446384", "/J5/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("0044638c", "/J5/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("00446394", "/J6/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004463a8", "/J6/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004463b0", "/J6/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004463fc", "/T/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00446414", "/U/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00446434", "/AA3a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0044643c", "/AA3b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446444", "/AA3c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446450", "/AA3c/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446458", "/AA3d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0044646c", "/AA3d/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("00446474", "/AA3d/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("0044647c", "/AA3g/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446488", "/AA4a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446490", "/AA4b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446498", "/AA4c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004464a0", "/AA4c/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004464a8", "/AA4d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004464b4", "/AA4d/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("004464bc", "/AA4e/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004464c8", "/AA4e/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("004464d0", "/AA4f/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004464e0", "/AA4f/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004464e8", "/AA4f/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("004464f0", "/AA4g/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004464f8", "/AA4j/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446500", "/AA4k/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446508", "/AA4m/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446510", "/AA4n/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446518", "/AA4p/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446520", "/AA4q/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446528", "/AA4q/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00446530", "/AA5e/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00446538", "/AA5f/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00446540", "/AA5g/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("0044654c", "/AA5g/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446554", "/AA5h/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00446560", "/AA5h/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446568", "/AA5j/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("0044657c", "/AA5j/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00446588", "/AA5j/!internal/VTABLE_00000024");
|
||||||
|
expectedVxtAddressTypes.put("00446590", "/AA5j/!internal/VTABLE_00000034");
|
||||||
|
expectedVxtAddressTypes.put("00446598", "/AA6c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465a0", "/AA6g/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465a8", "/AA6h/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465b4", "/AA6h/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004465bc", "/AA6j/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465c8", "/AA6j/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446624", "/AA7d/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00446630", "/BB1c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446638", "/BB1d/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446640", "/BB2a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446648", "/BB2b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446650", "/BB2c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0044665c", "/BB2c/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00446664", "/BB2d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446670", "/BB2d/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("0044667c", "/BB2d/!internal/VTABLE_0000001c");
|
||||||
|
expectedVxtAddressTypes.put("00446684", "/BB2e/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0044668c", "/BB3d/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446694", "/BB3e/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004466a0", "/BB3f/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004466b0", "/BB3f/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004466bc", "/BB3g/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004466cc", "/BB3g/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("004466d4", "/CC1h/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004466f0", "/DD1b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004466f8", "/DD1c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446700", "/DD1d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004463bc", "/P/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004463c4", "/Q/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004463d0", "/R/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004463dc", "/S/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004463e4", "/S/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004463f0", "/T/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004463f8", "/T/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00446408", "/U/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446410", "/U/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00446420", "/V/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446428", "/W/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446430", "/WW/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465d4", "/AA7a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465e0", "/AA7b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465ec", "/AA7c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004465fc", "/AA7c/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00446608", "/AA7d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00446610", "/AA7d/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("0044661c", "/AA7d/!internal/VTABLE_00000014");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -17684,6 +17824,10 @@ public class Egray832ProgramCreator extends ProgramCreator {
|
||||||
return speculatedVxtStructs;
|
return speculatedVxtStructs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExpectedVxtAddressTypes() {
|
||||||
|
return expectedVxtAddressTypes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|
|
@ -17971,6 +17971,146 @@ public class Egray864ProgramCreator extends ProgramCreator {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, String> expectedVxtAddressTypes = new LinkedHashMap<>();
|
||||||
|
static {
|
||||||
|
expectedVxtAddressTypes.put("140056370", "/G/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056378", "/H/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056380", "/GG1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056388", "/GG2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056390", "/GG3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056398", "/GG4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563a0", "/I/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563a8", "/I/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("1400563b0", "/GX1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563b8", "/HX1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563c0", "/IX1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563c8", "/IX1/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400563d0", "/G1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563e0", "/H1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400563f0", "/I1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056400", "/I1/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056408", "/I2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056418", "/I2/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056428", "/I3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056438", "/I3/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056448", "/I4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056458", "/I5/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056468", "/J1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056478", "/J1/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056480", "/J1/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056490", "/J1/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("1400564a0", "/J2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400564b0", "/J2/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("1400564c0", "/J2/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("1400564d0", "/J2/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("1400564d8", "/J3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400564e8", "/J3/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("1400564f8", "/J3/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056508", "/J3/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("140056510", "/J4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056530", "/J4/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056540", "/J4/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056548", "/J4/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("140056550", "/J4/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("140056558", "/J4/!internal/VTABLE_00000080");
|
||||||
|
expectedVxtAddressTypes.put("140056560", "/J4/!internal/VTABLE_00000090");
|
||||||
|
expectedVxtAddressTypes.put("140056568", "/J5/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056588", "/J5/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056598", "/J5/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("1400565a0", "/J5/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("1400565a8", "/J5/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("1400565b0", "/J5/!internal/VTABLE_00000078");
|
||||||
|
expectedVxtAddressTypes.put("1400565b8", "/J5/!internal/VTABLE_00000088");
|
||||||
|
expectedVxtAddressTypes.put("1400565c0", "/J6/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400565d8", "/J6/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("1400565e0", "/J6/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("140056670", "/T/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056698", "/U/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400566d0", "/AA3a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400566d8", "/AA3b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400566e0", "/AA3c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400566f0", "/AA3c/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("1400566f8", "/AA3d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056710", "/AA3d/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056718", "/AA3d/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("140056720", "/AA3g/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056730", "/AA4a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056738", "/AA4b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056740", "/AA4c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056748", "/AA4c/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056750", "/AA4d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056760", "/AA4d/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056768", "/AA4e/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056778", "/AA4e/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056780", "/AA4f/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056790", "/AA4f/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("140056798", "/AA4f/!internal/VTABLE_00000030");
|
||||||
|
expectedVxtAddressTypes.put("1400567a0", "/AA4g/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567a8", "/AA4j/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567b0", "/AA4k/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567b8", "/AA4m/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567c0", "/AA4n/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567c8", "/AA4p/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567d0", "/AA4q/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400567d8", "/AA4q/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("1400567e0", "/AA5e/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400567e8", "/AA5f/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400567f0", "/AA5g/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056800", "/AA5g/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056808", "/AA5h/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056818", "/AA5h/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140056820", "/AA5j/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056838", "/AA5j/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("140056848", "/AA5j/!internal/VTABLE_00000048");
|
||||||
|
expectedVxtAddressTypes.put("140056850", "/AA5j/!internal/VTABLE_00000068");
|
||||||
|
expectedVxtAddressTypes.put("140056858", "/AA6c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056860", "/AA6g/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056868", "/AA6h/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056878", "/AA6h/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("140056880", "/AA6j/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056890", "/AA6j/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("140056940", "/AA7d/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056950", "/BB1c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056958", "/BB1d/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056960", "/BB2a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056968", "/BB2b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056970", "/BB2c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056980", "/BB2c/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("140056988", "/BB2d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056998", "/BB2d/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("1400569a8", "/BB2d/!internal/VTABLE_00000038");
|
||||||
|
expectedVxtAddressTypes.put("1400569b0", "/BB2e/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400569b8", "/BB3d/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400569c0", "/BB3e/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400569d0", "/BB3f/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("1400569e0", "/BB3f/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("1400569f0", "/BB3g/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140056a00", "/BB3g/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("140056a08", "/CC1h/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056a28", "/DD1b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056a30", "/DD1c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056a38", "/DD1d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400565f0", "/P/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056600", "/Q/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056618", "/R/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056630", "/S/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056640", "/S/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056658", "/T/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056668", "/T/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("140056680", "/U/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056690", "/U/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("1400566a8", "/V/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400566b8", "/W/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400566c8", "/WW/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400568a0", "/AA7a/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400568b8", "/AA7b/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400568d0", "/AA7c/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400568f0", "/AA7c/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140056908", "/AA7d/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140056918", "/AA7d/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("140056930", "/AA7d/!internal/VTABLE_00000028");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -18012,6 +18152,10 @@ public class Egray864ProgramCreator extends ProgramCreator {
|
||||||
return speculatedVxtStructs;
|
return speculatedVxtStructs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExpectedVxtAddressTypes() {
|
||||||
|
return expectedVxtAddressTypes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|
|
@ -2868,6 +2868,37 @@ public class Vftm32ProgramCreator extends ProgramCreator {
|
||||||
speculatedVxtStructs.putAll(expectedVxtStructs);
|
speculatedVxtStructs.putAll(expectedVxtStructs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, String> expectedVxtAddressTypes = new LinkedHashMap<>();
|
||||||
|
static {
|
||||||
|
expectedVxtAddressTypes.put("004503cc", "/Q4NS/Q4/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00450434", "/Q5NS/Q5/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("0045049c", "/Q6NS/Q6/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00450508", "/Q7NS/Q7/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("00450600", "/R1NS/R1/!internal/VTABLE_00000004");
|
||||||
|
expectedVxtAddressTypes.put("004501e4", "/P1NS/P1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0045020c", "/P2NS/P2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00450240", "/Q1NS/Q1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00450270", "/Q1NS/Q1/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("004502a4", "/Q2NS/Q2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004502dc", "/Q2NS/Q2/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00450310", "/Q3NS/Q3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0045033c", "/Q3NS/Q3/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("00450370", "/Q4NS/Q4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004503a8", "/Q4NS/Q4/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004503d8", "/Q5NS/Q5/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00450404", "/Q5NS/Q5/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("00450440", "/Q6NS/Q6/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("0045046c", "/Q6NS/Q6/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("004504a8", "/Q7NS/Q7/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("004504b0", "/Q7NS/Q7/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("004504d8", "/Q7NS/Q7/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00450518", "/R1NS/R1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("00450534", "/R1NS/R1/!internal/VTABLE_0000000c");
|
||||||
|
expectedVxtAddressTypes.put("00450564", "/R1NS/R1/!internal/VTABLE_00000014");
|
||||||
|
expectedVxtAddressTypes.put("00450598", "/R1NS/R1/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("004505d0", "/R1NS/R1/!internal/VTABLE_00000028");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -2909,6 +2940,10 @@ public class Vftm32ProgramCreator extends ProgramCreator {
|
||||||
return speculatedVxtStructs;
|
return speculatedVxtStructs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExpectedVxtAddressTypes() {
|
||||||
|
return expectedVxtAddressTypes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|
|
@ -2904,6 +2904,37 @@ public class Vftm64ProgramCreator extends ProgramCreator {
|
||||||
speculatedVxtStructs.putAll(expectedVxtStructs);
|
speculatedVxtStructs.putAll(expectedVxtStructs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final Map<String, String> expectedVxtAddressTypes = new LinkedHashMap<>();
|
||||||
|
static {
|
||||||
|
expectedVxtAddressTypes.put("1400627d0", "/Q4NS/Q4/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140062898", "/Q5NS/Q5/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140062960", "/Q6NS/Q6/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140062a30", "/Q7NS/Q7/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140062c18", "/R1NS/R1/!internal/VTABLE_00000008");
|
||||||
|
expectedVxtAddressTypes.put("140062400", "/P1NS/P1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062450", "/P2NS/P2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400624b8", "/Q1NS/Q1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062518", "/Q1NS/Q1/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140062580", "/Q2NS/Q2/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400625f0", "/Q2NS/Q2/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140062658", "/Q3NS/Q3/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("1400626b0", "/Q3NS/Q3/!internal/VTABLE_00000010");
|
||||||
|
expectedVxtAddressTypes.put("140062718", "/Q4NS/Q4/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062788", "/Q4NS/Q4/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("1400627e0", "/Q5NS/Q5/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062838", "/Q5NS/Q5/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("1400628a8", "/Q6NS/Q6/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062900", "/Q6NS/Q6/!internal/VTABLE_00000020");
|
||||||
|
expectedVxtAddressTypes.put("140062970", "/Q7NS/Q7/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062980", "/Q7NS/Q7/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("1400629d0", "/Q7NS/Q7/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140062a48", "/R1NS/R1/!internal/VTABLE_00000000");
|
||||||
|
expectedVxtAddressTypes.put("140062a80", "/R1NS/R1/!internal/VTABLE_00000018");
|
||||||
|
expectedVxtAddressTypes.put("140062ae0", "/R1NS/R1/!internal/VTABLE_00000028");
|
||||||
|
expectedVxtAddressTypes.put("140062b48", "/R1NS/R1/!internal/VTABLE_00000040");
|
||||||
|
expectedVxtAddressTypes.put("140062bb8", "/R1NS/R1/!internal/VTABLE_00000050");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
//==============================================================================================
|
//==============================================================================================
|
||||||
|
@ -2945,6 +2976,10 @@ public class Vftm64ProgramCreator extends ProgramCreator {
|
||||||
return speculatedVxtStructs;
|
return speculatedVxtStructs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<String, String> getExpectedVxtAddressTypes() {
|
||||||
|
return expectedVxtAddressTypes;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
protected List<DataType> getRegularTypes(DataTypeManager dtm) throws PdbException {
|
||||||
return List.of();
|
return List.of();
|
||||||
|
|
|
@ -293,7 +293,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
// vbt obtained by querying on parentage
|
// vbt obtained by querying on parentage
|
||||||
ProgramVirtualBaseTable pvbt =
|
ProgramVirtualBaseTable pvbt =
|
||||||
(ProgramVirtualBaseTable) egray832VxtManager.findVbt(owner, parentage, null);
|
(ProgramVirtualBaseTable) egray832VxtManager.findCreateVbt(owner, parentage, null);
|
||||||
assertEquals(egray832AddressesByMangled.get(pvbt.getMangledName()), pvbt.getAddress());
|
assertEquals(egray832AddressesByMangled.get(pvbt.getMangledName()), pvbt.getAddress());
|
||||||
if (symParentage == null) {
|
if (symParentage == null) {
|
||||||
Msg.warn(this,
|
Msg.warn(this,
|
||||||
|
@ -303,7 +303,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
}
|
}
|
||||||
// vbt obtained by querying on msft symbol info
|
// vbt obtained by querying on msft symbol info
|
||||||
ProgramVirtualBaseTable mvbt =
|
ProgramVirtualBaseTable mvbt =
|
||||||
(ProgramVirtualBaseTable) egray832VxtManager.findVbt(owner, symParentage, null);
|
(ProgramVirtualBaseTable) egray832VxtManager.findCreateVbt(owner, symParentage, null);
|
||||||
// Check if exact same table; not just equivalence
|
// Check if exact same table; not just equivalence
|
||||||
assertTrue(mvbt == pvbt);
|
assertTrue(mvbt == pvbt);
|
||||||
}
|
}
|
||||||
|
@ -329,7 +329,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
// vbt obtained by querying on parentage
|
// vbt obtained by querying on parentage
|
||||||
ProgramVirtualFunctionTable pvft =
|
ProgramVirtualFunctionTable pvft =
|
||||||
(ProgramVirtualFunctionTable) egray832VxtManager.findVft(owner, parentage, null);
|
(ProgramVirtualFunctionTable) egray832VxtManager.findCreateVft(owner, parentage, null);
|
||||||
assertEquals(egray832AddressesByMangled.get(pvft.getMangledName()), pvft.getAddress());
|
assertEquals(egray832AddressesByMangled.get(pvft.getMangledName()), pvft.getAddress());
|
||||||
if (symParentage == null) {
|
if (symParentage == null) {
|
||||||
Msg.warn(this,
|
Msg.warn(this,
|
||||||
|
@ -339,7 +339,8 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
}
|
}
|
||||||
// vbt obtained by querying on msft symbol info
|
// vbt obtained by querying on msft symbol info
|
||||||
ProgramVirtualFunctionTable mvft =
|
ProgramVirtualFunctionTable mvft =
|
||||||
(ProgramVirtualFunctionTable) egray832VxtManager.findVft(owner, symParentage, null);
|
(ProgramVirtualFunctionTable) egray832VxtManager.findCreateVft(owner, symParentage,
|
||||||
|
null);
|
||||||
// Check if exact same table; not just equivalence
|
// Check if exact same table; not just equivalence
|
||||||
assertTrue(mvft == pvft);
|
assertTrue(mvft == pvft);
|
||||||
}
|
}
|
||||||
|
@ -365,7 +366,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
// vbt obtained by querying on parentage
|
// vbt obtained by querying on parentage
|
||||||
ProgramVirtualBaseTable pvbt =
|
ProgramVirtualBaseTable pvbt =
|
||||||
(ProgramVirtualBaseTable) cfb432VxtManager.findVbt(owner, parentage, null);
|
(ProgramVirtualBaseTable) cfb432VxtManager.findCreateVbt(owner, parentage, null);
|
||||||
assertEquals(cfb432AddressesByMangled.get(pvbt.getMangledName()), pvbt.getAddress());
|
assertEquals(cfb432AddressesByMangled.get(pvbt.getMangledName()), pvbt.getAddress());
|
||||||
if (symParentage == null) {
|
if (symParentage == null) {
|
||||||
Msg.warn(this,
|
Msg.warn(this,
|
||||||
|
@ -375,7 +376,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
}
|
}
|
||||||
// vbt obtained by querying on msft symbol info
|
// vbt obtained by querying on msft symbol info
|
||||||
ProgramVirtualBaseTable mvbt =
|
ProgramVirtualBaseTable mvbt =
|
||||||
(ProgramVirtualBaseTable) cfb432VxtManager.findVbt(owner, symParentage, null);
|
(ProgramVirtualBaseTable) cfb432VxtManager.findCreateVbt(owner, symParentage, null);
|
||||||
// Check if exact same table; not just equivalence
|
// Check if exact same table; not just equivalence
|
||||||
assertTrue(mvbt == pvbt);
|
assertTrue(mvbt == pvbt);
|
||||||
}
|
}
|
||||||
|
@ -401,7 +402,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
// vbt obtained by querying on parentage
|
// vbt obtained by querying on parentage
|
||||||
ProgramVirtualFunctionTable pvft =
|
ProgramVirtualFunctionTable pvft =
|
||||||
(ProgramVirtualFunctionTable) cfb432VxtManager.findVft(owner, parentage, null);
|
(ProgramVirtualFunctionTable) cfb432VxtManager.findCreateVft(owner, parentage, null);
|
||||||
assertEquals(cfb432AddressesByMangled.get(pvft.getMangledName()), pvft.getAddress());
|
assertEquals(cfb432AddressesByMangled.get(pvft.getMangledName()), pvft.getAddress());
|
||||||
if (symParentage == null) {
|
if (symParentage == null) {
|
||||||
Msg.warn(this,
|
Msg.warn(this,
|
||||||
|
@ -411,7 +412,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
}
|
}
|
||||||
// vbt obtained by querying on msft symbol info
|
// vbt obtained by querying on msft symbol info
|
||||||
ProgramVirtualFunctionTable mvft =
|
ProgramVirtualFunctionTable mvft =
|
||||||
(ProgramVirtualFunctionTable) cfb432VxtManager.findVft(owner, symParentage, null);
|
(ProgramVirtualFunctionTable) cfb432VxtManager.findCreateVft(owner, symParentage, null);
|
||||||
// Check if exact same table; not just equivalence
|
// Check if exact same table; not just equivalence
|
||||||
assertTrue(mvft == pvft);
|
assertTrue(mvft == pvft);
|
||||||
}
|
}
|
||||||
|
@ -437,7 +438,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
// vbt obtained by querying on parentage
|
// vbt obtained by querying on parentage
|
||||||
ProgramVirtualBaseTable pvbt =
|
ProgramVirtualBaseTable pvbt =
|
||||||
(ProgramVirtualBaseTable) vftm32VxtManager.findVbt(owner, parentage, null);
|
(ProgramVirtualBaseTable) vftm32VxtManager.findCreateVbt(owner, parentage, null);
|
||||||
assertEquals(vftm32AddressesByMangled.get(pvbt.getMangledName()), pvbt.getAddress());
|
assertEquals(vftm32AddressesByMangled.get(pvbt.getMangledName()), pvbt.getAddress());
|
||||||
if (symParentage == null) {
|
if (symParentage == null) {
|
||||||
Msg.warn(this,
|
Msg.warn(this,
|
||||||
|
@ -447,7 +448,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
}
|
}
|
||||||
// vbt obtained by querying on msft symbol info
|
// vbt obtained by querying on msft symbol info
|
||||||
ProgramVirtualBaseTable mvbt =
|
ProgramVirtualBaseTable mvbt =
|
||||||
(ProgramVirtualBaseTable) vftm32VxtManager.findVbt(owner, symParentage, null);
|
(ProgramVirtualBaseTable) vftm32VxtManager.findCreateVbt(owner, symParentage, null);
|
||||||
// Check if exact same table; not just equivalence
|
// Check if exact same table; not just equivalence
|
||||||
assertTrue(mvbt == pvbt);
|
assertTrue(mvbt == pvbt);
|
||||||
}
|
}
|
||||||
|
@ -473,7 +474,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
// vbt obtained by querying on parentage
|
// vbt obtained by querying on parentage
|
||||||
ProgramVirtualFunctionTable pvft =
|
ProgramVirtualFunctionTable pvft =
|
||||||
(ProgramVirtualFunctionTable) vftm32VxtManager.findVft(owner, parentage, null);
|
(ProgramVirtualFunctionTable) vftm32VxtManager.findCreateVft(owner, parentage, null);
|
||||||
assertEquals(vftm32AddressesByMangled.get(pvft.getMangledName()), pvft.getAddress());
|
assertEquals(vftm32AddressesByMangled.get(pvft.getMangledName()), pvft.getAddress());
|
||||||
if (symParentage == null) {
|
if (symParentage == null) {
|
||||||
Msg.warn(this,
|
Msg.warn(this,
|
||||||
|
@ -483,7 +484,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
}
|
}
|
||||||
// vbt obtained by querying on msft symbol info
|
// vbt obtained by querying on msft symbol info
|
||||||
ProgramVirtualFunctionTable mvft =
|
ProgramVirtualFunctionTable mvft =
|
||||||
(ProgramVirtualFunctionTable) vftm32VxtManager.findVft(owner, symParentage, null);
|
(ProgramVirtualFunctionTable) vftm32VxtManager.findCreateVft(owner, symParentage, null);
|
||||||
// Check if exact same table; not just equivalence
|
// Check if exact same table; not just equivalence
|
||||||
assertTrue(mvft == pvft);
|
assertTrue(mvft == pvft);
|
||||||
}
|
}
|
||||||
|
@ -912,7 +913,7 @@ public class MsVxtManagerTest extends AbstractGenericTest {
|
||||||
|
|
||||||
// Spot-check a function from the table
|
// Spot-check a function from the table
|
||||||
ProgramVirtualFunctionTable vft =
|
ProgramVirtualFunctionTable vft =
|
||||||
(ProgramVirtualFunctionTable) cfb432VxtManager.findVft(A, List.of(), null);
|
(ProgramVirtualFunctionTable) cfb432VxtManager.findCreateVft(A, List.of(), null);
|
||||||
assertEquals(cfb432AddressesByMangled.get(vft.getMangledName()), vft.getAddress());
|
assertEquals(cfb432AddressesByMangled.get(vft.getMangledName()), vft.getAddress());
|
||||||
Address address = vft.getAddress(0);
|
Address address = vft.getAddress(0);
|
||||||
Symbol s = cfb432Program.getSymbolTable().getPrimarySymbol(address);
|
Symbol s = cfb432Program.getSymbolTable().getPrimarySymbol(address);
|
||||||
|
|
|
@ -32,7 +32,7 @@ import ghidra.program.model.data.*;
|
||||||
import ghidra.program.model.data.DataUtilities.ClearDataMode;
|
import ghidra.program.model.data.DataUtilities.ClearDataMode;
|
||||||
import ghidra.program.model.gclass.ClassID;
|
import ghidra.program.model.gclass.ClassID;
|
||||||
import ghidra.program.model.gclass.ClassUtils;
|
import ghidra.program.model.gclass.ClassUtils;
|
||||||
import ghidra.program.model.listing.Program;
|
import ghidra.program.model.listing.*;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
import ghidra.util.exception.AssertException;
|
import ghidra.util.exception.AssertException;
|
||||||
import ghidra.util.task.TaskMonitor;
|
import ghidra.util.task.TaskMonitor;
|
||||||
|
@ -2084,6 +2084,8 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
vxtManager.createTables(dtm, clearMode);
|
vxtManager.createTables(dtm, clearMode);
|
||||||
});
|
});
|
||||||
checkVxtStructures(dtm, expectedVxtStructs);
|
checkVxtStructures(dtm, expectedVxtStructs);
|
||||||
|
Map<String, String> expectedTableInfo = egray832Creator.getExpectedVxtAddressTypes();
|
||||||
|
checkTables(program, vxtManager, expectedTableInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2153,6 +2155,8 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
vxtManager.createTables(dtm, clearMode);
|
vxtManager.createTables(dtm, clearMode);
|
||||||
});
|
});
|
||||||
checkVxtStructures(dtm, expectedVxtStructs);
|
checkVxtStructures(dtm, expectedVxtStructs);
|
||||||
|
Map<String, String> expectedTableInfo = egray864Creator.getExpectedVxtAddressTypes();
|
||||||
|
checkTables(program, vxtManager, expectedTableInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2222,6 +2226,8 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
vxtManager.createTables(dtm, clearMode);
|
vxtManager.createTables(dtm, clearMode);
|
||||||
});
|
});
|
||||||
checkVxtStructures(dtm, expectedVxtStructs);
|
checkVxtStructures(dtm, expectedVxtStructs);
|
||||||
|
Map<String, String> expectedTableInfo = vftm32Creator.getExpectedVxtAddressTypes();
|
||||||
|
checkTables(program, vxtManager, expectedTableInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2291,6 +2297,8 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
vxtManager.createTables(dtm, clearMode);
|
vxtManager.createTables(dtm, clearMode);
|
||||||
});
|
});
|
||||||
checkVxtStructures(dtm, expectedVxtStructs);
|
checkVxtStructures(dtm, expectedVxtStructs);
|
||||||
|
Map<String, String> expectedTableInfo = vftm64Creator.getExpectedVxtAddressTypes();
|
||||||
|
checkTables(program, vxtManager, expectedTableInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2360,6 +2368,8 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
vxtManager.createTables(dtm, clearMode);
|
vxtManager.createTables(dtm, clearMode);
|
||||||
});
|
});
|
||||||
checkVxtStructures(dtm, expectedVxtStructs);
|
checkVxtStructures(dtm, expectedVxtStructs);
|
||||||
|
Map<String, String> expectedTableInfo = cfb432Creator.getExpectedVxtAddressTypes();
|
||||||
|
checkTables(program, vxtManager, expectedTableInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2429,6 +2439,8 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
vxtManager.createTables(dtm, clearMode);
|
vxtManager.createTables(dtm, clearMode);
|
||||||
});
|
});
|
||||||
checkVxtStructures(dtm, expectedVxtStructs);
|
checkVxtStructures(dtm, expectedVxtStructs);
|
||||||
|
Map<String, String> expectedTableInfo = cfb464Creator.getExpectedVxtAddressTypes();
|
||||||
|
checkTables(program, vxtManager, expectedTableInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2519,10 +2531,14 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
private void checkVxtStructures(DataTypeManager dtm,
|
private void checkVxtStructures(DataTypeManager dtm,
|
||||||
Map<ClassID, Map<String, String>> expectedVxtStructs) {
|
Map<ClassID, Map<String, String>> expectedVxtStructs) {
|
||||||
for (Map.Entry<ClassID, Map<String, String>> entry : expectedVxtStructs.entrySet()) {
|
for (Map.Entry<ClassID, Map<String, String>> entry : expectedVxtStructs.entrySet()) {
|
||||||
|
Map<String, String> expectedTables = entry.getValue();
|
||||||
|
if (expectedTables.isEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
ClassID id = entry.getKey();
|
ClassID id = entry.getKey();
|
||||||
CategoryPath cp = ClassUtils.getClassInternalsPath(id);
|
CategoryPath cp = ClassUtils.getClassInternalsPath(id);
|
||||||
Category category = dtm.getCategory(cp);
|
Category category = dtm.getCategory(cp);
|
||||||
Map<String, String> expectedTables = entry.getValue();
|
assertNotNull(category);
|
||||||
for (Map.Entry<String, String> tableEntry : expectedTables.entrySet()) {
|
for (Map.Entry<String, String> tableEntry : expectedTables.entrySet()) {
|
||||||
String tableName = tableEntry.getKey();
|
String tableName = tableEntry.getKey();
|
||||||
String expectedTableDump = tableEntry.getValue();
|
String expectedTableDump = tableEntry.getValue();
|
||||||
|
@ -2531,24 +2547,52 @@ public class CppCompositeTypeTest extends AbstractGenericTest {
|
||||||
"Purposefully skipping table test that has bad result for " + tableName);
|
"Purposefully skipping table test that has bad result for " + tableName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
assertNotNull(category);
|
|
||||||
Structure table = (Structure) category.getDataType(tableName);
|
Structure table = (Structure) category.getDataType(tableName);
|
||||||
assertNotNull(table);
|
assertNotNull(table);
|
||||||
CompositeTestUtils.assertExpectedComposite(this, expectedTableDump, table, true);
|
CompositeTestUtils.assertExpectedComposite(this, expectedTableDump, table, true);
|
||||||
}
|
}
|
||||||
// Make sure there are no extra tables
|
// Make sure there are no extra tables
|
||||||
if (category != null) {
|
int count = 0;
|
||||||
int count = 0;
|
DataType[] types = category.getDataTypes();
|
||||||
DataType[] types = category.getDataTypes();
|
if (types != null) {
|
||||||
if (types != null) {
|
for (DataType type : category.getDataTypes()) {
|
||||||
for (DataType type : category.getDataTypes()) {
|
if (ClassUtils.isVTable(type)) {
|
||||||
if (ClassUtils.isVTable(type)) {
|
count++;
|
||||||
count++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assertEquals(expectedTables.size(), count);
|
|
||||||
}
|
}
|
||||||
|
assertEquals(expectedTables.size(), count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkTables(Program program, MsVxtManager vxtManager,
|
||||||
|
Map<String, String> tableInfo) {
|
||||||
|
|
||||||
|
// next lines for aiding in creating expected results
|
||||||
|
// for (Address a : vxtManager.dumpVbtAddresses()) {
|
||||||
|
// System.out.print(String.format(" expectedVxtAddressTypes.put(\"%s\", \"\");\n",
|
||||||
|
// a.toString()));
|
||||||
|
// }
|
||||||
|
// for (Address a : vxtManager.dumpVftAddresses()) {
|
||||||
|
// System.out.print(String.format(" expectedVxtAddressTypes.put(\"%s\", \"\");\n",
|
||||||
|
// a.toString()));
|
||||||
|
// }
|
||||||
|
|
||||||
|
for (Map.Entry<String, String> entry : tableInfo.entrySet()) {
|
||||||
|
String addr = entry.getKey();
|
||||||
|
Address[] addresses = program.parseAddress(addr);
|
||||||
|
assertTrue(addresses.length == 1);
|
||||||
|
Address address = addresses[0];
|
||||||
|
CodeUnit cu = program.getListing().getCodeUnitAt(address);
|
||||||
|
// assume not instruction... will fail if so
|
||||||
|
Data d = (Data) cu;
|
||||||
|
DataType dt = d.getBaseDataType();
|
||||||
|
String pathName = dt.getPathName();
|
||||||
|
String expectedResult = entry.getValue();
|
||||||
|
// Following line is for aiding in creating expected results
|
||||||
|
// System.out.print(String.format(" expectedVxtAddressTypes.put(\"%s\", \"%s\");\n",
|
||||||
|
// addr, pathName));
|
||||||
|
assertEquals(expectedResult, pathName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue