genffsfile.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 2,403 行 · 第 1/5 页
C
2,403 行
EFI_GUID_DEFINED_SECTION GuidSectionHeader;
UINT8 *SwapBuffer;
SwapBuffer = NULL;
if (DataSize == 0) {
*BufferSize = 0;
return EFI_SUCCESS;
}
TotalSize = DataSize + sizeof (EFI_GUID_DEFINED_SECTION);
GuidSectionHeader.CommonHeader.Type = EFI_SECTION_GUID_DEFINED;
GuidSectionHeader.CommonHeader.Size[0] = (UINT8) (TotalSize & 0xff);
GuidSectionHeader.CommonHeader.Size[1] = (UINT8) ((TotalSize & 0xff00) >> 8);
GuidSectionHeader.CommonHeader.Size[2] = (UINT8) ((TotalSize & 0xff0000) >> 16);
memcpy (&(GuidSectionHeader.SectionDefinitionGuid), &SignGuid, sizeof (EFI_GUID));
GuidSectionHeader.Attributes = GuidedSectionAttributes;
GuidSectionHeader.DataOffset = sizeof (EFI_GUID_DEFINED_SECTION);
SwapBuffer = (UINT8 *) malloc (DataSize);
if (SwapBuffer == NULL) {
return EFI_OUT_OF_RESOURCES;
}
memcpy (SwapBuffer, FileBuffer, DataSize);
memcpy (FileBuffer, &GuidSectionHeader, sizeof (EFI_GUID_DEFINED_SECTION));
memcpy (FileBuffer + sizeof (EFI_GUID_DEFINED_SECTION), SwapBuffer, DataSize);
//
// Make sure section ends on a DWORD boundary
//
while ((TotalSize & 0x03) != 0) {
FileBuffer[TotalSize] = 0;
TotalSize++;
}
*BufferSize = TotalSize;
if (SwapBuffer != NULL) {
free (SwapBuffer);
}
return EFI_SUCCESS;
}
static
EFI_STATUS
CompressSection (
UINT8 *FileBuffer,
UINT32 *BufferSize,
UINT32 DataSize,
CHAR8 *Type
)
/*++
Routine Description:
Compress the data and add section header for the compressed data.
Compressed data (with section header) stays in same location as the source
(overwrites source data).
Arguments:
FileBuffer - Buffer containing data to Compress
BufferSize - On input, the size of FileBuffer. On output, the size of
actual compressed data (including added section header).
When buffer is too small, this value indicates the size needed.
DataSize - The size of data to compress
Type - The compression type (not used currently).
Assume EFI_HEAVY_COMPRESSION.
Returns:
EFI_BUFFER_TOO_SMALL - Buffer size is too small.
EFI_UNSUPPORTED - Compress type can not be supported.
EFI_SUCCESS - Successful
EFI_OUT_OF_RESOURCES - Not enough resource.
--*/
{
EFI_STATUS Status;
UINT8 *CompData;
UINT32 CompSize;
UINT32 TotalSize;
EFI_COMPRESSION_SECTION CompressionSet;
UINT8 CompressionType;
COMPRESS_FUNCTION CompressFunction;
Status = EFI_SUCCESS;
CompData = NULL;
CompSize = 0;
TotalSize = 0;
CompressFunction = NULL;
//
// Get the compress type
//
if (_strcmpi (Type, "Dummy") == 0) {
//
// Added "Dummy" to keep backward compatibility.
//
CompressionType = EFI_STANDARD_COMPRESSION;
CompressFunction = (COMPRESS_FUNCTION) TianoCompress;
} else if (_strcmpi (Type, "LZH") == 0) {
//
// EFI stardard compression (LZH)
//
CompressionType = EFI_STANDARD_COMPRESSION;
CompressFunction = (COMPRESS_FUNCTION) TianoCompress;
} else {
//
// Customized compression
//
Status = SetCustomizedCompressionType (Type);
if (EFI_ERROR (Status)) {
return Status;
}
CompressionType = EFI_CUSTOMIZED_COMPRESSION;
CompressFunction = (COMPRESS_FUNCTION) CustomizedCompress;
}
//
// Compress the raw data
//
Status = CompressFunction (FileBuffer, DataSize, CompData, &CompSize);
if (Status == EFI_BUFFER_TOO_SMALL) {
CompData = malloc (CompSize);
if (!CompData) {
return EFI_OUT_OF_RESOURCES;
}
Status = CompressFunction (FileBuffer, DataSize, CompData, &CompSize);
}
if (EFI_ERROR (Status)) {
if (CompData != NULL) {
free (CompData);
}
return Status;
}
TotalSize = CompSize + sizeof (EFI_COMPRESSION_SECTION);
//
// Buffer too small?
//
if (TotalSize > *BufferSize) {
*BufferSize = TotalSize;
if (CompData != NULL) {
free (CompData);
}
return EFI_BUFFER_TOO_SMALL;
}
//
// Add the section header for the compressed data
//
CompressionSet.CommonHeader.Type = EFI_SECTION_COMPRESSION;
CompressionSet.CommonHeader.Size[0] = (UINT8) (TotalSize & 0xff);
CompressionSet.CommonHeader.Size[1] = (UINT8) ((TotalSize & 0xff00) >> 8);
CompressionSet.CommonHeader.Size[2] = (UINT8) ((TotalSize & 0xff0000) >> 16);
CompressionSet.CompressionType = CompressionType;
CompressionSet.UncompressedLength = DataSize;
//
// Copy header and data to the buffer
//
memcpy (FileBuffer, &CompressionSet, sizeof (EFI_COMPRESSION_SECTION));
memcpy (FileBuffer + sizeof (CompressionSet), CompData, CompSize);
//
// Make sure section ends on a DWORD boundary
//
while ((TotalSize & 0x03) != 0) {
FileBuffer[TotalSize] = 0;
TotalSize++;
}
*BufferSize = TotalSize;
if (CompData != NULL) {
free (CompData);
}
return EFI_SUCCESS;
}
static
void
StripParens (
IN OUT CHAR8 *String
)
/*++
Routine Description:
Removes Parenthesis from around a string
Arguments:
String - String to remove parens from
Returns:
None
--*/
{
INT32 Index;
if (String[0] != '(') {
return ;
}
for (Index = 1; String[Index] != ')'; Index++) {
String[Index - 1] = String[Index];
if (String[Index] == 0) {
return ;
}
}
String[Index - 1] = 0;
return ;
}
static
void
StripEqualMark (
IN OUT CHAR8 *String
)
/*++
Routine Description:
Removes Equal Mark from around a string
Arguments:
String - String to remove equal mark from
Returns:
None
--*/
{
INT32 Index;
if (String[0] != '=' && String[strlen (String) - 1] != '=') {
return ;
}
if (String[0] == '=') {
for (Index = 1; String[Index] != 0; Index++) {
String[Index - 1] = String[Index];
}
String[Index - 1] = 0;
}
if (String[strlen (String) - 1] == '=') {
String[strlen (String) - 1] = 0;
}
return ;
}
static
INT32
ProcessEnvironmentVariable (
IN CHAR8 *Buffer,
OUT CHAR8 *NewBuffer
)
/*++
Routine Description:
Converts environment variables to values
Arguments:
Buffer - Buffer containing Environment Variable String
NewBuffer - Buffer containing value of environment variable
Returns:
Number of characters from Buffer used
--*/
{
INT32 Index;
INT32 Index2;
CHAR8 VariableBuffer[_MAX_PATH];
Index = 2;
Index2 = 0;
while (Buffer[Index] != ')') {
VariableBuffer[Index - 2] = Buffer[Index++];
}
VariableBuffer[Index - 2] = 0;
Index++;
if (getenv (VariableBuffer) != NULL) {
strcpy (NewBuffer, getenv (VariableBuffer));
} else {
printf ("Environment variable %s not found!\n", VariableBuffer);
}
return Index;
}
static
void
SplitAttributesField (
IN CHAR8 *Buffer,
IN CHAR8 *AttributesArray[],
IN OUT UINT32 *NumberOfAttributes
)
/*
NumberOfAttributes: on input, it specifies the current number of attributes
stored in AttributeArray.
on output, it is updated to the latest number of attributes
stored in AttributesArray.
*/
{
UINT32 Index;
UINT32 Index2;
UINT32 z;
CHAR8 *CharBuffer;
CharBuffer = NULL;
CharBuffer = (CHAR8 *) malloc (_MAX_PATH);
ZeroMem (CharBuffer, _MAX_PATH);
for (Index = 0, z = 0, Index2 = 0; Index < strlen (Buffer); Index++) {
if (Buffer[Index] != '|') {
CharBuffer[z] = Buffer[Index];
z++;
} else {
CharBuffer[z] = 0;
AttributesArray[*NumberOfAttributes + Index2] = CharBuffer;
Index2++;
//
// allocate new char buffer for the next attributes string
//
CharBuffer = (CHAR8 *) malloc (_MAX_PATH);
ZeroMem (CharBuffer, _MAX_PATH);
z = 0;
}
}
CharBuffer[z] = 0;
//
// record the last attributes string in the Buffer
//
AttributesArray[*NumberOfAttributes + Index2] = CharBuffer;
Index2++;
*NumberOfAttributes += Index2;
return ;
}
static
INT32
GetToolArguments (
CHAR8 *ToolArgumentsArray[],
FILE *Package,
CHAR8 **PtrInputFileName,
CHAR8 **PtrOutputFileName,
EFI_GUID *Guid,
UINT16 *GuidedSectionAttributes
)
{
CHAR8 Buffer[_MAX_PATH];
BOOLEAN ArgumentsFlag;
BOOLEAN InputFlag;
BOOLEAN OutputFlag;
BOOLEAN GuidFlag;
BOOLEAN AttributesFlag;
UINT32 argc;
UINT32 Index2;
UINT32 z;
CHAR8 *CharBuffer;
INT32 Index;
INT32 ReturnValue;
EFI_STATUS Status;
CHAR8 *AttributesArray[MAX_ARRAY_SIZE];
UINT32 NumberOfAttributes;
CHAR8 *InputFileName;
CHAR8 *OutputFileName;
UINT32 LineNumber;
Buffer[_MAX_PATH];
ArgumentsFlag = FALSE;
InputFlag = FALSE;
OutputFlag = FALSE;
GuidFlag = FALSE;
AttributesFlag = FALSE;
//
// Start at 1, since ToolArgumentsArray[0]
// is the program name.
//
argc = 1;
Index2 = 0;
z = 0;
ReturnValue = 0;
NumberOfAttributes = 0;
InputFileName = NULL;
OutputFileName = NULL;
ZeroMem (Buffer, _MAX_PATH);
ZeroMem (AttributesArray, sizeof (CHAR8 *) * MAX_ARRAY_SIZE);
LineNumber = 0;
while (Buffer[0] != ')') {
if (GetNextLine (Buffer, Package, &LineNumber) != -1) {
CheckSlash (Buffer, Package, &LineNumber);
StripEqualMark (Buffer);
} else {
Error (NULL, 0, 0, "failed to get next line from package file", NULL);
return -1;
}
if (Buffer[0] == ')') {
break;
} else if (_strcmpi (Buffer, "ARGS") == 0) {
ArgumentsFlag = TRUE;
AttributesFlag = FALSE;
continue;
} else if (_strcmpi (Buffer, "INPUT") == 0) {
InputFlag = TRUE;
ArgumentsFlag = FALSE;
AttributesFlag = FALSE;
continue;
} else if (_strcmpi (Buffer, "OUTPUT") == 0) {
OutputFlag = TRUE;
ArgumentsFlag = FALSE;
AttributesFlag = FALSE;
continue;
} else if (_strcmpi (Buffer, "GUID") == 0) {
GuidFlag = TRUE;
ArgumentsFlag = FALSE;
AttributesFlag = FALSE;
//
// fetch the GUID for the section
//
continue;
} else if (_strcmpi (Buffer, "ATTRIBUTES") == 0) {
AttributesFlag = TRUE;
ArgumentsFlag = FALSE;
//
// fetch the GUIDed Section's Attributes
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?