mirror of
https://github.com/LongSoft/UEFITool.git
synced 2024-11-25 17:38:22 +08:00
Version 0.17.1
This commit is contained in:
parent
66dc4bb6e3
commit
dfb307b4aa
@ -1,5 +1,5 @@
|
|||||||
/* LzFind.c -- Match finder for LZ algorithms
|
/* LzFind.c -- Match finder for LZ algorithms
|
||||||
2009-04-22 : Igor Pavlov : Public doma*/
|
2009-04-22 : Igor Pavlov : Public domain */
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* LzmaDec.c -- LZMA Decoder
|
/* LzmaDec.c -- LZMA Decoder
|
||||||
2009-09-20 : Igor Pavlov : Public doma*/
|
2009-09-20 : Igor Pavlov : Public domain*/
|
||||||
|
|
||||||
#include "LzmaDec.h"
|
#include "LzmaDec.h"
|
||||||
|
|
||||||
@ -116,7 +116,7 @@ StopCompilingDueBUG
|
|||||||
#define LZMA_DIC_MIN (1 << 12)
|
#define LZMA_DIC_MIN (1 << 12)
|
||||||
|
|
||||||
/* First LZMA-symbol is always decoded.
|
/* First LZMA-symbol is always decoded.
|
||||||
And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is withlast normalization
|
And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is with last normalization
|
||||||
Out:
|
Out:
|
||||||
Result:
|
Result:
|
||||||
SZ_OK - OK
|
SZ_OK - OK
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* LzmaEnc.c -- LZMA Encoder
|
/* LzmaEnc.c -- LZMA Encoder
|
||||||
2010-04-16 : Igor Pavlov : Public doma*/
|
2010-04-16 : Igor Pavlov : Public domain*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
@ -339,7 +339,7 @@ Returns:
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fillcompressed size and original size
|
// Fill compressed size and original size
|
||||||
//
|
//
|
||||||
mDst = DstBuffer;
|
mDst = DstBuffer;
|
||||||
PutDword(mCompSize+1);
|
PutDword(mCompSize+1);
|
||||||
@ -368,11 +368,11 @@ PutDword(
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Put a dword to output stream
|
Put a DWORD to output stream
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
Data - the dword to put
|
Data - the DWORD to put
|
||||||
|
|
||||||
Returns: (VOID)
|
Returns: (VOID)
|
||||||
|
|
||||||
@ -402,9 +402,9 @@ AllocateMemory ()
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Allocate memory spaces for data structures usedcompression process
|
Allocate memory spaces for data structures used in compression process
|
||||||
|
|
||||||
Argements: (VOID)
|
Arguments: (VOID)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@ -656,7 +656,7 @@ Returns: (VOID)
|
|||||||
|
|
||||||
//
|
//
|
||||||
// We have just got a long match, the target tree
|
// We have just got a long match, the target tree
|
||||||
// can be located by MatchPos + 1. Travese the tree
|
// can be located by MatchPos + 1. Traverse the tree
|
||||||
// from bottom up to get to a proper starting point.
|
// from bottom up to get to a proper starting point.
|
||||||
// The usage of PERC_FLAG ensures proper node deletion
|
// The usage of PERC_FLAG ensures proper node deletion
|
||||||
//DeleteNode() later.
|
//DeleteNode() later.
|
||||||
@ -830,7 +830,7 @@ GetNextMatch ()
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Advance the current position (readnew data if needed).
|
Advance the current position (read new data if needed).
|
||||||
Delete outdated string info. Find a match string for current position.
|
Delete outdated string info. Find a match string for current position.
|
||||||
|
|
||||||
Arguments: (VOID)
|
Arguments: (VOID)
|
||||||
@ -1285,7 +1285,7 @@ Routine Description:
|
|||||||
|
|
||||||
Outputs rightmost n bits of x
|
Outputs rightmost n bits of x
|
||||||
|
|
||||||
Argments:
|
Arguments:
|
||||||
|
|
||||||
n - the rightmost n bits of the data is used
|
n - the rightmost n bits of the data is used
|
||||||
x - the data
|
x - the data
|
||||||
@ -1331,7 +1331,7 @@ FreadCrc (
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Readsource data
|
Read source data
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ Creates Huffman Code mapping table according to code length array.
|
|||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
Sd - The global scratch data
|
Sd - The global scratch data
|
||||||
NumOfChar - Number of symbolsthe symbol set
|
NumOfChar - Number of symbols in the symbol set
|
||||||
BitLen - Code length array
|
BitLen - Code length array
|
||||||
TableBits - The width of the mapping table
|
TableBits - The width of the mapping table
|
||||||
Table - The table
|
Table - The table
|
||||||
@ -681,7 +681,7 @@ ScratchSize - The size of scratch buffer.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved.
|
EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successfully retrieved.
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
@ -729,7 +729,7 @@ Version 2 for Tiano de/compression algorithm.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - Decompression is successfull
|
EFI_SUCCESS - Decompression is successful
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
@ -853,7 +853,7 @@ ScratchSize - The size of scratch buffer.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - Decompression is successfull
|
EFI_SUCCESS - Decompression is successful
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
@ -900,7 +900,7 @@ ScratchSize - The size of scratch buffer.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - Decompression is successfull
|
EFI_SUCCESS - Decompression is successful
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
|
@ -59,7 +59,7 @@ ScratchSize - The size of scratch buffer.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successull retrieved.
|
EFI_SUCCESS - The size of destination buffer and the size of scratch buffer are successfully retrieved.
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
@ -93,7 +93,7 @@ ScratchSize - The size of scratch buffer.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - Decompression is successfull
|
EFI_SUCCESS - Decompression is successful
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
@ -127,7 +127,7 @@ ScratchSize - The size of scratch buffer.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
EFI_SUCCESS - Decompression is successfull
|
EFI_SUCCESS - Decompression is successful
|
||||||
EFI_INVALID_PARAMETER - The source data is corrupted
|
EFI_INVALID_PARAMETER - The source data is corrupted
|
||||||
|
|
||||||
--*/
|
--*/
|
||||||
|
@ -374,11 +374,11 @@ STATIC
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
Put a dword to output stream
|
Put a DWORD to output stream
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
Data - the dword to put
|
Data - the DWORD to put
|
||||||
|
|
||||||
Returns: (VOID)
|
Returns: (VOID)
|
||||||
|
|
||||||
@ -412,7 +412,7 @@ STATIC
|
|||||||
|
|
||||||
Allocate memory spaces for data structures used compression process
|
Allocate memory spaces for data structures used compression process
|
||||||
|
|
||||||
Argements:
|
Arguments:
|
||||||
VOID
|
VOID
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -681,7 +681,7 @@ STATIC
|
|||||||
if (mMatchLen >= 4) {
|
if (mMatchLen >= 4) {
|
||||||
//
|
//
|
||||||
// We have just got a long match, the target tree
|
// We have just got a long match, the target tree
|
||||||
// can be located by MatchPos + 1. Travese the tree
|
// can be located by MatchPos + 1. Traverse the tree
|
||||||
// from bottom up to get to a proper starting point.
|
// from bottom up to get to a proper starting point.
|
||||||
// The usage of PERC_FLAG ensures proper node deletion
|
// The usage of PERC_FLAG ensures proper node deletion
|
||||||
// DeleteNode() later.
|
// DeleteNode() later.
|
||||||
@ -922,7 +922,7 @@ STATIC
|
|||||||
|
|
||||||
Routine Description:
|
Routine Description:
|
||||||
|
|
||||||
The macontrolling routine for compression process.
|
The mac controlling routine for compression process.
|
||||||
|
|
||||||
Arguments: (VOID)
|
Arguments: (VOID)
|
||||||
|
|
||||||
@ -1314,7 +1314,7 @@ STATIC
|
|||||||
if ((mOutputMask >>= 1) == 0) {
|
if ((mOutputMask >>= 1) == 0) {
|
||||||
mOutputMask = 1U << (UINT8_BIT - 1);
|
mOutputMask = 1U << (UINT8_BIT - 1);
|
||||||
//
|
//
|
||||||
// Check the buffer overflow per outputing UINT8_BIT symbols
|
// Check the buffer overflow per outputting UINT8_BIT symbols
|
||||||
// which is an Original Character or a Pointer. The biggest
|
// which is an Original Character or a Pointer. The biggest
|
||||||
// symbol is a Pointer which occupies 5 bytes.
|
// symbol is a Pointer which occupies 5 bytes.
|
||||||
//
|
//
|
||||||
|
@ -152,8 +152,10 @@ enum CapsuleSubtypes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
enum VolumeSubtypes {
|
enum VolumeSubtypes {
|
||||||
BootVolume = 90,
|
NormalVolume = 90,
|
||||||
UnknownVolume
|
BootVolume,
|
||||||
|
UnknownVolume,
|
||||||
|
NvramVolume
|
||||||
};
|
};
|
||||||
|
|
||||||
enum RegionSubtypes {
|
enum RegionSubtypes {
|
||||||
@ -165,7 +167,7 @@ enum RegionSubtypes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// EFI GUID
|
// EFI GUID
|
||||||
typedef struct{
|
typedef struct {
|
||||||
UINT8 Data[16];
|
UINT8 Data[16];
|
||||||
} EFI_GUID;
|
} EFI_GUID;
|
||||||
|
|
||||||
|
@ -76,7 +76,7 @@ typedef struct {
|
|||||||
#define FLASH_DENSITY_8MB 0x04
|
#define FLASH_DENSITY_8MB 0x04
|
||||||
#define FLASH_DENSITY_16MB 0x05
|
#define FLASH_DENSITY_16MB 0x05
|
||||||
|
|
||||||
// Flash frequences
|
// Flash frequencies
|
||||||
#define FLASH_FREQUENCY_20MHZ 0x00
|
#define FLASH_FREQUENCY_20MHZ 0x00
|
||||||
#define FLASH_FREQUENCY_33MHZ 0x01
|
#define FLASH_FREQUENCY_33MHZ 0x01
|
||||||
#define FLASH_FREQUENCY_50MHZ 0x04
|
#define FLASH_FREQUENCY_50MHZ 0x04
|
||||||
|
7
ffs.h
7
ffs.h
@ -55,7 +55,7 @@ typedef struct {
|
|||||||
EFI_CAPSULE_HEADER CapsuleHeader;
|
EFI_CAPSULE_HEADER CapsuleHeader;
|
||||||
UINT16 RomImageOffset; // offset in bytes from the beginning of the capsule header to the start of
|
UINT16 RomImageOffset; // offset in bytes from the beginning of the capsule header to the start of
|
||||||
// the capsule volume
|
// the capsule volume
|
||||||
//!TODO: Enable certificate and rom layout reading
|
//!TODO: Enable certificate and ROM layout reading
|
||||||
//UINT16 RomLayoutOffset; // offset to the table of the module descriptors in the capsule's volume
|
//UINT16 RomLayoutOffset; // offset to the table of the module descriptors in the capsule's volume
|
||||||
// that are included in the signature calculation
|
// that are included in the signature calculation
|
||||||
//FW_CERTIFICATE FWCert;
|
//FW_CERTIFICATE FWCert;
|
||||||
@ -91,7 +91,7 @@ typedef struct {
|
|||||||
//EFI_FV_BLOCK_MAP_ENTRY FvBlockMap[1];
|
//EFI_FV_BLOCK_MAP_ENTRY FvBlockMap[1];
|
||||||
} EFI_FIRMWARE_VOLUME_HEADER;
|
} EFI_FIRMWARE_VOLUME_HEADER;
|
||||||
|
|
||||||
// Filesystem GUIDs
|
// File system GUIDs
|
||||||
const QByteArray EFI_FIRMWARE_FILE_SYSTEM_GUID
|
const QByteArray EFI_FIRMWARE_FILE_SYSTEM_GUID
|
||||||
("\xD9\x54\x93\x7A\x68\x04\x4A\x44\x81\xCE\x0B\xF6\x17\xD8\x90\xDF", 16);
|
("\xD9\x54\x93\x7A\x68\x04\x4A\x44\x81\xCE\x0B\xF6\x17\xD8\x90\xDF", 16);
|
||||||
const QByteArray EFI_APPLE_BOOT_VOLUME_FILE_SYSTEM_GUID
|
const QByteArray EFI_APPLE_BOOT_VOLUME_FILE_SYSTEM_GUID
|
||||||
@ -214,6 +214,9 @@ typedef struct {
|
|||||||
//UINT8 Data[];
|
//UINT8 Data[];
|
||||||
} EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE;
|
} EFI_FIRMWARE_VOLUME_EXT_ENTRY_GUID_TYPE;
|
||||||
|
|
||||||
|
// NVRAM volume signature
|
||||||
|
const QByteArray EFI_FIRMWARE_VOLUME_NVRAM_SIGNATURE("$VSS", 4);
|
||||||
|
|
||||||
// Volume header 16bit checksum calculation routine
|
// Volume header 16bit checksum calculation routine
|
||||||
extern UINT16 calculateChecksum16(UINT16* buffer, UINT32 bufferSize);
|
extern UINT16 calculateChecksum16(UINT16* buffer, UINT32 bufferSize);
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ UINT8 FfsEngine::parseImageFile(const QByteArray & buffer)
|
|||||||
QModelIndex index;
|
QModelIndex index;
|
||||||
QByteArray flashImage;
|
QByteArray flashImage;
|
||||||
|
|
||||||
// Check buffer size to be more then or equal to sizeof(EFI_CAPSULE_HEADER)
|
// Check buffer size to be more then or equal to size of EFI_CAPSULE_HEADER
|
||||||
if ((UINT32) buffer.size() <= sizeof(EFI_CAPSULE_HEADER))
|
if ((UINT32) buffer.size() <= sizeof(EFI_CAPSULE_HEADER))
|
||||||
{
|
{
|
||||||
msg(tr("parseImageFile: Image file is smaller then minimum size of %1 bytes").arg(sizeof(EFI_CAPSULE_HEADER)));
|
msg(tr("parseImageFile: Image file is smaller then minimum size of %1 bytes").arg(sizeof(EFI_CAPSULE_HEADER)));
|
||||||
@ -627,7 +627,7 @@ UINT8 FfsEngine::findNextVolume(const QByteArray & bios, UINT32 volumeOffset, UI
|
|||||||
return ERR_SUCCESS;
|
return ERR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT8 FfsEngine::getVolumeSize(const QByteArray & bios, UINT32 volumeOffset, UINT32 & volumeSize)
|
UINT8 FfsEngine::getVolumeSize(const QByteArray & bios, UINT32 volumeOffset, UINT32 & volumeSize, bool fromHeader)
|
||||||
{
|
{
|
||||||
// Populate volume header
|
// Populate volume header
|
||||||
EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (EFI_FIRMWARE_VOLUME_HEADER*) (bios.constData() + volumeOffset);
|
EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (EFI_FIRMWARE_VOLUME_HEADER*) (bios.constData() + volumeOffset);
|
||||||
@ -636,16 +636,22 @@ UINT8 FfsEngine::getVolumeSize(const QByteArray & bios, UINT32 volumeOffset, UIN
|
|||||||
if (QByteArray((const char*) &volumeHeader->Signature, sizeof(volumeHeader->Signature)) != EFI_FV_SIGNATURE)
|
if (QByteArray((const char*) &volumeHeader->Signature, sizeof(volumeHeader->Signature)) != EFI_FV_SIGNATURE)
|
||||||
return ERR_INVALID_VOLUME;
|
return ERR_INVALID_VOLUME;
|
||||||
|
|
||||||
// Use BlockMap to determine volume size
|
if (fromHeader) {
|
||||||
EFI_FV_BLOCK_MAP_ENTRY* entry = (EFI_FV_BLOCK_MAP_ENTRY*) (bios.constData() + volumeOffset + sizeof(EFI_FIRMWARE_VOLUME_HEADER));
|
// Use header field
|
||||||
|
volumeSize = volumeHeader->FvLength;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Use BlockMap
|
||||||
|
EFI_FV_BLOCK_MAP_ENTRY* entry = (EFI_FV_BLOCK_MAP_ENTRY*)(bios.constData() + volumeOffset + sizeof(EFI_FIRMWARE_VOLUME_HEADER));
|
||||||
volumeSize = 0;
|
volumeSize = 0;
|
||||||
while(entry->NumBlocks != 0 && entry->Length != 0) {
|
while (entry->NumBlocks != 0 && entry->Length != 0) {
|
||||||
if ((void*) entry > bios.constData() + bios.size())
|
if ((void*)entry > bios.constData() + bios.size())
|
||||||
return ERR_INVALID_VOLUME;
|
return ERR_INVALID_VOLUME;
|
||||||
|
|
||||||
volumeSize += entry->NumBlocks * entry->Length;
|
volumeSize += entry->NumBlocks * entry->Length;
|
||||||
entry += 1;
|
entry += 1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return ERR_SUCCESS;
|
return ERR_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -655,9 +661,19 @@ UINT8 FfsEngine::parseVolume(const QByteArray & volume, QModelIndex & index, co
|
|||||||
// Populate volume header
|
// Populate volume header
|
||||||
EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (EFI_FIRMWARE_VOLUME_HEADER*) (volume.constData());
|
EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (EFI_FIRMWARE_VOLUME_HEADER*) (volume.constData());
|
||||||
|
|
||||||
// Check filesystem GUID to be known
|
// Calculate volume header size
|
||||||
// Do not parse volume with unknown FFS, because parsing will fail
|
UINT32 headerSize;
|
||||||
bool parseCurrentVolume = true;
|
if (volumeHeader->Revision > 1 && volumeHeader->ExtHeaderOffset) {
|
||||||
|
EFI_FIRMWARE_VOLUME_EXT_HEADER* extendedHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER*)((UINT8*)volumeHeader + volumeHeader->ExtHeaderOffset);
|
||||||
|
headerSize = volumeHeader->ExtHeaderOffset + extendedHeader->ExtHeaderSize;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
headerSize = volumeHeader->HeaderLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for volume structure to be known
|
||||||
|
// Default volume subtype is "normal"
|
||||||
|
UINT8 subtype = NormalVolume;
|
||||||
// FFS GUID v1
|
// FFS GUID v1
|
||||||
if (QByteArray((const char*) &volumeHeader->FileSystemGuid, sizeof(EFI_GUID)) == EFI_FIRMWARE_FILE_SYSTEM_GUID) {
|
if (QByteArray((const char*) &volumeHeader->FileSystemGuid, sizeof(EFI_GUID)) == EFI_FIRMWARE_FILE_SYSTEM_GUID) {
|
||||||
// Code can be added here
|
// Code can be added here
|
||||||
@ -670,35 +686,25 @@ UINT8 FfsEngine::parseVolume(const QByteArray & volume, QModelIndex & index, co
|
|||||||
else if (QByteArray((const char*) &volumeHeader->FileSystemGuid, sizeof(EFI_GUID)) == EFI_FIRMWARE_FILE_SYSTEM2_GUID) {
|
else if (QByteArray((const char*) &volumeHeader->FileSystemGuid, sizeof(EFI_GUID)) == EFI_FIRMWARE_FILE_SYSTEM2_GUID) {
|
||||||
// Code can be added here
|
// Code can be added here
|
||||||
}
|
}
|
||||||
|
// NVRAM volume
|
||||||
|
else if (QByteArray((const char*)volumeHeader + headerSize, EFI_FIRMWARE_VOLUME_NVRAM_SIGNATURE.length()) == EFI_FIRMWARE_VOLUME_NVRAM_SIGNATURE) {
|
||||||
|
subtype = NvramVolume;
|
||||||
|
}
|
||||||
// Other GUID
|
// Other GUID
|
||||||
else {
|
else {
|
||||||
msg(tr("parseVolume: Unknown file system (%1)").arg(guidToQString(volumeHeader->FileSystemGuid)), parent);
|
msg(tr("parseVolume: Unknown file system (%1)").arg(guidToQString(volumeHeader->FileSystemGuid)), parent);
|
||||||
parseCurrentVolume = false;
|
subtype = UnknownVolume;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check attributes
|
// Check attributes
|
||||||
// Determine value of empty byte
|
// Determine value of empty byte
|
||||||
char empty = volumeHeader->Attributes & EFI_FVB_ERASE_POLARITY ? '\xFF' : '\x00';
|
char empty = volumeHeader->Attributes & EFI_FVB_ERASE_POLARITY ? '\xFF' : '\x00';
|
||||||
|
|
||||||
// Check header checksum by recalculating it
|
|
||||||
if (calculateChecksum16((UINT16*) volumeHeader, volumeHeader->HeaderLength)) {
|
|
||||||
msg(tr("parseVolume: Volume header checksum is invalid"), parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for presence of extended header, only if header revision is greater then 1
|
|
||||||
UINT32 headerSize;
|
|
||||||
if (volumeHeader->Revision > 1 && volumeHeader->ExtHeaderOffset) {
|
|
||||||
EFI_FIRMWARE_VOLUME_EXT_HEADER* extendedHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER*) ((UINT8*) volumeHeader + volumeHeader->ExtHeaderOffset);
|
|
||||||
headerSize = volumeHeader->ExtHeaderOffset + extendedHeader->ExtHeaderSize;
|
|
||||||
} else {
|
|
||||||
headerSize = volumeHeader->HeaderLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get volume size
|
// Get volume size
|
||||||
UINT8 result;
|
UINT8 result;
|
||||||
UINT32 volumeSize;
|
UINT32 volumeSize;
|
||||||
|
|
||||||
result = getVolumeSize(volume, 0, volumeSize);
|
result = getVolumeSize(volume, 0, volumeSize, false);
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@ -709,6 +715,14 @@ UINT8 FfsEngine::parseVolume(const QByteArray & volume, QModelIndex & index, co
|
|||||||
.arg(volumeHeader->FvLength, 8, 16, QChar('0'))
|
.arg(volumeHeader->FvLength, 8, 16, QChar('0'))
|
||||||
.arg(volumeSize, 8, 16, QChar('0')), parent);
|
.arg(volumeSize, 8, 16, QChar('0')), parent);
|
||||||
}
|
}
|
||||||
|
// Trust header size
|
||||||
|
else
|
||||||
|
volumeSize = volumeHeader->FvLength;
|
||||||
|
|
||||||
|
// Check header checksum by recalculating it
|
||||||
|
if (subtype == NormalVolume && calculateChecksum16((UINT16*)volumeHeader, volumeHeader->HeaderLength)) {
|
||||||
|
msg(tr("parseVolume: Volume header checksum is invalid"), parent);
|
||||||
|
}
|
||||||
|
|
||||||
// Get info
|
// Get info
|
||||||
QString name = guidToQString(volumeHeader->FileSystemGuid);
|
QString name = guidToQString(volumeHeader->FileSystemGuid);
|
||||||
@ -721,15 +735,11 @@ UINT8 FfsEngine::parseVolume(const QByteArray & volume, QModelIndex & index, co
|
|||||||
// Add tree item
|
// Add tree item
|
||||||
QByteArray header = volume.left(headerSize);
|
QByteArray header = volume.left(headerSize);
|
||||||
QByteArray body = volume.mid(headerSize, volumeSize - headerSize);
|
QByteArray body = volume.mid(headerSize, volumeSize - headerSize);
|
||||||
|
index = model->addItem(Volume, subtype, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body, QByteArray(), parent, mode);
|
||||||
|
|
||||||
|
// Do not parse the contents of volumes other then normal
|
||||||
// Do not parse volumes with unknown FS
|
if (subtype != NormalVolume)
|
||||||
if (!parseCurrentVolume) {
|
|
||||||
index = model->addItem(Volume, UnknownVolume, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body, QByteArray(), parent, mode);
|
|
||||||
return ERR_SUCCESS;
|
return ERR_SUCCESS;
|
||||||
}
|
|
||||||
else
|
|
||||||
index = model->addItem(Volume, 0, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body, QByteArray(), parent, mode);
|
|
||||||
|
|
||||||
// Search for and parse all files
|
// Search for and parse all files
|
||||||
UINT32 fileOffset = headerSize;
|
UINT32 fileOffset = headerSize;
|
||||||
@ -741,7 +751,7 @@ UINT8 FfsEngine::parseVolume(const QByteArray & volume, QModelIndex & index, co
|
|||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
// Check file size to be at least sizeof(EFI_FFS_FILE_HEADER)
|
// Check file size to be at least size of EFI_FFS_FILE_HEADER
|
||||||
if (fileSize < sizeof(EFI_FFS_FILE_HEADER)) {
|
if (fileSize < sizeof(EFI_FFS_FILE_HEADER)) {
|
||||||
msg(tr("parseVolume: File with invalid size"), index);
|
msg(tr("parseVolume: File with invalid size"), index);
|
||||||
return ERR_INVALID_FILE;
|
return ERR_INVALID_FILE;
|
||||||
@ -939,7 +949,7 @@ UINT8 FfsEngine::parseFile(const QByteArray & file, QModelIndex & index, const U
|
|||||||
.arg(fileHeader->State, 2, 16, QChar('0'));
|
.arg(fileHeader->State, 2, 16, QChar('0'));
|
||||||
|
|
||||||
// Add tree item
|
// Add tree item
|
||||||
index = model->addItem( File, fileHeader->Type, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body, tail, parent, mode);
|
index = model->addItem(File, fileHeader->Type, COMPRESSION_ALGORITHM_NONE, name, "", info, header, body, tail, parent, mode);
|
||||||
|
|
||||||
if (!parseCurrentFile)
|
if (!parseCurrentFile)
|
||||||
return ERR_SUCCESS;
|
return ERR_SUCCESS;
|
||||||
@ -2158,7 +2168,7 @@ out:
|
|||||||
// File will be unaligned if added as is, so we must add pad file before it
|
// File will be unaligned if added as is, so we must add pad file before it
|
||||||
// Determine pad file size
|
// Determine pad file size
|
||||||
UINT32 size = alignment - (alignmentBase % alignment);
|
UINT32 size = alignment - (alignmentBase % alignment);
|
||||||
// Required padding is smaler then minimal pad file size
|
// Required padding is smaller then minimal pad file size
|
||||||
while (size < sizeof(EFI_FFS_FILE_HEADER)) {
|
while (size < sizeof(EFI_FFS_FILE_HEADER)) {
|
||||||
size += alignment;
|
size += alignment;
|
||||||
}
|
}
|
||||||
@ -2235,7 +2245,7 @@ out:
|
|||||||
// Root volume can't be grown yet
|
// Root volume can't be grown yet
|
||||||
UINT8 parentType = model->type(index.parent());
|
UINT8 parentType = model->type(index.parent());
|
||||||
if(parentType != File && parentType != Section) {
|
if(parentType != File && parentType != Section) {
|
||||||
msg(tr("reconstructVolume: %1: can't grow root volume").arg(guidToQString(volumeHeader->FileSystemGuid)), index);
|
msg(tr("reconstructVolume: %1: root volume can't be grown").arg(guidToQString(volumeHeader->FileSystemGuid)), index);
|
||||||
return ERR_INVALID_VOLUME;
|
return ERR_INVALID_VOLUME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2517,7 +2527,7 @@ UINT8 FfsEngine::reconstructSection(const QModelIndex& index, const UINT32 base,
|
|||||||
result = compress(reconstructed, model->compression(index), compressed);
|
result = compress(reconstructed, model->compression(index), compressed);
|
||||||
if (result)
|
if (result)
|
||||||
return result;
|
return result;
|
||||||
// Check for auth status valid attribute
|
// Check for authentication status valid attribute
|
||||||
if (guidDefinedHeader->Attributes & EFI_GUIDED_SECTION_AUTH_STATUS_VALID) {
|
if (guidDefinedHeader->Attributes & EFI_GUIDED_SECTION_AUTH_STATUS_VALID) {
|
||||||
msg(tr("reconstructSection: %1: GUID defined section signature can now become invalid")
|
msg(tr("reconstructSection: %1: GUID defined section signature can now become invalid")
|
||||||
.arg(guidToQString(guidDefinedHeader->SectionDefinitionGuid)), index);
|
.arg(guidToQString(guidDefinedHeader->SectionDefinitionGuid)), index);
|
||||||
@ -2890,11 +2900,11 @@ UINT8 FfsEngine::rebase(QByteArray &executable, const UINT32 base)
|
|||||||
return ERR_UNKNOWN_RELOCATION_TYPE;
|
return ERR_UNKNOWN_RELOCATION_TYPE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next reloc record
|
// Next relocation record
|
||||||
Reloc += 1;
|
Reloc += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Next reloc block
|
// Next relocation block
|
||||||
RelocBase = (EFI_IMAGE_BASE_RELOCATION*)RelocEnd;
|
RelocBase = (EFI_IMAGE_BASE_RELOCATION*)RelocEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2913,7 +2923,7 @@ UINT8 FfsEngine::patchVtf(QByteArray &vtf)
|
|||||||
// No need to patch anything
|
// No need to patch anything
|
||||||
return ERR_SUCCESS;
|
return ERR_SUCCESS;
|
||||||
|
|
||||||
// Replace last occurence of oldPeiCoreEntryPoint with newPeiCoreEntryPoint
|
// Replace last occurrence of oldPeiCoreEntryPoint with newPeiCoreEntryPoint
|
||||||
QByteArray old((char*) &oldPeiCoreEntryPoint, sizeof(oldPeiCoreEntryPoint));
|
QByteArray old((char*) &oldPeiCoreEntryPoint, sizeof(oldPeiCoreEntryPoint));
|
||||||
int i = vtf.lastIndexOf(old);
|
int i = vtf.lastIndexOf(old);
|
||||||
if (i == -1) {
|
if (i == -1) {
|
||||||
|
@ -93,7 +93,7 @@ private:
|
|||||||
|
|
||||||
// Parsing helpers
|
// Parsing helpers
|
||||||
UINT8 findNextVolume(const QByteArray & bios, const UINT32 volumeOffset, UINT32 & nextVolumeOffset);
|
UINT8 findNextVolume(const QByteArray & bios, const UINT32 volumeOffset, UINT32 & nextVolumeOffset);
|
||||||
UINT8 getVolumeSize(const QByteArray & bios, const UINT32 volumeOffset, UINT32 & volumeSize);
|
UINT8 getVolumeSize(const QByteArray & bios, const UINT32 volumeOffset, UINT32 & volumeSize, bool fromHeader = true);
|
||||||
UINT8 getFileSize(const QByteArray & volume, const UINT32 fileOffset, UINT32 & fileSize);
|
UINT8 getFileSize(const QByteArray & volume, const UINT32 fileOffset, UINT32 & fileSize);
|
||||||
UINT8 getSectionSize(const QByteArray & file, const UINT32 sectionOffset, UINT32 & sectionSize);
|
UINT8 getSectionSize(const QByteArray & file, const UINT32 sectionOffset, UINT32 & sectionSize);
|
||||||
|
|
||||||
|
10
peimage.h
10
peimage.h
@ -66,7 +66,7 @@ typedef struct {
|
|||||||
UINT16 e_oemid; // OEM identifier (for e_oeminfo)
|
UINT16 e_oemid; // OEM identifier (for e_oeminfo)
|
||||||
UINT16 e_oeminfo; // OEM information; e_oemid specific
|
UINT16 e_oeminfo; // OEM information; e_oemid specific
|
||||||
UINT16 e_res2[10]; // Reserved words
|
UINT16 e_res2[10]; // Reserved words
|
||||||
UINT32 e_lfanew; // File address of new exe header
|
UINT32 e_lfanew; // File address of new header
|
||||||
} EFI_IMAGE_DOS_HEADER;
|
} EFI_IMAGE_DOS_HEADER;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -91,8 +91,8 @@ typedef struct {
|
|||||||
// Characteristics
|
// Characteristics
|
||||||
//
|
//
|
||||||
#define EFI_IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file
|
#define EFI_IMAGE_FILE_RELOCS_STRIPPED 0x0001 // Relocation info stripped from file
|
||||||
#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved externel references)
|
#define EFI_IMAGE_FILE_EXECUTABLE_IMAGE 0x0002 // File is executable (i.e. no unresolved external references)
|
||||||
#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line nunbers stripped from file
|
#define EFI_IMAGE_FILE_LINE_NUMS_STRIPPED 0x0004 // Line numbers stripped from file
|
||||||
#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file
|
#define EFI_IMAGE_FILE_LOCAL_SYMS_STRIPPED 0x0008 // Local symbols stripped from file
|
||||||
#define EFI_IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed
|
#define EFI_IMAGE_FILE_BYTES_REVERSED_LO 0x0080 // Bytes of machine word are reversed
|
||||||
#define EFI_IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine
|
#define EFI_IMAGE_FILE_32BIT_MACHINE 0x0100 // 32 bit word machine
|
||||||
@ -478,7 +478,7 @@ typedef struct {
|
|||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
union {
|
union {
|
||||||
UINT32 SymbolTableIndex; // Symbol table index of function name if Linenumber is 0
|
UINT32 SymbolTableIndex; // Symbol table index of function name if line number is 0
|
||||||
UINT32 VirtualAddress; // Virtual address of line number
|
UINT32 VirtualAddress; // Virtual address of line number
|
||||||
} Type;
|
} Type;
|
||||||
UINT16 Linenumber; // Line number
|
UINT16 Linenumber; // Line number
|
||||||
@ -622,7 +622,7 @@ typedef struct {
|
|||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Debug Data Structure defined by Apple Mach-O to Coff utility.
|
// Debug Data Structure defined by Apple Mach-O to COFF utility.
|
||||||
//
|
//
|
||||||
#define CODEVIEW_SIGNATURE_MTOC 0x434F544D // MTOC
|
#define CODEVIEW_SIGNATURE_MTOC 0x434F544D // MTOC
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -58,6 +58,8 @@ QString itemSubtypeToQString(const UINT8 type, const UINT8 subtype)
|
|||||||
return QObject::tr("Boot");
|
return QObject::tr("Boot");
|
||||||
else if (subtype == UnknownVolume)
|
else if (subtype == UnknownVolume)
|
||||||
return QObject::tr("Unknown");
|
return QObject::tr("Unknown");
|
||||||
|
else if (subtype == NvramVolume)
|
||||||
|
return QObject::tr("NVRAM");
|
||||||
else
|
else
|
||||||
return "";
|
return "";
|
||||||
case Capsule:
|
case Capsule:
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>UEFITool 0.17.0</string>
|
<string>UEFITool 0.17.1</string>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralWidget">
|
<widget class="QWidget" name="centralWidget">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
|
Loading…
Reference in New Issue
Block a user