]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
MdePkg: Apply uncrustify changes
[mirror_edk2.git] / MdePkg / Library / BasePeCoffGetEntryPointLib / PeCoffGetEntryPoint.c
index cf10fc5fe42e47ddb4f8eea4a8771e6f3cb37b1d..00b645a1011ad0a309d9db5e08e1c349c86dd48b 100644 (file)
@@ -8,7 +8,6 @@
 \r
 **/\r
 \r
 \r
 **/\r
 \r
-\r
 #include <Base.h>\r
 \r
 #include <Library/PeCoffGetEntryPointLib.h>\r
 #include <Base.h>\r
 \r
 #include <Library/PeCoffGetEntryPointLib.h>\r
@@ -16,7 +15,7 @@
 \r
 #include <IndustryStandard/PeImage.h>\r
 \r
 \r
 #include <IndustryStandard/PeImage.h>\r
 \r
-#define PE_COFF_IMAGE_ALIGN_SIZE        4\r
+#define PE_COFF_IMAGE_ALIGN_SIZE  4\r
 \r
 /**\r
   Retrieves and returns a pointer to the entry point to a PE/COFF image that has been loaded\r
 \r
 /**\r
   Retrieves and returns a pointer to the entry point to a PE/COFF image that has been loaded\r
@@ -42,8 +41,8 @@ PeCoffLoaderGetEntryPoint (
   OUT VOID  **EntryPoint\r
   )\r
 {\r
   OUT VOID  **EntryPoint\r
   )\r
 {\r
-  EFI_IMAGE_DOS_HEADER                  *DosHdr;\r
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
+  EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
 \r
   ASSERT (Pe32Data   != NULL);\r
   ASSERT (EntryPoint != NULL);\r
 \r
   ASSERT (Pe32Data   != NULL);\r
   ASSERT (EntryPoint != NULL);\r
@@ -53,7 +52,7 @@ PeCoffLoaderGetEntryPoint (
     //\r
     // DOS image header is present, so read the PE header after the DOS image header.\r
     //\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) ((DosHdr->e_lfanew) & 0x0ffff));\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
@@ -66,7 +65,7 @@ PeCoffLoaderGetEntryPoint (
   // AddressOfEntryPoint is common for PE32 & PE32+\r
   //\r
   if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
   // AddressOfEntryPoint is common for PE32 & PE32+\r
   //\r
   if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
-    *EntryPoint = (VOID *)((UINTN)Pe32Data + (UINTN)(Hdr.Te->AddressOfEntryPoint & 0x0ffffffff) + sizeof(EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize);\r
+    *EntryPoint = (VOID *)((UINTN)Pe32Data + (UINTN)(Hdr.Te->AddressOfEntryPoint & 0x0ffffffff) + sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize);\r
     return RETURN_SUCCESS;\r
   } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
     *EntryPoint = (VOID *)((UINTN)Pe32Data + (UINTN)(Hdr.Pe32->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));\r
     return RETURN_SUCCESS;\r
   } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
     *EntryPoint = (VOID *)((UINTN)Pe32Data + (UINTN)(Hdr.Pe32->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff));\r
@@ -76,7 +75,6 @@ PeCoffLoaderGetEntryPoint (
   return RETURN_UNSUPPORTED;\r
 }\r
 \r
   return RETURN_UNSUPPORTED;\r
 }\r
 \r
-\r
 /**\r
   Returns the machine type of a PE/COFF image.\r
 \r
 /**\r
   Returns the machine type of a PE/COFF image.\r
 \r
@@ -105,7 +103,7 @@ PeCoffLoaderGetMachineType (
     //\r
     // DOS image header is present, so read the PE header after the DOS image header.\r
     //\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) ((DosHdr->e_lfanew) & 0x0ffff));\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
@@ -115,7 +113,7 @@ PeCoffLoaderGetMachineType (
 \r
   if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
     return Hdr.Te->Machine;\r
 \r
   if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
     return Hdr.Te->Machine;\r
-  } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE)  {\r
+  } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
     return Hdr.Pe32->FileHeader.Machine;\r
   }\r
 \r
     return Hdr.Pe32->FileHeader.Machine;\r
   }\r
 \r
@@ -147,15 +145,15 @@ PeCoffLoaderGetPdbPointer (
   IN VOID  *Pe32Data\r
   )\r
 {\r
   IN VOID  *Pe32Data\r
   )\r
 {\r
-  EFI_IMAGE_DOS_HEADER                  *DosHdr;\r
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
-  EFI_IMAGE_DATA_DIRECTORY              *DirectoryEntry;\r
-  EFI_IMAGE_DEBUG_DIRECTORY_ENTRY       *DebugEntry;\r
-  UINTN                                 DirCount;\r
-  VOID                                  *CodeViewEntryPointer;\r
-  INTN                                  TEImageAdjust;\r
-  UINT32                                NumberOfRvaAndSizes;\r
-  UINT16                                Magic;\r
+  EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
+  EFI_IMAGE_DATA_DIRECTORY             *DirectoryEntry;\r
+  EFI_IMAGE_DEBUG_DIRECTORY_ENTRY      *DebugEntry;\r
+  UINTN                                DirCount;\r
+  VOID                                 *CodeViewEntryPointer;\r
+  INTN                                 TEImageAdjust;\r
+  UINT32                               NumberOfRvaAndSizes;\r
+  UINT16                               Magic;\r
 \r
   ASSERT (Pe32Data   != NULL);\r
 \r
 \r
   ASSERT (Pe32Data   != NULL);\r
 \r
@@ -169,7 +167,7 @@ PeCoffLoaderGetPdbPointer (
     //\r
     // DOS image header is present, so read the PE header after the DOS image header.\r
     //\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) ((DosHdr->e_lfanew) & 0x0ffff));\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
@@ -179,11 +177,11 @@ PeCoffLoaderGetPdbPointer (
 \r
   if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
     if (Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {\r
 \r
   if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
     if (Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress != 0) {\r
-      DirectoryEntry  = &Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG];\r
-      TEImageAdjust   = sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize;\r
-      DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN) Hdr.Te +\r
-                    Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +\r
-                    TEImageAdjust);\r
+      DirectoryEntry = &Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG];\r
+      TEImageAdjust  = sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize;\r
+      DebugEntry     = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN)Hdr.Te +\r
+                                                           Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +\r
+                                                           TEImageAdjust);\r
     }\r
   } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
     //\r
     }\r
   } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
     //\r
@@ -192,24 +190,24 @@ PeCoffLoaderGetPdbPointer (
     //       generate PE32+ image with PE32 Magic.\r
     //\r
     switch (Hdr.Pe32->FileHeader.Machine) {\r
     //       generate PE32+ image with PE32 Magic.\r
     //\r
     switch (Hdr.Pe32->FileHeader.Machine) {\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 IMAGE_FILE_MACHINE_X64:\r
-    case IMAGE_FILE_MACHINE_IA64:\r
-      //\r
-      // Assume PE32+ image with x64 or IA64 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
+      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 IMAGE_FILE_MACHINE_X64:\r
+      case IMAGE_FILE_MACHINE_IA64:\r
+        //\r
+        // Assume PE32+ image with x64 or IA64 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
 \r
     if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
@@ -217,26 +215,26 @@ PeCoffLoaderGetPdbPointer (
       // Use PE32 offset get Debug Directory Entry\r
       //\r
       NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;\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
+      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
       // Use PE32+ offset get Debug Directory Entry\r
       //\r
       NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
     } else if (Hdr.Pe32->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
       //\r
       // Use PE32+ offset get Debug Directory Entry\r
       //\r
       NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;\r
-      DirectoryEntry = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
-      DebugEntry     = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) ((UINTN) Pe32Data + DirectoryEntry->VirtualAddress);\r
+      DirectoryEntry      = (EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);\r
+      DebugEntry          = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)((UINTN)Pe32Data + DirectoryEntry->VirtualAddress);\r
     }\r
 \r
     if (NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
       DirectoryEntry = NULL;\r
     }\r
 \r
     if (NumberOfRvaAndSizes <= EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {\r
       DirectoryEntry = NULL;\r
-      DebugEntry = NULL;\r
+      DebugEntry     = NULL;\r
     }\r
   } else {\r
     return NULL;\r
   }\r
 \r
     }\r
   } else {\r
     return NULL;\r
   }\r
 \r
-  if (DebugEntry == NULL || DirectoryEntry == NULL) {\r
+  if ((DebugEntry == NULL) || (DirectoryEntry == NULL)) {\r
     return NULL;\r
   }\r
 \r
     return NULL;\r
   }\r
 \r
@@ -246,16 +244,16 @@ PeCoffLoaderGetPdbPointer (
   for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount += sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY), DebugEntry++) {\r
     if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
       if (DebugEntry->SizeOfData > 0) {\r
   for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount += sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY), DebugEntry++) {\r
     if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
       if (DebugEntry->SizeOfData > 0) {\r
-        CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + ((UINTN)Pe32Data) + (UINTN)TEImageAdjust);\r
-        switch (* (UINT32 *) CodeViewEntryPointer) {\r
-        case CODEVIEW_SIGNATURE_NB10:\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
-        default:\r
-          break;\r
+        CodeViewEntryPointer = (VOID *)((UINTN)DebugEntry->RVA + ((UINTN)Pe32Data) + (UINTN)TEImageAdjust);\r
+        switch (*(UINT32 *)CodeViewEntryPointer) {\r
+          case CODEVIEW_SIGNATURE_NB10:\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
+          default:\r
+            break;\r
         }\r
       }\r
     }\r
         }\r
       }\r
     }\r
@@ -279,12 +277,12 @@ PeCoffLoaderGetPdbPointer (
 UINT32\r
 EFIAPI\r
 PeCoffGetSizeOfHeaders (\r
 UINT32\r
 EFIAPI\r
 PeCoffGetSizeOfHeaders (\r
-  IN VOID     *Pe32Data\r
+  IN VOID  *Pe32Data\r
   )\r
 {\r
   )\r
 {\r
-  EFI_IMAGE_DOS_HEADER                  *DosHdr;\r
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
-  UINTN                                 SizeOfHeaders;\r
+  EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
+  UINTN                                SizeOfHeaders;\r
 \r
   ASSERT (Pe32Data   != NULL);\r
 \r
 \r
   ASSERT (Pe32Data   != NULL);\r
 \r
@@ -293,7 +291,7 @@ PeCoffGetSizeOfHeaders (
     //\r
     // DOS image header is present, so read the PE header after the DOS image header.\r
     //\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) ((DosHdr->e_lfanew) & 0x0ffff));\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
   } else {\r
     //\r
     // DOS image header is not present, so PE header is at the image base.\r
@@ -309,7 +307,7 @@ PeCoffGetSizeOfHeaders (
     SizeOfHeaders = 0;\r
   }\r
 \r
     SizeOfHeaders = 0;\r
   }\r
 \r
-  return (UINT32) SizeOfHeaders;\r
+  return (UINT32)SizeOfHeaders;\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -327,55 +325,57 @@ PeCoffGetSizeOfHeaders (
 UINTN\r
 EFIAPI\r
 PeCoffSearchImageBase (\r
 UINTN\r
 EFIAPI\r
 PeCoffSearchImageBase (\r
-  IN UINTN    Address\r
+  IN UINTN  Address\r
   )\r
 {\r
   )\r
 {\r
-  UINTN                                Pe32Data;\r
+  UINTN  Pe32Data;\r
 \r
   Pe32Data = 0;\r
 \r
   DEBUG_CODE_BEGIN ();\r
 \r
   Pe32Data = 0;\r
 \r
   DEBUG_CODE_BEGIN ();\r
-    EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
-    EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
+  EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
 \r
 \r
-    //\r
-    // Find Image Base\r
-    //\r
-    Pe32Data = Address & ~(PE_COFF_IMAGE_ALIGN_SIZE - 1);\r
-    while (Pe32Data != 0) {\r
-      DosHdr = (EFI_IMAGE_DOS_HEADER *) Pe32Data;\r
-      if (DosHdr->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 *)(Pe32Data + (UINTN) ((DosHdr->e_lfanew) & 0x0ffff));\r
-        //\r
-        // Make sure PE header address does not overflow and is less than the initial address.\r
-        //\r
-        if (((UINTN)Hdr.Pe32 > Pe32Data) && ((UINTN)Hdr.Pe32 < Address)) {\r
-          if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
-            break;\r
-          }\r
-        }\r
-      } else {\r
-        //\r
-        // DOS image header is not present, TE header is at the image base.\r
-        //\r
-        Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
-        if ((Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) &&\r
-            ((Hdr.Te->Machine == IMAGE_FILE_MACHINE_I386)  || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_IA64) ||\r
-             (Hdr.Te->Machine == IMAGE_FILE_MACHINE_EBC)   || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_X64)  ||\r
-             (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARM64) || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED))\r
-             ) {\r
+  //\r
+  // Find Image Base\r
+  //\r
+  Pe32Data = Address & ~(PE_COFF_IMAGE_ALIGN_SIZE - 1);\r
+  while (Pe32Data != 0) {\r
+    DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
+    if (DosHdr->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 *)(Pe32Data + (UINTN)((DosHdr->e_lfanew) & 0x0ffff));\r
+      //\r
+      // Make sure PE header address does not overflow and is less than the initial address.\r
+      //\r
+      if (((UINTN)Hdr.Pe32 > Pe32Data) && ((UINTN)Hdr.Pe32 < Address)) {\r
+        if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
           break;\r
         }\r
       }\r
           break;\r
         }\r
       }\r
-\r
+    } else {\r
       //\r
       //\r
-      // Not found the image base, check the previous aligned address\r
+      // DOS image header is not present, TE header is at the image base.\r
       //\r
       //\r
-      Pe32Data -= PE_COFF_IMAGE_ALIGN_SIZE;\r
+      Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
+      if ((Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) &&\r
+          ((Hdr.Te->Machine == IMAGE_FILE_MACHINE_I386)  || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_IA64) ||\r
+           (Hdr.Te->Machine == IMAGE_FILE_MACHINE_EBC)   || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_X64)  ||\r
+           (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARM64) || (Hdr.Te->Machine == IMAGE_FILE_MACHINE_ARMTHUMB_MIXED))\r
+          )\r
+      {\r
+        break;\r
+      }\r
     }\r
     }\r
+\r
+    //\r
+    // Not found the image base, check the previous aligned address\r
+    //\r
+    Pe32Data -= PE_COFF_IMAGE_ALIGN_SIZE;\r
+  }\r
+\r
   DEBUG_CODE_END ();\r
 \r
   return Pe32Data;\r
   DEBUG_CODE_END ();\r
 \r
   return Pe32Data;\r