IDA: Separate type declarations into own header file

This commit is contained in:
Katy Coe
2020-07-28 02:40:47 +02:00
parent 7fa80a4848
commit 867ddea168

View File

@@ -23,6 +23,10 @@ namespace Il2CppInspector.Outputs
public void WriteScriptToFile(string outputFile) { public void WriteScriptToFile(string outputFile) {
// Write types file first
var typeHeaderFile = Path.Combine(Path.GetDirectoryName(outputFile), Path.GetFileNameWithoutExtension(outputFile) + ".h");
writeTypes(typeHeaderFile);
using var fs = new FileStream(outputFile, FileMode.Create); using var fs = new FileStream(outputFile, FileMode.Create);
writer = new StreamWriter(fs, Encoding.UTF8); writer = new StreamWriter(fs, Encoding.UTF8);
@@ -32,7 +36,13 @@ namespace Il2CppInspector.Outputs
writeSectionHeader("Preamble"); writeSectionHeader("Preamble");
writePreamble(); writePreamble();
writeTypes(); writeSectionHeader("Types");
writeLine(
@"original_macros = ida_typeinf.get_c_macros()
ida_typeinf.set_c_macros(original_macros + "";_IDA_=1"")
idc.parse_decls(""" + Path.GetFileName(typeHeaderFile) + @""", idc.PT_FILE)
ida_typeinf.set_c_macros(original_macros)");
writeMethods(); writeMethods();
writeSectionHeader("String literals"); writeSectionHeader("String literals");
@@ -66,34 +76,12 @@ def MakeFunction(start):
def SetType(addr, type): def SetType(addr, type):
ret = idc.SetType(addr, type) ret = idc.SetType(addr, type)
if ret is None: if ret is None:
print('SetType(0x%x, %r) failed!' % (addr, type)) print('SetType(0x%x, %r) failed!' % (addr, type))");
");
// Compatibility (in a separate decl block in case these are already defined)
writeDecls(@"
typedef unsigned __int8 uint8_t;
typedef unsigned __int16 uint16_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int64 uint64_t;
typedef __int8 int8_t;
typedef __int16 int16_t;
typedef __int32 int32_t;
typedef __int64 int64_t;
");
} }
private void writeTypes() { private void writeTypes(string typeHeaderFile) {
writeSectionHeader("IL2CPP internal types"); var cpp = new CppScaffolding(model);
writeDecls(model.UnityHeaders.GetTypeHeaderText(model.WordSize)); cpp.WriteTypes(typeHeaderFile);
writeSectionHeader("Application types from method calls");
writeTypes(model.GetDependencyOrderedCppTypeGroup("types_from_methods"));
writeSectionHeader("Application types from generic methods");
writeTypes(model.GetDependencyOrderedCppTypeGroup("types_from_generic_methods"));
writeSectionHeader("Application types from usage metadata");
writeTypes(model.GetDependencyOrderedCppTypeGroup("types_from_usages"));
} }
private void writeMethods() { private void writeMethods() {
@@ -114,11 +102,6 @@ typedef __int64 int64_t;
} }
} }
private void writeTypes(IEnumerable<CppType> types) {
foreach (var type in types)
writeDecls(type.ToString());
}
private void writeMethods(IEnumerable<AppMethod> methods) { private void writeMethods(IEnumerable<AppMethod> methods) {
foreach (var method in methods) { foreach (var method in methods) {
writeTypedName(method.MethodCodeAddress, method.CppFnPtrType.ToSignatureString(), method.CppFnPtrType.Name); writeTypedName(method.MethodCodeAddress, method.CppFnPtrType.ToSignatureString(), method.CppFnPtrType.Name);