MCPcopy Create free account
hub / github.com/Vector35/binaryninja-api / UniversalView

Method UniversalView

view/macho/universalview.cpp:275–347  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

273
274
275UniversalView::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

Callers

nothing calls this directly

Calls 9

IntegerTypeClass · 0.85
StructureTypeClass · 0.85
EnumerationTypeClass · 0.85
ArrayTypeClass · 0.85
AddMemberMethod · 0.80
GetFileMethod · 0.45
ParseHeadersMethod · 0.45
FinalizeMethod · 0.45

Tested by

no test coverage detected