Firmware image parsing
| 143 | |
| 144 | // Firmware image parsing |
| 145 | UINT8 FfsEngine::parseImageFile(const QByteArray & buffer) |
| 146 | { |
| 147 | oldPeiCoreEntryPoint = 0; |
| 148 | newPeiCoreEntryPoint = 0; |
| 149 | |
| 150 | // Check buffer size to be more then or equal to size of EFI_CAPSULE_HEADER |
| 151 | if ((UINT32)buffer.size() <= sizeof(EFI_CAPSULE_HEADER)) { |
| 152 | msg(tr("parseImageFile: image file is smaller then minimum size of %1h (%2) bytes").hexarg(sizeof(EFI_CAPSULE_HEADER)).arg(sizeof(EFI_CAPSULE_HEADER))); |
| 153 | return ERR_INVALID_PARAMETER; |
| 154 | } |
| 155 | |
| 156 | // Check buffer for being normal EFI capsule header |
| 157 | UINT32 capsuleHeaderSize = 0; |
| 158 | QModelIndex index; |
| 159 | if (buffer.startsWith(EFI_CAPSULE_GUID) |
| 160 | || buffer.startsWith(INTEL_CAPSULE_GUID)) { |
| 161 | // Get info |
| 162 | const EFI_CAPSULE_HEADER* capsuleHeader = (const EFI_CAPSULE_HEADER*)buffer.constData(); |
| 163 | capsuleHeaderSize = capsuleHeader->HeaderSize; |
| 164 | QByteArray header = buffer.left(capsuleHeaderSize); |
| 165 | QByteArray body = buffer.right(buffer.size() - capsuleHeaderSize); |
| 166 | QString name = tr("UEFI capsule"); |
| 167 | QString info = tr("Capsule GUID: %1\nFull size: %2h (%3)\nHeader size: %4h (%5)\nImage size: %6h (%7)\nFlags: %8h") |
| 168 | .arg(guidToQString(capsuleHeader->CapsuleGuid)) |
| 169 | .hexarg(buffer.size()).arg(buffer.size()) |
| 170 | .hexarg(capsuleHeader->HeaderSize).arg(capsuleHeader->HeaderSize) |
| 171 | .hexarg(capsuleHeader->CapsuleImageSize).arg(capsuleHeader->CapsuleImageSize) |
| 172 | .hexarg2(capsuleHeader->Flags, 8); |
| 173 | |
| 174 | // Add tree item |
| 175 | index = model->addItem(Types::Capsule, Subtypes::UefiCapsule, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body); |
| 176 | } |
| 177 | // Check buffer for being Toshiba capsule header |
| 178 | else if (buffer.startsWith(TOSHIBA_CAPSULE_GUID)) { |
| 179 | // Get info |
| 180 | const TOSHIBA_CAPSULE_HEADER* capsuleHeader = (const TOSHIBA_CAPSULE_HEADER*)buffer.constData(); |
| 181 | capsuleHeaderSize = capsuleHeader->HeaderSize; |
| 182 | QByteArray header = buffer.left(capsuleHeaderSize); |
| 183 | QByteArray body = buffer.right(buffer.size() - capsuleHeaderSize); |
| 184 | QString name = tr("UEFI capsule"); |
| 185 | QString info = tr("Capsule GUID: %1\nFull size: %2h (%3)\nHeader size: %4h (%5)\nImage size: %6h (%7)\nFlags: %8h") |
| 186 | .arg(guidToQString(capsuleHeader->CapsuleGuid)) |
| 187 | .hexarg(buffer.size()).arg(buffer.size()) |
| 188 | .hexarg(capsuleHeader->HeaderSize).arg(capsuleHeader->HeaderSize) |
| 189 | .hexarg(capsuleHeader->FullSize - capsuleHeader->HeaderSize).arg(capsuleHeader->FullSize - capsuleHeader->HeaderSize) |
| 190 | .hexarg2(capsuleHeader->Flags, 8); |
| 191 | |
| 192 | // Add tree item |
| 193 | index = model->addItem(Types::Capsule, Subtypes::ToshibaCapsule, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body); |
| 194 | } |
| 195 | // Check buffer for being extended Aptio signed capsule header |
| 196 | else if (buffer.startsWith(APTIO_SIGNED_CAPSULE_GUID) || buffer.startsWith(APTIO_UNSIGNED_CAPSULE_GUID)) { |
| 197 | // Get info |
| 198 | bool signedCapsule = buffer.startsWith(APTIO_SIGNED_CAPSULE_GUID); |
| 199 | |
| 200 | const APTIO_CAPSULE_HEADER* capsuleHeader = (const APTIO_CAPSULE_HEADER*)buffer.constData(); |
| 201 | capsuleHeaderSize = capsuleHeader->RomImageOffset; |
| 202 | QByteArray header = buffer.left(capsuleHeaderSize); |
no test coverage detected