/** @file UEFI Image Loader library implementation for PE/COFF Images. Copyright (c) 2021, Marvin Häuser. All rights reserved.
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 #include #include #include #include #include #include #include #include #include #include #include #include #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); }