mirror of
https://github.com/acidanthera/audk.git
synced 2025-08-17 07:38:10 +02:00
300 lines
6.5 KiB
C
300 lines
6.5 KiB
C
/** @file
|
|
UEFI Image Loader library implementation for PE/COFF Images.
|
|
|
|
Copyright (c) 2021, Marvin Häuser. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-3-Clause
|
|
**/
|
|
|
|
#define UEFI_IMAGE_LOADER_IMAGE_CONTEXT PE_COFF_LOADER_IMAGE_CONTEXT
|
|
#define UEFI_IMAGE_LOADER_RUNTIME_CONTEXT PE_COFF_LOADER_RUNTIME_CONTEXT
|
|
|
|
#include <Base.h>
|
|
#include <Uefi/UefiBaseType.h>
|
|
#include <Uefi/UefiSpec.h>
|
|
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/BaseOverflowLib.h>
|
|
#include <Library/CacheMaintenanceLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/PcdLib.h>
|
|
#include <Library/PeCoffLib2.h>
|
|
#include <Library/UefiImageLib.h>
|
|
#include <Library/UefiImageExtraActionLib.h>
|
|
|
|
#include "PeCoffSupport.h"
|
|
|
|
RETURN_STATUS
|
|
UefiImageInitializeContextPreHash (
|
|
OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
IN CONST VOID *FileBuffer,
|
|
IN UINT32 FileSize
|
|
)
|
|
{
|
|
return PeCoffInitializeContext (Context, FileBuffer, FileSize);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageInitializeContextPostHash (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
ASSERT (Context != NULL);
|
|
|
|
return RETURN_SUCCESS;
|
|
}
|
|
|
|
UINT8
|
|
UefiImageGetFormat (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return UefiImageFormatPe;
|
|
}
|
|
|
|
BOOLEAN
|
|
UefiImageHashImageDefault (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
IN OUT VOID *HashContext,
|
|
IN UEFI_IMAGE_LOADER_HASH_UPDATE HashUpdate
|
|
)
|
|
{
|
|
return PeCoffHashImageAuthenticode (Context, HashContext, HashUpdate);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageLoadImage (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
OUT VOID *Destination,
|
|
IN UINT32 DestinationSize
|
|
)
|
|
{
|
|
return PeCoffLoadImage (Context, Destination, DestinationSize);
|
|
}
|
|
|
|
BOOLEAN
|
|
UefiImageImageIsInplace (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffImageIsInplace (Context);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageLoadImageInplace (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffLoadImageInplace (Context);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageRelocateImageInplace (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffRelocateImageInplace (Context);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageLoaderGetRuntimeContextSize (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
OUT UINT32 *Size
|
|
)
|
|
{
|
|
return PeCoffLoaderGetRuntimeContextSize (Context, Size);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageRelocateImage (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
IN UINT64 BaseAddress,
|
|
OUT UEFI_IMAGE_LOADER_RUNTIME_CONTEXT *RuntimeContext OPTIONAL,
|
|
IN UINT32 RuntimeContextSize
|
|
)
|
|
{
|
|
RETURN_STATUS Status;
|
|
|
|
Status = PeCoffRelocateImage (
|
|
Context,
|
|
BaseAddress,
|
|
RuntimeContext,
|
|
RuntimeContextSize
|
|
);
|
|
if (!RETURN_ERROR (Status)) {
|
|
UefiImageLoaderRelocateImageExtraAction (Context);
|
|
}
|
|
|
|
return Status;
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageRuntimeRelocateImage (
|
|
IN OUT VOID *Image,
|
|
IN UINT32 ImageSize,
|
|
IN UINT64 BaseAddress,
|
|
IN CONST UEFI_IMAGE_LOADER_RUNTIME_CONTEXT *RuntimeContext
|
|
)
|
|
{
|
|
return PeCoffRuntimeRelocateImage (
|
|
Image,
|
|
ImageSize,
|
|
BaseAddress,
|
|
RuntimeContext
|
|
);
|
|
}
|
|
|
|
VOID
|
|
UefiImageDiscardSegments (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
PeCoffDiscardSections (Context);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageGetSymbolsPath (
|
|
IN CONST UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
OUT CONST CHAR8 **SymbolsPath,
|
|
OUT UINT32 *SymbolsPathSize
|
|
)
|
|
{
|
|
return PeCoffGetPdbPath (Context, SymbolsPath, SymbolsPathSize);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageGetFirstCertificate (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
OUT CONST WIN_CERTIFICATE **Certificate
|
|
)
|
|
{
|
|
return PeCoffGetFirstCertificate (Context, Certificate);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageGetNextCertificate (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
IN OUT CONST WIN_CERTIFICATE **Certificate
|
|
)
|
|
{
|
|
return PeCoffGetNextCertificate (Context, Certificate);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageGetHiiDataRva (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
OUT UINT32 *HiiRva,
|
|
OUT UINT32 *HiiSize
|
|
)
|
|
{
|
|
return PeCoffGetHiiDataRva (Context, HiiRva, HiiSize);
|
|
}
|
|
|
|
UINT32
|
|
UefiImageGetEntryPointAddress (
|
|
IN CONST UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetAddressOfEntryPoint (Context);
|
|
}
|
|
|
|
UINT16
|
|
UefiImageGetMachine (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetMachine (Context);
|
|
}
|
|
|
|
UINT16
|
|
UefiImageGetSubsystem (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetSubsystem (Context);
|
|
}
|
|
|
|
UINT32
|
|
UefiImageGetSegmentAlignment (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetSectionAlignment (Context);
|
|
}
|
|
|
|
UINT32
|
|
UefiImageGetImageSize (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetSizeOfImage (Context);
|
|
}
|
|
|
|
UINT32
|
|
UefiImageGetImageSizeInplace (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetSizeOfImageInplace (Context);
|
|
}
|
|
|
|
UINT64
|
|
UefiImageGetPreferredAddress (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetImageBase (Context);
|
|
}
|
|
|
|
BOOLEAN
|
|
UefiImageGetRelocsStripped (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffGetRelocsStripped (Context);
|
|
}
|
|
|
|
UINTN
|
|
UefiImageLoaderGetImageAddress (
|
|
IN CONST UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return PeCoffLoaderGetImageAddress (Context);
|
|
}
|
|
|
|
UEFI_IMAGE_RECORD *
|
|
UefiImageLoaderGetImageRecord (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
return UefiImageLoaderGetImageRecordPeCoff (Context);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageDebugLocateImage (
|
|
OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
IN UINTN Address
|
|
)
|
|
{
|
|
return UefiImageDebugLocateImagePeCoff (Context, Address);
|
|
}
|
|
|
|
RETURN_STATUS
|
|
UefiImageGetFixedAddress (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context,
|
|
OUT UINT64 *Address
|
|
)
|
|
{
|
|
return UefiImageGetFixedAddressPeCoff (Context, Address);
|
|
}
|
|
|
|
VOID
|
|
UefiImageDebugPrintSegments (
|
|
IN OUT UEFI_IMAGE_LOADER_IMAGE_CONTEXT *Context
|
|
)
|
|
{
|
|
UefiImageDebugPrintSegmentsPeCoff (Context);
|
|
}
|