| 157 | } |
| 158 | |
| 159 | std::vector<SlideMappingInfo> SlideInfoProcessor::ReadEntryInfo(const MappedFileAccessor& accessor, const CacheEntry& entry) const |
| 160 | { |
| 161 | const auto& baseHeader = entry.GetHeader(); |
| 162 | |
| 163 | // Handle legacy, single mapping slide info. |
| 164 | if (baseHeader.slideInfoOffsetUnused) |
| 165 | { |
| 166 | auto slideInfoAddress = baseHeader.slideInfoOffsetUnused; |
| 167 | auto slideInfoVersion = accessor.ReadUInt32(slideInfoAddress); |
| 168 | if (slideInfoVersion != 2 && slideInfoVersion != 3) |
| 169 | { |
| 170 | m_logger->LogError("Unsupported slide info version %d", slideInfoVersion); |
| 171 | return {}; |
| 172 | } |
| 173 | |
| 174 | SlideMappingInfo singleMapping = {}; |
| 175 | singleMapping.address = slideInfoAddress; |
| 176 | singleMapping.slideInfoVersion = slideInfoVersion; |
| 177 | |
| 178 | auto mappingAddress = baseHeader.mappingOffset + sizeof(dyld_cache_mapping_info); |
| 179 | accessor.Read(&singleMapping.mappingInfo, mappingAddress, sizeof(dyld_cache_mapping_info)); |
| 180 | if (singleMapping.slideInfoVersion == 2) |
| 181 | accessor.Read(&singleMapping.slideInfoV2, slideInfoAddress, sizeof(dyld_cache_slide_info_v2)); |
| 182 | else if (singleMapping.slideInfoVersion == 3) |
| 183 | accessor.Read(&singleMapping.slideInfoV3, slideInfoAddress, sizeof(dyld_cache_slide_info_v3)); |
| 184 | |
| 185 | return {singleMapping}; |
| 186 | } |
| 187 | |
| 188 | std::vector<SlideMappingInfo> mappings = {}; |
| 189 | for (auto i = 0; i < baseHeader.mappingWithSlideCount; i++) |
| 190 | { |
| 191 | dyld_cache_mapping_and_slide_info mappingAndSlideInfo = {}; |
| 192 | auto mappingAndSlideInfoAddress = baseHeader.mappingWithSlideOffset + (i * sizeof(dyld_cache_mapping_and_slide_info)); |
| 193 | accessor.Read(&mappingAndSlideInfo, mappingAndSlideInfoAddress, sizeof(dyld_cache_mapping_and_slide_info)); |
| 194 | if (mappingAndSlideInfo.size == 0 || mappingAndSlideInfo.slideInfoFileOffset == 0) |
| 195 | continue; |
| 196 | |
| 197 | SlideMappingInfo map = {}; |
| 198 | map.address = mappingAndSlideInfo.slideInfoFileOffset; |
| 199 | map.slideInfoVersion = accessor.ReadUInt32(map.address); |
| 200 | map.mappingInfo.address = mappingAndSlideInfo.address; |
| 201 | map.mappingInfo.size = mappingAndSlideInfo.size; |
| 202 | map.mappingInfo.fileOffset = mappingAndSlideInfo.fileOffset; |
| 203 | if (map.slideInfoVersion == 2) |
| 204 | { |
| 205 | accessor.Read(&map.slideInfoV2, map.address, sizeof(dyld_cache_slide_info_v2)); |
| 206 | } |
| 207 | else if (map.slideInfoVersion == 3) |
| 208 | { |
| 209 | accessor.Read(&map.slideInfoV3, map.address, sizeof(dyld_cache_slide_info_v3)); |
| 210 | map.slideInfoV3.auth_value_add = m_baseAddress; |
| 211 | } |
| 212 | else if (map.slideInfoVersion == 5) |
| 213 | { |
| 214 | accessor.Read(&map.slideInfoV5, map.address, sizeof(dyld_cache_slide_info_v5)); |
| 215 | map.slideInfoV5.value_add = m_baseAddress; |
| 216 | } |
nothing calls this directly
no test coverage detected