]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
Add more comments for DxeServicesTableLib library instance.
[mirror_edk2.git] / MdePkg / Library / BasePeCoffGetEntryPointLib / PeCoffGetEntryPoint.c
index 057a171e96272b5857a6c86603060350c7e52179..36370ba4f71f458c075a797631467eeb3fd9e46d 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
-//\r
-// Include common header file for this module.\r
-//\r
-#include "CommonHeader.h"\r
-#include <Include/IndustryStandard/PeImage.h>\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
@@ -46,31 +45,38 @@ PeCoffLoaderGetEntryPoint (
   OUT VOID  **EntryPoint\r
   )\r
 {\r
-  EFI_IMAGE_DOS_HEADER                  *DosHeader;\r
-  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Header;\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
-  DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
-  if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
+  DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
+  if (EFI_IMAGE_DOS_SIGNATURE == DosHdr->e_magic) {\r
     //\r
     // DOS image header is present, so read the PE header after the DOS image header.\r
     //\r
-    Header.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN) Pe32Data + (UINTN) ((DosHeader->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
     //\r
-    Header.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
   }\r
 \r
   //\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
-  return RETURN_SUCCESS;\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
+    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
+  }\r
+\r
+  return RETURN_UNSUPPORTED;\r
 }\r
 \r
 \r
@@ -95,14 +101,24 @@ PeCoffLoaderGetMachineType (
   EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION  Hdr;\r
   EFI_IMAGE_DOS_HEADER                 *DosHdr;\r
 \r
-  DosHdr = (EFI_IMAGE_DOS_HEADER  *)Pe32Data;\r
-  if (DosHdr->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
-    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data + DosHdr->e_lfanew);\r
+  ASSERT (Pe32Data != NULL);\r
+\r
+  DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
+  if (EFI_IMAGE_DOS_SIGNATURE == DosHdr->e_magic) {\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
   } else {\r
-    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)Pe32Data);\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
-  if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE)  {\r
+  if (EFI_TE_IMAGE_HEADER_SIGNATURE == Hdr.Te->Signature) {\r
+    return Hdr.Te->Machine;\r
+  } else if (EFI_IMAGE_NT_SIGNATURE == Hdr.Pe32->Signature)  {\r
     return Hdr.Pe32->FileHeader.Machine;\r
   }\r
 \r
@@ -134,7 +150,7 @@ PeCoffLoaderGetPdbPointer (
   IN VOID  *Pe32Data\r
   )\r
 {\r
-  EFI_IMAGE_DOS_HEADER                  *DosHeader;\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
@@ -151,12 +167,12 @@ PeCoffLoaderGetPdbPointer (
   DebugEntry          = NULL;\r
   NumberOfRvaAndSizes = 0;\r
 \r
-  DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
-  if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) {\r
+  DosHdr = (EFI_IMAGE_DOS_HEADER *)Pe32Data;\r
+  if (EFI_IMAGE_DOS_SIGNATURE == DosHdr->e_magic) {\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
+    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
@@ -164,7 +180,7 @@ PeCoffLoaderGetPdbPointer (
     Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
   }\r
 \r
-  if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
+  if (EFI_TE_IMAGE_HEADER_SIGNATURE == Hdr.Te->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
@@ -172,7 +188,7 @@ PeCoffLoaderGetPdbPointer (
                     Hdr.Te->DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress +\r
                     TEImageAdjust);\r
     }\r
-  } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
+  } else if (EFI_IMAGE_NT_SIGNATURE == Hdr.Pe32->Signature) {\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
@@ -199,7 +215,7 @@ PeCoffLoaderGetPdbPointer (
       Magic = Hdr.Pe32->OptionalHeader.Magic;\r
     }\r
 \r
-    if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+    if (EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC == Magic) {\r
       //\r
       // Use PE32 offset get Debug Directory Entry\r
       //\r
@@ -223,12 +239,15 @@ PeCoffLoaderGetPdbPointer (
     return NULL;\r
   }\r
 \r
-  if (DebugEntry == NULL || DirectoryEntry == NULL) {\r
+  if (NULL == DebugEntry || NULL == DirectoryEntry) {\r
     return NULL;\r
   }\r
 \r
-  for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount++, DebugEntry++) {\r
-    if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
+  //\r
+  // Scan the directory to find the debug entry.\r
+  // \r
+  for (DirCount = 0; DirCount < DirectoryEntry->Size; DirCount += sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY), DebugEntry++) {\r
+    if (EFI_IMAGE_DEBUG_TYPE_CODEVIEW == DebugEntry->Type) {\r
       if (DebugEntry->SizeOfData > 0) {\r
         CodeViewEntryPointer = (VOID *) ((UINTN) DebugEntry->RVA + ((UINTN)Pe32Data) + (UINTN)TEImageAdjust);\r
         switch (* (UINT32 *) CodeViewEntryPointer) {\r