mirror of
https://github.com/acidanthera/audk.git
synced 2025-05-23 07:50:09 +02:00
FCE is a tool to retrieve and change HII configuration data in Firmware Device(*.fd) files. https://bugzilla.tianocore.org/show_bug.cgi?id=1848 Cc: Bob Feng <bob.c.feng@intel.com> Cc: Liming Gao <liming.gao@intel.com> Signed-off-by: Shenglei Zhang <shenglei.zhang@intel.com> Reviewed-by: Bob Feng <bob.c.feng@intel.com>
217 lines
4.9 KiB
C
217 lines
4.9 KiB
C
/** @file
|
|
|
|
The API to create the binary.
|
|
|
|
Copyright (c) 2011-2019, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#include "BinaryCreate.h"
|
|
#ifndef __GNUC__
|
|
#define GENSEC_RAW "GenSec -s %s \"%s\" -o \"%s\" > NUL"
|
|
#else
|
|
#define GENSEC_RAW "GenSec -s %s \"%s\" -o \"%s\" > /dev/null"
|
|
#endif
|
|
|
|
//
|
|
// The guid is to for FFS of BFV.
|
|
//
|
|
EFI_GUID gEfiFfsBfvForMultiPlatformGuid = EFI_FFS_BFV_FOR_MULTIPLATFORM_GUID;
|
|
EFI_GUID gEfiFfsBfvForMultiPlatformGuid2 = EFI_FFS_BFV_FOR_MULTIPLATFORM_GUID2;
|
|
|
|
/**
|
|
Convert a GUID to a string.
|
|
|
|
@param[in] Guid Pointer to GUID to print.
|
|
|
|
@return The string after convert.
|
|
**/
|
|
static
|
|
CHAR8 *
|
|
LibBfmGuidToStr (
|
|
IN EFI_GUID *Guid
|
|
)
|
|
{
|
|
CHAR8 * Buffer;
|
|
|
|
Buffer = NULL;
|
|
|
|
if (Guid == NULL) {
|
|
return NULL;
|
|
}
|
|
|
|
Buffer = (CHAR8 *) malloc (36 + 1);
|
|
|
|
if (Buffer == NULL) {
|
|
return NULL;
|
|
}
|
|
memset (Buffer, '\0', 36 + 1);
|
|
|
|
sprintf (
|
|
Buffer,
|
|
"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
|
|
Guid->Data1,
|
|
Guid->Data2,
|
|
Guid->Data3,
|
|
Guid->Data4[0],
|
|
Guid->Data4[1],
|
|
Guid->Data4[2],
|
|
Guid->Data4[3],
|
|
Guid->Data4[4],
|
|
Guid->Data4[5],
|
|
Guid->Data4[6],
|
|
Guid->Data4[7]
|
|
);
|
|
|
|
return Buffer;
|
|
}
|
|
|
|
/**
|
|
Create the Ras section in FFS
|
|
|
|
@param[in] InputFilePath .efi file, it's optional unless process PE/TE section.
|
|
@param[in] OutputFilePath .te or .pe file
|
|
|
|
@retval EFI_SUCCESS
|
|
|
|
**/
|
|
EFI_STATUS
|
|
CreateRawSection (
|
|
IN CHAR8* InputFilePath,
|
|
IN CHAR8* OutputFilePath
|
|
)
|
|
{
|
|
INT32 ReturnValue;
|
|
CHAR8* SystemCommand;
|
|
|
|
SystemCommand = NULL;
|
|
SystemCommand = malloc (
|
|
strlen (GENSEC_RAW) +
|
|
strlen ("EFI_SECTION_RAW") +
|
|
strlen (InputFilePath) +
|
|
strlen (OutputFilePath) +
|
|
1
|
|
);
|
|
if (NULL == SystemCommand) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
sprintf (
|
|
SystemCommand,
|
|
GENSEC_RAW,
|
|
"EFI_SECTION_RAW",
|
|
InputFilePath,
|
|
OutputFilePath
|
|
);
|
|
ReturnValue = system (SystemCommand);
|
|
free(SystemCommand);
|
|
|
|
if (ReturnValue != 0) {
|
|
printf ("Error. Call GenSec failed.\n");
|
|
return EFI_ABORTED;
|
|
}
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
/**
|
|
Create the Ras type of FFS
|
|
|
|
@param[in] InputFilePath .efi file, it's optional unless process PE/TE section.
|
|
@param[in] OutputFilePath .te or .pe file
|
|
|
|
@retval EFI_SUCCESS
|
|
|
|
**/
|
|
EFI_STATUS
|
|
CreateRawFfs (
|
|
IN CHAR8** InputFilePaths,
|
|
IN CHAR8* OutputFilePath,
|
|
IN BOOLEAN SizeOptimized
|
|
)
|
|
{
|
|
INT32 ReturnValue;
|
|
CHAR8* SystemCommandFormatString;
|
|
CHAR8* SystemCommand;
|
|
CHAR8* GuidStr;
|
|
CHAR8* FilePathFormatStr;
|
|
CHAR8* FilePathStr;
|
|
UINT32 Index;
|
|
UINT32 StrLen;
|
|
UINT32 Size;
|
|
|
|
SystemCommand = NULL;
|
|
GuidStr = NULL;
|
|
FilePathStr = NULL;
|
|
StrLen = 0;
|
|
|
|
FilePathFormatStr = " -i \"";
|
|
|
|
for (Index = 0; InputFilePaths[Index] != NULL; Index++) {
|
|
Size = strlen (FilePathFormatStr) + strlen (InputFilePaths[Index]) + 2; // 2 menas "" "
|
|
if (FilePathStr == NULL) {
|
|
FilePathStr = malloc (Size);
|
|
if (NULL == FilePathStr) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
} else {
|
|
FilePathStr = realloc (FilePathStr, StrLen + Size);
|
|
if (NULL == FilePathStr) {
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
}
|
|
memset (FilePathStr + StrLen, ' ', Size);
|
|
memcpy (FilePathStr + StrLen, FilePathFormatStr, strlen(FilePathFormatStr));
|
|
memcpy(FilePathStr + StrLen + strlen(FilePathFormatStr), InputFilePaths[Index], strlen(InputFilePaths[Index]));
|
|
StrLen += Size;
|
|
*(FilePathStr + StrLen - 2) = '\"';
|
|
}
|
|
if (FilePathStr == NULL) {
|
|
return EFI_ABORTED;
|
|
}
|
|
*(FilePathStr + StrLen - 1)= '\0';
|
|
|
|
|
|
if (SizeOptimized) {
|
|
GuidStr = LibBfmGuidToStr(&gEfiFfsBfvForMultiPlatformGuid2);
|
|
} else {
|
|
GuidStr = LibBfmGuidToStr(&gEfiFfsBfvForMultiPlatformGuid);
|
|
}
|
|
if (NULL == GuidStr) {
|
|
free (FilePathStr);
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
SystemCommandFormatString = "GenFfs -t %s %s -g %s -o \"%s\"";
|
|
SystemCommand = malloc (
|
|
strlen (SystemCommandFormatString) +
|
|
strlen ("EFI_FV_FILETYPE_FREEFORM") +
|
|
strlen (FilePathStr) +
|
|
strlen (GuidStr) +
|
|
strlen (OutputFilePath) +
|
|
1
|
|
);
|
|
if (NULL == SystemCommand) {
|
|
free (GuidStr);
|
|
free (FilePathStr);
|
|
return EFI_OUT_OF_RESOURCES;
|
|
}
|
|
sprintf (
|
|
SystemCommand,
|
|
"GenFfs -t %s %s -g %s -o \"%s\"",
|
|
"EFI_FV_FILETYPE_FREEFORM",// -t
|
|
FilePathStr, // -i
|
|
GuidStr, // -g
|
|
OutputFilePath // -o
|
|
);
|
|
ReturnValue = system (SystemCommand);
|
|
free(SystemCommand);
|
|
free (FilePathStr);
|
|
free (GuidStr);
|
|
|
|
if (ReturnValue != 0) {
|
|
printf ("Error. Call GenFfs failed.\n");
|
|
return EFI_ABORTED;
|
|
}
|
|
return EFI_SUCCESS;
|
|
}
|
|
|