| 4166 | } |
| 4167 | |
| 4168 | UINT8 FfsEngine::growVolume(QByteArray & header, const UINT32 size, UINT32 & newSize) |
| 4169 | { |
| 4170 | // Check sanity |
| 4171 | if ((UINT32)header.size() < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) |
| 4172 | return ERR_INVALID_VOLUME; |
| 4173 | |
| 4174 | // Adjust new size to be representable by current FvBlockMap |
| 4175 | EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (EFI_FIRMWARE_VOLUME_HEADER*)header.data(); |
| 4176 | EFI_FV_BLOCK_MAP_ENTRY* blockMap = (EFI_FV_BLOCK_MAP_ENTRY*)(header.data() + sizeof(EFI_FIRMWARE_VOLUME_HEADER)); |
| 4177 | |
| 4178 | // Get block map size |
| 4179 | UINT32 blockMapSize = volumeHeader->HeaderLength - sizeof(EFI_FIRMWARE_VOLUME_HEADER); |
| 4180 | if (blockMapSize % sizeof(EFI_FV_BLOCK_MAP_ENTRY)) |
| 4181 | return ERR_INVALID_VOLUME; |
| 4182 | UINT32 blockMapCount = blockMapSize / sizeof(EFI_FV_BLOCK_MAP_ENTRY); |
| 4183 | |
| 4184 | // Check blockMap validity |
| 4185 | if (blockMap[blockMapCount - 1].NumBlocks != 0 || blockMap[blockMapCount - 1].Length != 0) |
| 4186 | return ERR_INVALID_VOLUME; |
| 4187 | |
| 4188 | // Case of complex blockMap |
| 4189 | if (blockMapCount > 2) |
| 4190 | return ERR_COMPLEX_BLOCK_MAP; |
| 4191 | |
| 4192 | // Calculate new size |
| 4193 | if (newSize <= size) |
| 4194 | return ERR_INVALID_PARAMETER; |
| 4195 | |
| 4196 | newSize += blockMap[0].Length - newSize % blockMap[0].Length; |
| 4197 | |
| 4198 | // Recalculate number of blocks |
| 4199 | blockMap[0].NumBlocks = newSize / blockMap[0].Length; |
| 4200 | |
| 4201 | // Set new volume size |
| 4202 | volumeHeader->FvLength = 0; |
| 4203 | for (UINT8 i = 0; i < blockMapCount; i++) { |
| 4204 | volumeHeader->FvLength += blockMap[i].NumBlocks * blockMap[i].Length; |
| 4205 | } |
| 4206 | |
| 4207 | // Recalculate volume header checksum |
| 4208 | volumeHeader->Checksum = 0; |
| 4209 | volumeHeader->Checksum = calculateChecksum16((const UINT16*)volumeHeader, volumeHeader->HeaderLength); |
| 4210 | |
| 4211 | return ERR_SUCCESS; |
| 4212 | } |
| 4213 | |
| 4214 | UINT8 FfsEngine::reconstructImageFile(QByteArray & reconstructed) |
| 4215 | { |
nothing calls this directly
no test coverage detected