mirror of https://github.com/acidanthera/audk.git
137 lines
4.6 KiB
C
137 lines
4.6 KiB
C
/** @file
|
|
*
|
|
* Copyright (c) 2011, ARM Limited. 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,
|
|
* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
*
|
|
**/
|
|
|
|
#include "BdsInternal.h"
|
|
|
|
EFI_STATUS BdsLoadFileFromFirmwareVolume(
|
|
IN EFI_HANDLE FvHandle,
|
|
IN CHAR16 *FilePath,
|
|
IN EFI_FV_FILETYPE FileTypeFilter,
|
|
OUT BDS_FILE *File
|
|
) {
|
|
EFI_FIRMWARE_VOLUME2_PROTOCOL *FvProtocol;
|
|
VOID *Key;
|
|
EFI_STATUS Status, FileStatus;
|
|
EFI_GUID NameGuid;
|
|
EFI_FV_FILETYPE FileType;
|
|
EFI_FV_FILE_ATTRIBUTES Attributes;
|
|
UINTN Size;
|
|
UINTN UiStringLen;
|
|
CHAR16 *UiSection;
|
|
UINT32 Authentication;
|
|
|
|
if (File == NULL) {
|
|
return EFI_INVALID_PARAMETER;
|
|
}
|
|
|
|
Status = gBS->HandleProtocol(FvHandle,&gEfiFirmwareVolume2ProtocolGuid, (VOID **)&FvProtocol);
|
|
if (EFI_ERROR(Status)) {
|
|
return Status;
|
|
}
|
|
|
|
// Length of FilePath
|
|
UiStringLen = StrLen (FilePath);
|
|
|
|
// Allocate Key
|
|
Key = AllocatePool (FvProtocol->KeySize);
|
|
ASSERT (Key != NULL);
|
|
ZeroMem (Key, FvProtocol->KeySize);
|
|
|
|
do {
|
|
// Search in all files
|
|
FileType = FileTypeFilter;
|
|
|
|
Status = FvProtocol->GetNextFile (FvProtocol, Key, &FileType, &NameGuid, &Attributes, &Size);
|
|
if (!EFI_ERROR (Status)) {
|
|
UiSection = NULL;
|
|
FileStatus = FvProtocol->ReadSection (
|
|
FvProtocol,
|
|
&NameGuid,
|
|
EFI_SECTION_USER_INTERFACE,
|
|
0,
|
|
(VOID **)&UiSection,
|
|
&Size,
|
|
&Authentication
|
|
);
|
|
if (!EFI_ERROR (FileStatus)) {
|
|
if (StrnCmp (FilePath, UiSection, UiStringLen) == 0) {
|
|
|
|
//
|
|
// We found a UiString match.
|
|
//
|
|
//*FileGuid = NameGuid;
|
|
File->Type = BDS_FILETYPE_FV;
|
|
File->FilePath = FilePath;
|
|
CopyGuid (&(File->File.Fv.Guid),&NameGuid);
|
|
File->File.Fv.FvProtocol = FvProtocol;
|
|
File->File.Fv.FileType = FileType;
|
|
|
|
Status = gBS->HandleProtocol(FvHandle,&gEfiDevicePathProtocolGuid, (VOID **)&(File->DevicePath));
|
|
|
|
FreePool (Key);
|
|
FreePool (UiSection);
|
|
return FileStatus;
|
|
}
|
|
FreePool (UiSection);
|
|
}
|
|
}
|
|
} while (!EFI_ERROR (Status));
|
|
|
|
FreePool(Key);
|
|
return Status;
|
|
}
|
|
|
|
EFI_STATUS BdsCopyRawFileToRuntimeMemoryFV(
|
|
IN BDS_FV_FILE *FvFile,
|
|
OUT VOID **FileImage,
|
|
OUT UINTN *FileSize
|
|
) {
|
|
EFI_STATUS Status = EFI_INVALID_PARAMETER;
|
|
EFI_FIRMWARE_VOLUME2_PROTOCOL *FvProtocol;
|
|
EFI_FV_FILETYPE FileType;
|
|
EFI_GUID* NameGuid;
|
|
EFI_FV_FILE_ATTRIBUTES Attributes;
|
|
UINT32 Authentication;
|
|
|
|
FvProtocol = FvFile->FvProtocol;
|
|
FileType = FvFile->FileType;
|
|
NameGuid = &(FvFile->Guid);
|
|
|
|
if (FileType == EFI_FV_FILETYPE_RAW) {
|
|
*FileImage = NULL;
|
|
*FileSize = 0;
|
|
Status = FvProtocol->ReadFile(
|
|
FvProtocol,NameGuid, // IN
|
|
FileImage,FileSize, // IN OUT
|
|
&FileType,&Attributes,&Authentication // OUT
|
|
);
|
|
ASSERT_EFI_ERROR(Status);
|
|
|
|
// This raw file also contains a header
|
|
*FileSize = *FileSize - 4;
|
|
*FileImage = (UINT8*)FileImage + 4;
|
|
} else if (FileType == EFI_FV_FILETYPE_FREEFORM) {
|
|
Status = FvProtocol->ReadSection (
|
|
FvProtocol,NameGuid,EFI_SECTION_RAW,0, // IN
|
|
FileImage,FileSize, // IN OUT
|
|
&Authentication // OUT
|
|
);
|
|
ASSERT_EFI_ERROR(Status);
|
|
} else {
|
|
ASSERT(0); //Maybe support application as well ???
|
|
}
|
|
|
|
return Status;
|
|
}
|