\r
#include <PeiMain.h>\r
\r
+\r
+\r
EFI_STATUS\r
PeiLoadImage (\r
IN EFI_PEI_SERVICES **PeiServices,\r
EFI_STATUS Status;\r
VOID *Pe32Data;\r
EFI_PEI_FV_FILE_LOADER_PPI *FvLoadFilePpi;\r
-//#ifdef EFI_NT_EMULATOR\r
-// EFI_PEI_PPI_DESCRIPTOR *PpiDescriptor;\r
-// NT_PEI_LOAD_FILE_PPI *PeiNtService;\r
-//#endif\r
EFI_PHYSICAL_ADDRESS ImageAddress;\r
UINT64 ImageSize;\r
EFI_PHYSICAL_ADDRESS ImageEntryPoint;\r
//\r
// Try to find a PE32 section.\r
//\r
- Status = PeiCoreFfsFindSectionData (\r
+ Status = PeiServicesFfsFindSectionData (\r
EFI_SECTION_PE32,\r
PeimFileHeader,\r
&Pe32Data\r
// If we didn't find a PE32 section, try to find a TE section.\r
//\r
if (EFI_ERROR (Status)) {\r
- Status = PeiCoreFfsFindSectionData (\r
+ Status = PeiServicesFfsFindSectionData (\r
EFI_SECTION_TE,\r
PeimFileHeader,\r
(VOID **) &TEImageHeader\r
// There was not a PE32 or a TE section, so assume that it's a Compressed section\r
// and use the LoadFile\r
//\r
- Status = PeiCoreLocatePpi (\r
+ Status = PeiServicesLocatePpi (\r
&gEfiPeiFvFileLoaderPpiGuid,\r
0,\r
NULL,\r
}\r
\r
//\r
- // Retrieve the entry point from the PE/COFF image header\r
+ // Got the entry point from ImageEntryPoint\r
//\r
- Status = PeCoffLoaderGetEntryPoint ((VOID *)(UINTN)ImageAddress, EntryPoint);\r
- if (EFI_ERROR (Status)) {\r
- return EFI_NOT_FOUND;\r
- }\r
+ *EntryPoint = (VOID *) ((UINTN) ImageEntryPoint);\r
+ return EFI_SUCCESS;\r
} else {\r
//\r
// Retrieve the entry point from the TE image header\r
// Print debug message: Loading PEIM at 0x12345678 EntryPoint=0x12345688 Driver.efi\r
//\r
DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Loading PEIM at 0x%08x EntryPoint=0x%08x ", Pe32Data, *EntryPoint));\r
- DEBUG_CODE (\r
- EFI_IMAGE_DATA_DIRECTORY * DirectoryEntry;\r
- EFI_IMAGE_DEBUG_DIRECTORY_ENTRY * DebugEntry;\r
- UINTN DirCount;\r
- UINTN Index;\r
- UINTN Index1;\r
- BOOLEAN FileNameFound;\r
- CHAR8 *AsciiString;\r
- CHAR8 AsciiBuffer[512];\r
- VOID *CodeViewEntryPointer;\r
- INTN TEImageAdjust;\r
- EFI_IMAGE_DOS_HEADER *DosHeader;\r
- EFI_IMAGE_NT_HEADERS *PeHeader;\r
-\r
- DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
- if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
- //\r
- // DOS image header is present, so read the PE header after the DOS image header\r
- //\r
- PeHeader = (EFI_IMAGE_NT_HEADERS *) ((UINTN) Pe32Data + (UINTN) ((DosHeader->e_lfanew) & 0x0ffff));\r
- } else {\r
- //\r
- // DOS image header is not present, so PE header is at the image base\r
- //\r
- PeHeader = (EFI_IMAGE_NT_HEADERS *) Pe32Data;\r
+ DEBUG_CODE_BEGIN ();\r
+ EFI_IMAGE_DATA_DIRECTORY *DirectoryEntry;\r
+ EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
+ UINTN DirCount;\r
+ UINTN Index;\r
+ UINTN Index1;\r
+ BOOLEAN FileNameFound;\r
+ CHAR8 *AsciiString;\r
+ CHAR8 AsciiBuffer[512];\r
+ VOID *CodeViewEntryPointer;\r
+ INTN TEImageAdjust;\r
+ EFI_IMAGE_DOS_HEADER *DosHeader;\r
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;\r
+ UINT32 NumberOfRvaAndSizes;\r
+\r
+ Hdr.Pe32 = NULL;\r
+ if (TEImageHeader == NULL) {\r
+ DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
+ if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
+ //\r
+ // DOS image header is present, so read the PE header after the DOS image header\r
+ //\r
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHeader->e_lfanew) & 0x0ffff));\r
+ } else {\r
+ //\r
+ // DOS image header is not present, so PE header is at the image base\r
+ //\r
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
+ }\r
}\r
\r
//\r
DirectoryEntry = NULL;\r
TEImageAdjust = 0;\r
if (TEImageHeader == NULL) {\r
- if (PeHeader->OptionalHeader.NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
- DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *) &(PeHeader->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
- DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) ImageAddress + DirectoryEntry->VirtualAddress);\r
+ if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ // \r
+ // Use PE32 offset\r
+ //\r
+ NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
+ DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+ } else {\r
+ // \r
+ // Use PE32+ offset\r
+ //\r
+ NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
+ DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+ } \r
+\r
+ if (NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
+ DirectoryEntry = NULL;\r
+ DebugEntry = NULL;\r
}\r
} else {\r
if (TEImageHeader->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {\r
CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + (UINTN) ImageAddress + (UINTN)TEImageAdjust);\r
switch (* (UINT32 *) CodeViewEntryPointer) {\r
case CODEVIEW_SIGNATURE_NB10:\r
- AsciiString = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
+ AsciiString = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
break;\r
\r
case CODEVIEW_SIGNATURE_RSDS:\r
- AsciiString = (CHAR8 *) CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
+ AsciiString = (CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
break;\r
\r
default:\r
}\r
if (AsciiString != NULL) {\r
FileNameFound = FALSE;\r
- for (Index = 0, Index1 = 0; AsciiString[Index] != 0; Index++) {\r
+ for (Index = 0, Index1 = 0; (AsciiString[Index] != 0) && (Index < sizeof (AsciiString)); Index++) {\r
if (AsciiString[Index] == '\\') {\r
Index1 = Index;\r
FileNameFound = TRUE;\r
}\r
}\r
}\r
- );\r
+ DEBUG_CODE_END ();\r
\r
DEBUG ((EFI_D_INFO | EFI_D_LOAD, "\n"));\r
\r