Further PE/COFF module improvements
All checks were successful
ci/woodpecker/push/build Pipeline was successful
All checks were successful
ci/woodpecker/push/build Pipeline was successful
This commit is contained in:
parent
60c56c4462
commit
b03c9c2a25
@ -12,6 +12,7 @@
|
|||||||
#include "xtdefs.h"
|
#include "xtdefs.h"
|
||||||
#include "xtstruct.h"
|
#include "xtstruct.h"
|
||||||
#include "xttypes.h"
|
#include "xttypes.h"
|
||||||
|
#include "xtfw.h"
|
||||||
|
|
||||||
|
|
||||||
/* PE/COFF file image signatures */
|
/* PE/COFF file image signatures */
|
||||||
@ -190,10 +191,13 @@
|
|||||||
/* PE/COFF image representation structure */
|
/* PE/COFF image representation structure */
|
||||||
typedef struct _PECOFF_IMAGE_CONTEXT
|
typedef struct _PECOFF_IMAGE_CONTEXT
|
||||||
{
|
{
|
||||||
|
PPECOFF_IMAGE_DOS_HEADER DosHeader;
|
||||||
|
PPECOFF_IMAGE_PE_HEADER PeHeader;
|
||||||
PVOID Data;
|
PVOID Data;
|
||||||
UINT64 FileSize;
|
UINT64 FileSize;
|
||||||
UINT ImagePages;
|
UINT ImagePages;
|
||||||
UINT ImageSize;
|
UINT ImageSize;
|
||||||
|
LOADER_MEMORY_TYPE MemoryType;
|
||||||
PVOID VirtualAddress;
|
PVOID VirtualAddress;
|
||||||
} PECOFF_IMAGE_CONTEXT, *PPECOFF_IMAGE_CONTEXT;
|
} PECOFF_IMAGE_CONTEXT, *PPECOFF_IMAGE_CONTEXT;
|
||||||
|
|
||||||
|
@ -21,7 +21,9 @@ typedef struct _XT_PECOFFF_IMAGE_PROTOCOL XT_PECOFF_IMAGE_PROTOCOL, *PXT_PECOFF_
|
|||||||
|
|
||||||
/* Pointers to the routines provided by the modules */
|
/* Pointers to the routines provided by the modules */
|
||||||
typedef EFI_STATUS (*PXT_BOOTPROTO_BOOT_SYSTEM)(IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters);
|
typedef EFI_STATUS (*PXT_BOOTPROTO_BOOT_SYSTEM)(IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters);
|
||||||
typedef EFI_STATUS (*PXT_PECOFF_PROTOCOL_LOAD)(IN PEFI_FILE_HANDLE FileHandle, IN PVOID VirtualAddress, OUT PPECOFF_IMAGE_CONTEXT *Image);
|
typedef EFI_STATUS (*PXT_PECOFF_GET_ENTRY_POINT)(IN PPECOFF_IMAGE_CONTEXT Image, OUT PVOID *EntryPoint);
|
||||||
|
typedef EFI_STATUS (*PXT_PECOFF_PROTOCOL_LOAD)(IN PEFI_FILE_HANDLE FileHandle, IN LOADER_MEMORY_TYPE MemoryType,
|
||||||
|
IN PVOID VirtualAddress, OUT PPECOFF_IMAGE_CONTEXT *Image);
|
||||||
|
|
||||||
/* XT common boot protocols */
|
/* XT common boot protocols */
|
||||||
typedef struct _XT_BOOT_PROTOCOL
|
typedef struct _XT_BOOT_PROTOCOL
|
||||||
@ -44,6 +46,7 @@ typedef struct _XT_BOOT_PROTOCOL_PARAMETERS
|
|||||||
/* EFI XT PE/COFF Image Protocol */
|
/* EFI XT PE/COFF Image Protocol */
|
||||||
typedef struct _XT_PECOFFF_IMAGE_PROTOCOL
|
typedef struct _XT_PECOFFF_IMAGE_PROTOCOL
|
||||||
{
|
{
|
||||||
|
PXT_PECOFF_GET_ENTRY_POINT GetEntryPoint;
|
||||||
PXT_PECOFF_PROTOCOL_LOAD Load;
|
PXT_PECOFF_PROTOCOL_LOAD Load;
|
||||||
} XT_PECOFF_IMAGE_PROTOCOL, *PXT_PECOFF_IMAGE_PROTOCOL;
|
} XT_PECOFF_IMAGE_PROTOCOL, *PXT_PECOFF_IMAGE_PROTOCOL;
|
||||||
|
|
||||||
|
@ -12,17 +12,24 @@
|
|||||||
#include <blmod.h>
|
#include <blmod.h>
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
/* PE/COFF image protocol related routines forward references */
|
||||||
IN PVOID VirtualAddress,
|
EFI_STATUS
|
||||||
OUT PPECOFF_IMAGE_CONTEXT *Image);
|
PeGetEntryPoint(IN PPECOFF_IMAGE_CONTEXT Image,
|
||||||
|
OUT PVOID *EntryPoint);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PepReadImageHeader(IN PUCHAR ImageData,
|
PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
||||||
IN SIZE_T FileSize,
|
IN LOADER_MEMORY_TYPE MemoryType,
|
||||||
OUT PPECOFF_IMAGE_PE_HEADER *PeHeader);
|
IN PVOID VirtualAddress,
|
||||||
|
OUT PPECOFF_IMAGE_CONTEXT *Image);
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlXtLdrModuleMain(EFI_HANDLE ImageHandle,
|
PepValidateImageHeaders(IN PPECOFF_IMAGE_DOS_HEADER DosHeader,
|
||||||
PEFI_SYSTEM_TABLE SystemTable);
|
IN PPECOFF_IMAGE_PE_HEADER PeHeader,
|
||||||
|
IN SIZE_T FileSize);
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
BlXtLdrModuleMain(IN EFI_HANDLE ImageHandle,
|
||||||
|
IN PEFI_SYSTEM_TABLE SystemTable);
|
||||||
|
|
||||||
#endif /* __XTLDR_MODULES_PECOFF_H */
|
#endif /* __XTLDR_MODULES_PECOFF_H */
|
||||||
|
@ -21,41 +21,76 @@ PXT_BOOT_LOADER_PROTOCOL XtLdrProtocol;
|
|||||||
/* XTOS PE/COFF Image Protocol */
|
/* XTOS PE/COFF Image Protocol */
|
||||||
XT_PECOFF_IMAGE_PROTOCOL XtPeCoffProtocol;
|
XT_PECOFF_IMAGE_PROTOCOL XtPeCoffProtocol;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the address of the entry point.
|
||||||
|
*
|
||||||
|
* @param Image
|
||||||
|
* A pointer to the PE/COFF context structure representing the loaded image.
|
||||||
|
*
|
||||||
|
* @param EntryPoint
|
||||||
|
* A pointer to the memory area where address of the image entry point will be stored.
|
||||||
|
*
|
||||||
|
* @return This routine returns a status code.
|
||||||
|
*
|
||||||
|
* @since XT 1.0
|
||||||
|
*/
|
||||||
|
EFI_STATUS
|
||||||
|
PeGetEntryPoint(IN PPECOFF_IMAGE_CONTEXT Image,
|
||||||
|
OUT PVOID *EntryPoint)
|
||||||
|
{
|
||||||
|
/* Validate input date */
|
||||||
|
if(!Image || !Image->PeHeader)
|
||||||
|
{
|
||||||
|
/* Invalid parameter passed */
|
||||||
|
return STATUS_EFI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set entry point and return success */
|
||||||
|
*EntryPoint = (UINT8*)Image->VirtualAddress + Image->PeHeader->OptionalHeader.AddressOfEntryPoint;
|
||||||
|
return STATUS_EFI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads a PE/COFF image file.
|
* Loads a PE/COFF image file.
|
||||||
*
|
*
|
||||||
* @param FileHandle
|
* @param FileHandle
|
||||||
* The handle of the opened portable executable (PE) file.
|
* The handle of the opened portable executable (PE) file.
|
||||||
*
|
*
|
||||||
|
* @param MemoryType
|
||||||
|
* Supplies the type of memory to be assigned to the memory descriptor.
|
||||||
|
*
|
||||||
* @param VirtualAddress
|
* @param VirtualAddress
|
||||||
* Optional virtual address pointing to the memory area where PE/COFF file will be loaded.
|
* Optional virtual address pointing to the memory area where PE/COFF file will be loaded.
|
||||||
*
|
*
|
||||||
|
* @param Image
|
||||||
|
* Supplies pointer to the memory area where loaded PE/COFF image context will be stored.
|
||||||
|
*
|
||||||
* @return This routine returns status code.
|
* @return This routine returns status code.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
EFI_STATUS
|
||||||
IN PVOID VirtualAddress,
|
PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
||||||
OUT PPECOFF_IMAGE_CONTEXT *Image)
|
IN LOADER_MEMORY_TYPE MemoryType,
|
||||||
|
IN PVOID VirtualAddress,
|
||||||
|
OUT PPECOFF_IMAGE_CONTEXT *Image)
|
||||||
{
|
{
|
||||||
EFI_GUID FileInfoGuid = EFI_FILE_INFO_PROTOCOL_GUID;
|
EFI_GUID FileInfoGuid = EFI_FILE_INFO_PROTOCOL_GUID;
|
||||||
PPECOFF_IMAGE_SECTION_HEADER SectionHeader;
|
PPECOFF_IMAGE_SECTION_HEADER SectionHeader;
|
||||||
PPECOFF_IMAGE_PE_HEADER PeHeader;
|
|
||||||
PPECOFF_IMAGE_CONTEXT ImageData;
|
PPECOFF_IMAGE_CONTEXT ImageData;
|
||||||
EFI_PHYSICAL_ADDRESS Address;
|
EFI_PHYSICAL_ADDRESS Address;
|
||||||
PEFI_FILE_INFO FileInfo;
|
PEFI_FILE_INFO FileInfo;
|
||||||
SIZE_T Size, Pages;
|
SIZE_T Pages, ReadSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT_PTR ReadSize;
|
|
||||||
UINT SectionSize;
|
UINT SectionSize;
|
||||||
PUCHAR Data;
|
PUCHAR Data;
|
||||||
UINT Index;
|
UINT Index;
|
||||||
|
|
||||||
/* Set required size for getting file information */
|
/* Set required size for getting file information */
|
||||||
Size = sizeof(EFI_FILE_INFO) + 32;
|
ReadSize = sizeof(EFI_FILE_INFO) + 32;
|
||||||
|
|
||||||
/* Allocate necessary amount of memory */
|
/* Allocate necessary amount of memory */
|
||||||
Status = XtLdrProtocol->AllocatePool(Size, (PVOID *)&FileInfo);
|
Status = XtLdrProtocol->AllocatePool(ReadSize, (PVOID *)&FileInfo);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure */
|
/* Memory allocation failure */
|
||||||
@ -64,20 +99,21 @@ EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* First attempt to get file information */
|
/* First attempt to get file information */
|
||||||
Status = FileHandle->GetInfo(FileHandle, &FileInfoGuid, &Size, FileInfo);
|
Status = FileHandle->GetInfo(FileHandle, &FileInfoGuid, &ReadSize, FileInfo);
|
||||||
if(Status == STATUS_EFI_BUFFER_TOO_SMALL)
|
if(Status == STATUS_EFI_BUFFER_TOO_SMALL)
|
||||||
{
|
{
|
||||||
/* Buffer it too small, but EFI tells the required size, let's reallocate */
|
/* Buffer it too small, but EFI tells the required size, let's reallocate */
|
||||||
XtLdrProtocol->FreePool(&FileInfo);
|
XtLdrProtocol->FreePool(&FileInfo);
|
||||||
Status = XtLdrProtocol->AllocatePool(Size, (PVOID *)&FileInfo);
|
Status = XtLdrProtocol->AllocatePool(ReadSize, (PVOID *)&FileInfo);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Memory allocation failure */
|
/* Memory allocation failure */
|
||||||
XtLdrProtocol->DbgPrint(L"ERROR: Memory pool allocation failure\n");
|
XtLdrProtocol->DbgPrint(L"ERROR: Memory pool allocation failure\n");
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Second attempt to get file information */
|
/* Second attempt to get file information */
|
||||||
Status = FileHandle->GetInfo(FileHandle, &FileInfoGuid, &Size, FileInfo);
|
Status = FileHandle->GetInfo(FileHandle, &FileInfoGuid, &ReadSize, FileInfo);
|
||||||
}
|
}
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
@ -95,8 +131,10 @@ EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store file size and free memory */
|
/* Store file size and memory type, nullify data and free up memory */
|
||||||
|
ImageData->Data = NULL;
|
||||||
ImageData->FileSize = FileInfo->FileSize;
|
ImageData->FileSize = FileInfo->FileSize;
|
||||||
|
ImageData->MemoryType = MemoryType;
|
||||||
XtLdrProtocol->FreePool(FileInfo);
|
XtLdrProtocol->FreePool(FileInfo);
|
||||||
|
|
||||||
/* Calculate number of pages */
|
/* Calculate number of pages */
|
||||||
@ -125,19 +163,23 @@ EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Read and validate headers */
|
/* Extract DOS and PE headers */
|
||||||
Status = PepReadImageHeader(Data, ImageData->FileSize, &PeHeader);
|
ImageData->DosHeader = (PPECOFF_IMAGE_DOS_HEADER)Data;
|
||||||
|
ImageData->PeHeader = (PPECOFF_IMAGE_PE_HEADER)((PUINT8)Data + ImageData->DosHeader->e_lfanew);
|
||||||
|
|
||||||
|
/* Validate headers */
|
||||||
|
Status = PepValidateImageHeaders(ImageData->DosHeader, ImageData->PeHeader, ImageData->FileSize);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Header validation failed, probably broken or invalid PE/COFF image */
|
/* Header validation failed, probably broken or invalid PE/COFF image */
|
||||||
XtLdrProtocol->DbgPrint(L"ERROR: Invalid PE/COFF image header\n");
|
XtLdrProtocol->DbgPrint(L"ERROR: Invalid PE/COFF image headers\n");
|
||||||
XtLdrProtocol->FreePages(Pages, (EFI_PHYSICAL_ADDRESS)(UINT_PTR)Data);
|
XtLdrProtocol->FreePages(Pages, (EFI_PHYSICAL_ADDRESS)(UINT_PTR)Data);
|
||||||
XtLdrProtocol->FreePool(ImageData);
|
XtLdrProtocol->FreePool(ImageData);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store image size and calculate number of image pages */
|
/* Store image size and calculate number of image pages */
|
||||||
ImageData->ImageSize = PeHeader->OptionalHeader.SizeOfImage;
|
ImageData->ImageSize = ImageData->PeHeader->OptionalHeader.SizeOfImage;
|
||||||
ImageData->ImagePages = EFI_SIZE_TO_PAGES(ImageData->ImageSize);
|
ImageData->ImagePages = EFI_SIZE_TO_PAGES(ImageData->ImageSize);
|
||||||
|
|
||||||
/* Allocate image pages */
|
/* Allocate image pages */
|
||||||
@ -150,7 +192,7 @@ EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Store image data and base address */
|
/* Store image data and virtual address */
|
||||||
ImageData->Data = (PUINT8)(UINT_PTR)Address;
|
ImageData->Data = (PUINT8)(UINT_PTR)Address;
|
||||||
if(VirtualAddress)
|
if(VirtualAddress)
|
||||||
{
|
{
|
||||||
@ -164,14 +206,14 @@ EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Copy all sections */
|
/* Copy all sections */
|
||||||
RtlCopyMemory(ImageData->Data, Data, PeHeader->OptionalHeader.SizeOfHeaders);
|
RtlCopyMemory(ImageData->Data, Data, ImageData->PeHeader->OptionalHeader.SizeOfHeaders);
|
||||||
|
|
||||||
/* Find section header */
|
/* Find section header */
|
||||||
SectionHeader = (PPECOFF_IMAGE_SECTION_HEADER)((PUCHAR)&PeHeader->OptionalHeader +
|
SectionHeader = (PPECOFF_IMAGE_SECTION_HEADER)((PUCHAR)&ImageData->PeHeader->OptionalHeader +
|
||||||
PeHeader->FileHeader.SizeOfOptionalHeader);
|
ImageData->PeHeader->FileHeader.SizeOfOptionalHeader);
|
||||||
|
|
||||||
/* Load each section into memory */
|
/* Load each section into memory */
|
||||||
for(Index = 0; Index < PeHeader->FileHeader.NumberOfSections; Index++)
|
for(Index = 0; Index < ImageData->PeHeader->FileHeader.NumberOfSections; Index++)
|
||||||
{
|
{
|
||||||
/* Check section raw data size and section virtual size */
|
/* Check section raw data size and section virtual size */
|
||||||
if(SectionHeader[Index].SizeOfRawData < SectionHeader[Index].Misc.VirtualSize)
|
if(SectionHeader[Index].SizeOfRawData < SectionHeader[Index].Misc.VirtualSize)
|
||||||
@ -213,28 +255,26 @@ EFI_STATUS PeLoadImage(IN PEFI_FILE_HANDLE FileHandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads and validate a PE/COFF image headers
|
* Validates a PE/COFF image headers.
|
||||||
*
|
*
|
||||||
* @param ImageData
|
* @param DosHeader
|
||||||
* A pointer to the buffer containing PE/COFF image contents.
|
* Pointer to the memory area with DOS header stored.
|
||||||
*
|
|
||||||
* @param FileSize
|
|
||||||
* An input PE/COFF image file size.
|
|
||||||
*
|
*
|
||||||
* @param PeHeader
|
* @param PeHeader
|
||||||
* Pointer to the memory area where PE header will be saved.
|
* Pointer to the memory area with PE header stored.
|
||||||
|
*
|
||||||
|
* @param FileSize
|
||||||
|
* A PE/COFF image file size.
|
||||||
*
|
*
|
||||||
* @return This routine returns a status code.
|
* @return This routine returns a status code.
|
||||||
*
|
*
|
||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
PepReadImageHeader(IN PUCHAR ImageData,
|
PepValidateImageHeaders(IN PPECOFF_IMAGE_DOS_HEADER DosHeader,
|
||||||
IN SIZE_T FileSize,
|
IN PPECOFF_IMAGE_PE_HEADER PeHeader,
|
||||||
OUT PPECOFF_IMAGE_PE_HEADER *PeHeader)
|
IN SIZE_T FileSize)
|
||||||
{
|
{
|
||||||
PPECOFF_IMAGE_DOS_HEADER DosHeader;
|
|
||||||
|
|
||||||
/* Validate file size */
|
/* Validate file size */
|
||||||
if(FileSize < sizeof(PECOFF_IMAGE_DOS_HEADER))
|
if(FileSize < sizeof(PECOFF_IMAGE_DOS_HEADER))
|
||||||
{
|
{
|
||||||
@ -243,30 +283,27 @@ PepReadImageHeader(IN PUCHAR ImageData,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Validate DOS header */
|
/* Validate DOS header */
|
||||||
DosHeader = (PPECOFF_IMAGE_DOS_HEADER)ImageData;
|
|
||||||
if(DosHeader->e_magic != PECOFF_IMAGE_DOS_SIGNATURE)
|
if(DosHeader->e_magic != PECOFF_IMAGE_DOS_SIGNATURE)
|
||||||
{
|
{
|
||||||
XtLdrProtocol->DbgPrint(L"WARNING: Invalid DOS signature found\n");
|
XtLdrProtocol->DbgPrint(L"WARNING: Invalid DOS signature found\n");
|
||||||
return STATUS_EFI_INCOMPATIBLE_VERSION;
|
return STATUS_EFI_INCOMPATIBLE_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate NT/XT header */
|
/* Validate PE header */
|
||||||
*PeHeader = (PPECOFF_IMAGE_PE_HEADER)(ImageData + DosHeader->e_lfanew);
|
if(PeHeader->Signature != PECOFF_IMAGE_NT_SIGNATURE && PeHeader->Signature != PECOFF_IMAGE_XT_SIGNATURE)
|
||||||
if((*PeHeader)->Signature != PECOFF_IMAGE_NT_SIGNATURE && (*PeHeader)->Signature != PECOFF_IMAGE_XT_SIGNATURE)
|
|
||||||
{
|
{
|
||||||
XtLdrProtocol->DbgPrint(L"WARNING: Invalid NT/XT signature found\n");
|
XtLdrProtocol->DbgPrint(L"WARNING: Invalid NT/XT signature found\n");
|
||||||
return STATUS_EFI_INCOMPATIBLE_VERSION;
|
return STATUS_EFI_INCOMPATIBLE_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Validate optional header */
|
/* Validate optional header */
|
||||||
if((*PeHeader)->OptionalHeader.Magic != PECOFF_IMAGE_PE_OPTIONAL_HDR32_MAGIC &&
|
if(PeHeader->OptionalHeader.Magic != PECOFF_IMAGE_PE_OPTIONAL_HDR32_MAGIC &&
|
||||||
(*PeHeader)->OptionalHeader.Magic != PECOFF_IMAGE_PE_OPTIONAL_HDR64_MAGIC)
|
PeHeader->OptionalHeader.Magic != PECOFF_IMAGE_PE_OPTIONAL_HDR64_MAGIC)
|
||||||
{
|
{
|
||||||
XtLdrProtocol->DbgPrint(L"WARNING: Invalid optional header signature found\n");
|
XtLdrProtocol->DbgPrint(L"WARNING: Invalid optional header signature found\n");
|
||||||
return STATUS_EFI_INCOMPATIBLE_VERSION;
|
return STATUS_EFI_INCOMPATIBLE_VERSION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return SUCCESS */
|
|
||||||
return STATUS_EFI_SUCCESS;
|
return STATUS_EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -284,8 +321,8 @@ PepReadImageHeader(IN PUCHAR ImageData,
|
|||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlXtLdrModuleMain(EFI_HANDLE ImageHandle,
|
BlXtLdrModuleMain(IN EFI_HANDLE ImageHandle,
|
||||||
PEFI_SYSTEM_TABLE SystemTable)
|
IN PEFI_SYSTEM_TABLE SystemTable)
|
||||||
{
|
{
|
||||||
EFI_GUID Guid = XT_PECOFF_IMAGE_PROTOCOL_GUID;
|
EFI_GUID Guid = XT_PECOFF_IMAGE_PROTOCOL_GUID;
|
||||||
EFI_HANDLE Handle = NULL;
|
EFI_HANDLE Handle = NULL;
|
||||||
@ -304,6 +341,7 @@ BlXtLdrModuleMain(EFI_HANDLE ImageHandle,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Set routines available via PE/COFF image protocol */
|
/* Set routines available via PE/COFF image protocol */
|
||||||
|
XtPeCoffProtocol.GetEntryPoint = PeGetEntryPoint;
|
||||||
XtPeCoffProtocol.Load = PeLoadImage;
|
XtPeCoffProtocol.Load = PeLoadImage;
|
||||||
|
|
||||||
/* Register PE/COFF protocol */
|
/* Register PE/COFF protocol */
|
||||||
|
@ -160,6 +160,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters)
|
IN PXT_BOOT_PROTOCOL_PARAMETERS Parameters)
|
||||||
{
|
{
|
||||||
PEFI_FILE_HANDLE KernelHandle;
|
PEFI_FILE_HANDLE KernelHandle;
|
||||||
|
PPECOFF_IMAGE_CONTEXT Image;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
XtLdrProtocol->DbgPrint(L"Issuing XT startup sequence\n");
|
XtLdrProtocol->DbgPrint(L"Issuing XT startup sequence\n");
|
||||||
@ -174,7 +175,7 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Load the PE/COFF kernel file */
|
/* Load the PE/COFF kernel file */
|
||||||
Status = XtPeCoffProtocol->Load(KernelHandle, (PVOID)XTOS_KERNEL_ADDRESS, NULL);
|
Status = XtPeCoffProtocol->Load(KernelHandle, LoaderSystemCode, NULL, &Image);
|
||||||
if(Status != STATUS_EFI_SUCCESS)
|
if(Status != STATUS_EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
/* Unable to load the file */
|
/* Unable to load the file */
|
||||||
@ -203,8 +204,8 @@ XtpBootSequence(IN PEFI_FILE_HANDLE BootDir,
|
|||||||
* @since XT 1.0
|
* @since XT 1.0
|
||||||
*/
|
*/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
BlXtLdrModuleMain(EFI_HANDLE ImageHandle,
|
BlXtLdrModuleMain(IN EFI_HANDLE ImageHandle,
|
||||||
PEFI_SYSTEM_TABLE SystemTable)
|
IN PEFI_SYSTEM_TABLE SystemTable)
|
||||||
{
|
{
|
||||||
EFI_GUID Guid = XT_XTOS_BOOT_PROTOCOL_GUID;
|
EFI_GUID Guid = XT_XTOS_BOOT_PROTOCOL_GUID;
|
||||||
EFI_HANDLE Handle = NULL;
|
EFI_HANDLE Handle = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user