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

Method parseImageFile

ffsengine.cpp:145–247  ·  view source on GitHub ↗

Firmware image parsing

Source from the content-addressed store, hash-verified

143
144// Firmware image parsing
145UINT8 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);

Callers 4

openImageFileMethod · 0.80
patchFromFileMethod · 0.80
patchFromArgMethod · 0.80
replaceMethod · 0.80

Calls 2

guidToQStringFunction · 0.85
addItemMethod · 0.80

Tested by

no test coverage detected