]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/Library/Nt32PeiPeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
Nt32Pkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / Nt32Pkg / Library / Nt32PeiPeCoffGetEntryPointLib / PeCoffGetEntryPoint.c
index 3c7148e66b5eec5b7e23a1fd8c6df0eb0a86f30f..58a88a4569e0160b4240bd54f5fa719ba4a621d3 100644 (file)
@@ -1,13 +1,7 @@
 /**@file\r
 \r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-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
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 Module Name:\r
 \r
@@ -71,7 +65,7 @@ Returns:
              &gNtPeiLoadFilePpiGuid,\r
              0,\r
              &PpiDescriptor,\r
-             &PeiNtService\r
+             (VOID**)&PeiNtService\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -204,16 +198,16 @@ PeCoffLoaderGetPdbPointer (
     //       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
@@ -261,6 +255,9 @@ PeCoffLoaderGetPdbPointer (
           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
@@ -270,3 +267,52 @@ PeCoffLoaderGetPdbPointer (
 \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 image.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+PeCoffGetSizeOfHeaders (\r
+  IN VOID     *Pe32Data\r
+  )\r
+{\r
+  EFI_IMAGE_DOS_HEADER                  *DosHdr;\r
+  EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION   Hdr;\r
+  UINTN                                 SizeOfHeaders;\r
+\r
+  ASSERT (Pe32Data   != NULL);\r
\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 *)((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
+    Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)Pe32Data;\r
+  }\r
+\r
+  if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
+    SizeOfHeaders = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;\r
+  } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {\r
+    SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;\r
+  } else {\r
+    SizeOfHeaders = 0;\r
+  }\r
+\r
+  return (UINT32) SizeOfHeaders;\r
+}\r
+\r