| 156 | |
| 157 | |
| 158 | bool UniversalViewType::ParseHeaders(BinaryView* data, FatHeader& fatHeader, vector<FatArch64>& fatArchEntries, bool& isFat64, string& errorMsg) |
| 159 | { |
| 160 | if (!IsTypeValidForData(data)) |
| 161 | { |
| 162 | errorMsg = "Universal (Fat Mach-O): invalid signature"; |
| 163 | return false; |
| 164 | } |
| 165 | |
| 166 | BinaryReader reader(data); |
| 167 | reader.SetEndianness(BigEndian); |
| 168 | fatHeader.magic = reader.Read32(); |
| 169 | fatHeader.nfat_arch = reader.Read32(); |
| 170 | |
| 171 | isFat64 = (fatHeader.magic == FAT_MAGIC_64); |
| 172 | size_t requiredFatHeaderSize = fatHeader.nfat_arch * (isFat64 ? 32 : 20) + 8; |
| 173 | if (requiredFatHeaderSize > data->GetLength()) |
| 174 | { |
| 175 | errorMsg = "Universal (Fat Mach-O): header truncated"; |
| 176 | return false; |
| 177 | } |
| 178 | |
| 179 | for (size_t i = 0; i < fatHeader.nfat_arch; i++) |
| 180 | { |
| 181 | FatArch64 fatArch; |
| 182 | if (isFat64) |
| 183 | { |
| 184 | fatArch.cputype = reader.Read32(); |
| 185 | fatArch.cpusubtype = reader.Read32(); |
| 186 | fatArch.offset = reader.Read64(); |
| 187 | fatArch.size = reader.Read64(); |
| 188 | fatArch.align = reader.Read32(); |
| 189 | fatArch.reserved = reader.Read32(); |
| 190 | } |
| 191 | else |
| 192 | { |
| 193 | fatArch.cputype = reader.Read32(); |
| 194 | fatArch.cpusubtype = reader.Read32(); |
| 195 | fatArch.offset = reader.Read32(); |
| 196 | fatArch.size = reader.Read32(); |
| 197 | fatArch.align = reader.Read32(); |
| 198 | } |
| 199 | |
| 200 | // Mask away cpu subtype capability bits |
| 201 | fatArch.cpusubtype &= ~MACHO_CPU_SUBTYPE_MASK; |
| 202 | fatArchEntries.push_back(fatArch); |
| 203 | } |
| 204 | |
| 205 | return true; |
| 206 | } |
| 207 | |
| 208 | |
| 209 | Ref<Settings> UniversalViewType::GetLoadSettingsForData(BinaryView* data) |
no test coverage detected