UEFITool/ffs.cpp
Nikolaj Schlej fb7e1c4c89 UT 0.19.6, UE 0.3.5, UP 0.2.5
- added support for firmware volumes with CRC32 stored in ZeroVector
(Apple UEFI feature)
- ZeroVector included to FV information
- added new volume types AppleCRC, AppleCRC Boot and AppleCRC Unknown
- added support for HP POSTCode sections
- size information split into header size and body size
- decimal sizes are added, shown in braces after hexadecimal sizes
- corrected small bug with Extract Body action being enabled for items
with empty body
2015-01-25 23:55:23 +01:00

217 lines
6.8 KiB
C++

/* ffs.cpp
Copyright (c) 2013, Nikolaj Schlej. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHWARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
*/
#include <QObject>
#include "ffs.h"
const UINT8 ffsAlignmentTable[] =
{ 0, 4, 7, 9, 10, 12, 15, 16 };
UINT8 calculateChecksum8(UINT8* buffer, UINT32 bufferSize)
{
if (!buffer)
return 0;
UINT8 counter = 0;
while (bufferSize--)
counter += buffer[bufferSize];
return (UINT8)0x100 - counter;
}
UINT16 calculateChecksum16(UINT16* buffer, UINT32 bufferSize)
{
if (!buffer)
return 0;
UINT16 counter = 0;
UINT32 index = 0;
bufferSize /= sizeof(UINT16);
for (; index < bufferSize; index++) {
counter = (UINT16)(counter + buffer[index]);
}
return (UINT16)0x10000 - counter;
}
VOID uint32ToUint24(UINT32 size, UINT8* ffsSize)
{
ffsSize[2] = (UINT8)((size) >> 16);
ffsSize[1] = (UINT8)((size) >> 8);
ffsSize[0] = (UINT8)((size));
}
UINT32 uint24ToUint32(UINT8* ffsSize)
{
return (ffsSize[2] << 16) +
(ffsSize[1] << 8) +
ffsSize[0];
}
QString guidToQString(const EFI_GUID& guid)
{
QByteArray baGuid = QByteArray::fromRawData((const char*)guid.Data, sizeof(EFI_GUID));
UINT32 i32 = *(UINT32*)baGuid.left(4).constData();
UINT16 i16_0 = *(UINT16*)baGuid.mid(4, 2).constData();
UINT16 i16_1 = *(UINT16*)baGuid.mid(6, 2).constData();
UINT8 i8_0 = *(UINT8*)baGuid.mid(8, 1).constData();
UINT8 i8_1 = *(UINT8*)baGuid.mid(9, 1).constData();
UINT8 i8_2 = *(UINT8*)baGuid.mid(10, 1).constData();
UINT8 i8_3 = *(UINT8*)baGuid.mid(11, 1).constData();
UINT8 i8_4 = *(UINT8*)baGuid.mid(12, 1).constData();
UINT8 i8_5 = *(UINT8*)baGuid.mid(13, 1).constData();
UINT8 i8_6 = *(UINT8*)baGuid.mid(14, 1).constData();
UINT8 i8_7 = *(UINT8*)baGuid.mid(15, 1).constData();
return QString("%1-%2-%3-%4%5-%6%7%8%9%10%11")
.arg(i32, 8, 16, QChar('0'))
.arg(i16_0, 4, 16, QChar('0'))
.arg(i16_1, 4, 16, QChar('0'))
.arg(i8_0, 2, 16, QChar('0'))
.arg(i8_1, 2, 16, QChar('0'))
.arg(i8_2, 2, 16, QChar('0'))
.arg(i8_3, 2, 16, QChar('0'))
.arg(i8_4, 2, 16, QChar('0'))
.arg(i8_5, 2, 16, QChar('0'))
.arg(i8_6, 2, 16, QChar('0'))
.arg(i8_7, 2, 16, QChar('0')).toUpper();
}
QString fileTypeToQString(const UINT8 type)
{
switch (type)
{
case EFI_FV_FILETYPE_RAW:
return QObject::tr("Raw");
case EFI_FV_FILETYPE_FREEFORM:
return QObject::tr("Freeform");
case EFI_FV_FILETYPE_SECURITY_CORE:
return QObject::tr("Security core");
case EFI_FV_FILETYPE_PEI_CORE:
return QObject::tr("PEI core");
case EFI_FV_FILETYPE_DXE_CORE:
return QObject::tr("DXE core");
case EFI_FV_FILETYPE_PEIM:
return QObject::tr("PEI module");
case EFI_FV_FILETYPE_DRIVER:
return QObject::tr("DXE driver");
case EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER:
return QObject::tr("Combined PEI/DXE");
case EFI_FV_FILETYPE_APPLICATION:
return QObject::tr("Application");
case EFI_FV_FILETYPE_SMM:
return QObject::tr("SMM module");
case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:
return QObject::tr("Volume image");
case EFI_FV_FILETYPE_COMBINED_SMM_DXE:
return QObject::tr("Combined SMM/DXE");
case EFI_FV_FILETYPE_SMM_CORE:
return QObject::tr("SMM core");
case EFI_FV_FILETYPE_PAD:
return QObject::tr("Pad");
default:
return QObject::tr("Unknown");
};
}
QString sectionTypeToQString(const UINT8 type)
{
switch (type)
{
case EFI_SECTION_COMPRESSION:
return QObject::tr("Compressed");
case EFI_SECTION_GUID_DEFINED:
return QObject::tr("GUID defined");
case EFI_SECTION_DISPOSABLE:
return QObject::tr("Disposable");
case EFI_SECTION_PE32:
return QObject::tr("PE32+ image");
case EFI_SECTION_PIC:
return QObject::tr("PIC image");
case EFI_SECTION_TE:
return QObject::tr("TE image");
case EFI_SECTION_DXE_DEPEX:
return QObject::tr("DXE dependency");
case EFI_SECTION_VERSION:
return QObject::tr("Version");
case EFI_SECTION_USER_INTERFACE:
return QObject::tr("User interface");
case EFI_SECTION_COMPATIBILITY16:
return QObject::tr("16-bit image");
case EFI_SECTION_FIRMWARE_VOLUME_IMAGE:
return QObject::tr("Volume image");
case EFI_SECTION_FREEFORM_SUBTYPE_GUID:
return QObject::tr("Freeform subtype GUID");
case EFI_SECTION_RAW:
return QObject::tr("Raw");
case EFI_SECTION_PEI_DEPEX:
return QObject::tr("PEI dependency");
case EFI_SECTION_SMM_DEPEX:
return QObject::tr("SMM dependency");
case HP_SECTION_POSTCODE:
return QObject::tr("HP postcode");
case SCT_SECTION_POSTCODE:
return QObject::tr("SCT postcode");
default:
return QObject::tr("Unknown");
}
}
UINT32 sizeOfSectionHeader(EFI_COMMON_SECTION_HEADER* header)
{
if (!header)
return 0;
switch (header->Type)
{
case EFI_SECTION_COMPRESSION:
return sizeof(EFI_COMPRESSION_SECTION);
case EFI_SECTION_GUID_DEFINED: {
EFI_GUID_DEFINED_SECTION* gdsHeader = (EFI_GUID_DEFINED_SECTION*)header;
return gdsHeader->DataOffset; }
case EFI_SECTION_DISPOSABLE:
return sizeof(EFI_DISPOSABLE_SECTION);
case EFI_SECTION_PE32:
return sizeof(EFI_PE32_SECTION);
case EFI_SECTION_PIC:
return sizeof(EFI_PIC_SECTION);
case EFI_SECTION_TE:
return sizeof(EFI_TE_SECTION);
case EFI_SECTION_DXE_DEPEX:
return sizeof(EFI_DXE_DEPEX_SECTION);
case EFI_SECTION_VERSION:
return sizeof(EFI_VERSION_SECTION);
case EFI_SECTION_USER_INTERFACE:
return sizeof(EFI_USER_INTERFACE_SECTION);
case EFI_SECTION_COMPATIBILITY16:
return sizeof(EFI_COMPATIBILITY16_SECTION);
case EFI_SECTION_FIRMWARE_VOLUME_IMAGE:
return sizeof(EFI_FIRMWARE_VOLUME_IMAGE_SECTION);
case EFI_SECTION_FREEFORM_SUBTYPE_GUID:
return sizeof(EFI_FREEFORM_SUBTYPE_GUID_SECTION);
case EFI_SECTION_RAW:
return sizeof(EFI_RAW_SECTION);
case EFI_SECTION_PEI_DEPEX:
return sizeof(EFI_PEI_DEPEX_SECTION);
case EFI_SECTION_SMM_DEPEX:
return sizeof(EFI_SMM_DEPEX_SECTION);
case HP_SECTION_POSTCODE:
return sizeof(POSTCODE_SECTION);
case SCT_SECTION_POSTCODE:
return sizeof(POSTCODE_SECTION);
default:
return sizeof(EFI_COMMON_SECTION_HEADER);
}
}