THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
- Module Name: PeCoffGetEntryPoint.c\r
-\r
**/\r
\r
\r
+#include <Base.h>\r
+\r
+\r
+#include <Library/PeCoffGetEntryPointLib.h>\r
+#include <Library/DebugLib.h>\r
+\r
+#include <IndustryStandard/PeImage.h>\r
\r
/**\r
Retrieves and returns a pointer to the entry point to a PE/COFF image that has been loaded\r
}\r
\r
//\r
- // Calculate the entry point relative to the start of the image. \r
+ // Calculate the entry point relative to the start of the image.\r
// AddressOfEntryPoint is common for PE32 & PE32+\r
//\r
*EntryPoint = (VOID *)((UINTN)Pe32Data + (UINTN)(Header.Pe32->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));\r
\r
/**\r
Returns a pointer to the PDB file name for a PE/COFF image that has been\r
- loaded into system memory with the PE/COFF Loader Library functions. \r
+ loaded into system memory with the PE/COFF Loader Library functions.\r
\r
Returns the PDB file name for the PE/COFF image specified by Pe32Data. If\r
the PE/COFF image specified by Pe32Data is not a valid, then NULL is\r
VOID *CodeViewEntryPointer;\r
INTN TEImageAdjust;\r
UINT32 NumberOfRvaAndSizes;\r
- \r
+ UINT16 Magic;\r
+\r
ASSERT (Pe32Data != NULL);\r
\r
TEImageAdjust = 0;\r
TEImageAdjust);\r
}\r
} else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
- if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
- // \r
+ //\r
+ // NOTE: We use Machine field to identify PE32/PE32+, instead of Magic.\r
+ // It is due to backward-compatibility, for some system might\r
+ // generate PE32+ image with PE32 Magic.\r
+ //\r
+ switch (Hdr.Pe32->FileHeader.Machine) {\r
+ case EFI_IMAGE_MACHINE_IA32:\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
+ //\r
+ // Assume PE32+ image with X64 or IPF Machine field\r
+ //\r
+ Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC;\r
+ break;\r
+ default:\r
+ //\r
+ // For unknow Machine field, use Magic in optional Header\r
+ //\r
+ Magic = Hdr.Pe32->OptionalHeader.Magic;\r
+ }\r
+\r
+ if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ //\r
// Use PE32 offset get Debug Directory Entry\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\r
DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) Pe32Data + DirectoryEntry->VirtualAddress);\r
} else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
- // \r
+ //\r
// Use PE32+ offset get Debug Directory Entry\r
//\r
NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r