MCPcopy Create free account
hub / github.com/LongSoft/UEFITool / growVolume

Method growVolume

ffsengine.cpp:4168–4212  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4166}
4167
4168UINT8 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
4214UINT8 FfsEngine::reconstructImageFile(QByteArray & reconstructed)
4215{

Callers

nothing calls this directly

Calls 2

calculateChecksum16Function · 0.85
dataMethod · 0.45

Tested by

no test coverage detected