private PointerTypeInformation CreatePointerType(TypeInformationCache type_cache, long module_base, int index, SymbolLoadedModule module) { var length = GetSymbolLong(IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_LENGTH, module_base, index) ?? 0; var type_id = GetSymbolDword(IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_TYPEID, module_base, index); var is_reference = GetSymbolDword(IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_IS_REFERENCE, module_base, index) ?? 0; PointerTypeInformation pointer; if (type_id.HasValue) { pointer = new PointerTypeInformation(length, index, module, null, is_reference != 0); type_cache.AddEntry(module_base, index, pointer); type_cache.AddFixedup(module_base, type_id.Value, pointer); pointer.PointerType = CreateType(type_cache, module_base, type_id.Value, module); } else { return(new PointerTypeInformation(length, index, module, new BaseTypeInformation(0, 0, module, BasicType.Void), is_reference != 0)); } type_cache.AddEntry(module_base, index, pointer); return(pointer); }
private TypeInformation CreateType(TypeInformationCache type_cache, SymTagEnum tag, long module_base, int index, long size, SymbolLoadedModule module, string name, long address = 0) { if (type_cache.HasEntry(module_base, index)) { return(type_cache.GetEntry(module_base, index)); } TypeInformation ret; switch (tag) { case SymTagEnum.SymTagUDT: ret = CreateUserDefinedType(type_cache, module_base, index, module, name); break; case SymTagEnum.SymTagEnum: ret = CreateEnumType(type_cache, module_base, index, module, name); break; case SymTagEnum.SymTagBaseType: ret = CreateBaseType(type_cache, module_base, index, module); break; case SymTagEnum.SymTagPointerType: ret = CreatePointerType(type_cache, module_base, index, module); break; case SymTagEnum.SymTagArrayType: ret = CreateArrayType(type_cache, module_base, index, module); break; case SymTagEnum.SymTagFunction: ret = CreateFunctionType(type_cache, module_base, index, module, name, address); break; default: Debug.WriteLine(tag.ToString()); ret = new TypeInformation(tag, size, index, module, name); break; } type_cache.AddEntry(module_base, index, ret); return(ret); }