| 273 | |
| 274 | |
| 275 | UniversalView::UniversalView(BinaryView* data, bool parseOnly): BinaryView("Universal", data->GetFile(), data) |
| 276 | { |
| 277 | FatHeader fatHeader; |
| 278 | vector<FatArch64> fatArchEntries; |
| 279 | bool isFat64; |
| 280 | string errorMsg; |
| 281 | if (!g_universalViewType->ParseHeaders(data, fatHeader, fatArchEntries, isFat64, errorMsg)) |
| 282 | throw MachoFormatException(errorMsg); |
| 283 | |
| 284 | if (parseOnly) |
| 285 | return; |
| 286 | |
| 287 | // Add Universal file header type info |
| 288 | StructureBuilder fatHeaderBuilder; |
| 289 | fatHeaderBuilder.AddMember(Type::IntegerType(4, false), "magic"); |
| 290 | fatHeaderBuilder.AddMember(Type::IntegerType(4, false), "nfat_arch"); |
| 291 | Ref<Structure> fatHeaderStruct = fatHeaderBuilder.Finalize(); |
| 292 | QualifiedName headerName = string("fat_header"); |
| 293 | string headerTypeId = Type::GenerateAutoTypeId("macho", headerName); |
| 294 | Ref<Type> fatHeaderType = Type::StructureType(fatHeaderStruct); |
| 295 | QualifiedName rawHeaderName = DefineType(headerTypeId, headerName, fatHeaderType); |
| 296 | DefineDataVariable(0, Type::NamedType(this, rawHeaderName)); |
| 297 | DefineAutoSymbol(new Symbol(DataSymbol, "__fat_header", 0, LocalBinding)); |
| 298 | |
| 299 | EnumerationBuilder cpuTypeBuilder; |
| 300 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_ANY", MACHO_CPU_TYPE_ANY); |
| 301 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_VAX", MACHO_CPU_TYPE_VAX); |
| 302 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_MC680x0", MACHO_CPU_TYPE_MC680x0); |
| 303 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_X86", MACHO_CPU_TYPE_X86); |
| 304 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_X86_64", MACHO_CPU_TYPE_X86_64); |
| 305 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_MIPS", MACHO_CPU_TYPE_MIPS); |
| 306 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_MC98000", MACHO_CPU_TYPE_MC98000); |
| 307 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_HPPA", MACHO_CPU_TYPE_HPPA); |
| 308 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_ARM", MACHO_CPU_TYPE_ARM); |
| 309 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_ARM64", MACHO_CPU_TYPE_ARM64); |
| 310 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_ARM64_32", MACHO_CPU_TYPE_ARM64_32); |
| 311 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_MC88000", MACHO_CPU_TYPE_MC88000); |
| 312 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_SPARC", MACHO_CPU_TYPE_SPARC); |
| 313 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_I860", MACHO_CPU_TYPE_I860); |
| 314 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_ALPHA", MACHO_CPU_TYPE_ALPHA); |
| 315 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_POWERPC", MACHO_CPU_TYPE_POWERPC); |
| 316 | cpuTypeBuilder.AddMemberWithValue("CPU_TYPE_POWERPC64", MACHO_CPU_TYPE_POWERPC64); |
| 317 | Ref<Enumeration> cpuTypeEnum = cpuTypeBuilder.Finalize(); |
| 318 | |
| 319 | Ref<Type> cpuTypeEnumType = Type::EnumerationType(nullptr, cpuTypeEnum, 4, false); |
| 320 | string cpuTypeEnumName = "cpu_type_t"; |
| 321 | string cpuTypeEnumId = Type::GenerateAutoTypeId("macho", cpuTypeEnumName); |
| 322 | QualifiedName rawCpuTypeEnumName = DefineType(cpuTypeEnumId, cpuTypeEnumName, cpuTypeEnumType); |
| 323 | |
| 324 | StructureBuilder fatArchBuilder; |
| 325 | fatArchBuilder.AddMember(Type::NamedType(this, rawCpuTypeEnumName), "cputype"); |
| 326 | fatArchBuilder.AddMember(Type::IntegerType(4, false), "cpusubtype"); |
| 327 | if (isFat64) |
| 328 | { |
| 329 | fatArchBuilder.AddMember(Type::IntegerType(8, false), "offset"); |
| 330 | fatArchBuilder.AddMember(Type::IntegerType(8, false), "size"); |
| 331 | } |
| 332 | else |
nothing calls this directly
no test coverage detected