-/*++\r
+/**@file\r
\r
Copyright (c) 2006 - 2007, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
\r
Revision History\r
\r
---*/\r
+**/\r
\r
#include <PiPei.h>\r
#include <IndustryStandard/PeImage.h>\r
&gNtPeiLoadFilePpiGuid,\r
0,\r
&PpiDescriptor,\r
- &PeiNtService\r
+ (VOID**)&PeiNtService\r
);\r
ASSERT_EFI_ERROR (Status);\r
\r
// generate PE32+ image with PE32 Magic.\r
//\r
switch (Hdr.Pe32->FileHeader.Machine) {\r
- case EFI_IMAGE_MACHINE_IA32:\r
+ case IMAGE_FILE_MACHINE_I386:\r
//\r
// Assume PE32 image with IA32 Machine field.\r
//\r
Magic = EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC;\r
break;\r
- case EFI_IMAGE_MACHINE_X64:\r
- case EFI_IMAGE_MACHINE_IPF:\r
+ case IMAGE_FILE_MACHINE_X64:\r
+ case IMAGE_FILE_MACHINE_IA64:\r
//\r
- // Assume PE32+ image with X64 or IPF Machine field\r
+ // Assume PE32+ image with X64 or IA64 Machine field\r
//\r
Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
break;\r
return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY));\r
case CODEVIEW_SIGNATURE_RSDS:\r
return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY));\r
+ case CODEVIEW_SIGNATURE_MTOC: \r
+ return (VOID *) ((CHAR8 *)CodeViewEntryPointer + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY));\r
+ break;\r
default:\r
break;\r
}\r
\r
return NULL;\r
}\r
+\r
+/**\r
+ Returns the size of the PE/COFF headers\r
+\r
+ Returns the size of the PE/COFF header specified by Pe32Data.\r
+ If Pe32Data is NULL, then ASSERT().\r
+\r
+ @param Pe32Data Pointer to the PE/COFF image that is loaded in system\r
+ memory.\r
+\r
+ @return Size of PE/COFF header in bytes or zero if not a valid iamge.\r
+\r
+**/\r
+UINT32
+EFIAPI
+PeCoffGetSizeOfHeaders (
+ IN VOID *Pe32Data
+ )
+{
+ EFI_IMAGE_DOS_HEADER *DosHdr;
+ EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr;
+ UINTN SizeOfHeaders;
+
+ ASSERT (Pe32Data != NULL);\r
+
+ DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;
+ if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {
+ //
+ // DOS image header is present, so read the PE header after the DOS image header.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));
+ } else {
+ //
+ // DOS image header is not present, so PE header is at the image base.
+ //
+ Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;
+ }
+
+ if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
+ SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;
+ } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
+ SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;
+ }
+
+ return SizeOfHeaders;
+}\r
+\r