]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
Use PeiPiLib's PeiPiLibBuildPiFvInfoPpi interface instead of installing EFI_PEI_FIRM...
[mirror_edk2.git] / MdePkg / Library / BasePeCoffGetEntryPointLib / PeCoffGetEntryPoint.c
index d0a6746e50969a0371901a1c6c45ba97159d5b6d..5e1f14d9a7f13082f29c895da08f29669b5dbc01 100644 (file)
   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
@@ -60,7 +65,7 @@ PeCoffLoaderGetEntryPoint (
   }\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
@@ -105,7 +110,7 @@ PeCoffLoaderGetMachineType (
 \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
@@ -136,7 +141,8 @@ PeCoffLoaderGetPdbPointer (
   VOID                                  *CodeViewEntryPointer;\r
   INTN                                  TEImageAdjust;\r
   UINT32                                NumberOfRvaAndSizes;\r
\r
+  UINT16                                Magic;\r
+\r
   ASSERT (Pe32Data   != NULL);\r
 \r
   TEImageAdjust       = 0;\r
@@ -166,15 +172,41 @@ PeCoffLoaderGetPdbPointer (
                     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