]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Checks the TE image before use it.
authorydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Dec 2012 04:33:15 +0000 (04:33 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 26 Dec 2012 04:33:15 +0000 (04:33 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Yao, Jiewen <jiewen.yao@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14024 6f19259b-4bc3-4df7-8a09-765794883524

MdePkg/Library/BasePeCoffLib/BasePeCoff.c
MdePkg/Library/BasePeCoffLib/BasePeCoffLibInternals.h

index 258455708ad11bce89558731b6f5101439811efc..b7ecc3171554a5e5ec648eb841c195650a933bf5 100644 (file)
 \r
 #include "BasePeCoffLibInternals.h"\r
 \r
+/**\r
+  Adjust some fields in section header for TE image.\r
+\r
+  @param  SectionHeader             Pointer to the section header.\r
+  @param  TeStrippedOffset          Size adjust for the TE image.\r
+\r
+**/\r
+VOID\r
+PeCoffLoaderAdjustOffsetForTeImage (\r
+  EFI_IMAGE_SECTION_HEADER              *SectionHeader,\r
+  UINT32                                TeStrippedOffset\r
+  )\r
+{\r
+  SectionHeader->VirtualAddress   -= TeStrippedOffset;\r
+  SectionHeader->PointerToRawData -= TeStrippedOffset;\r
+}\r
+\r
 /**\r
   Retrieves the magic value from the PE/COFF header.\r
 \r
@@ -157,6 +174,50 @@ PeCoffLoaderGetPeHeader (
     ImageContext->SectionAlignment  = 0;\r
     ImageContext->SizeOfHeaders     = sizeof (EFI_TE_IMAGE_HEADER) + (UINTN)Hdr.Te->BaseOfCode - (UINTN)Hdr.Te->StrippedSize;\r
 \r
+    //\r
+    // Check the StrippedSize.\r
+    //\r
+    if (sizeof (EFI_TE_IMAGE_HEADER) >= (UINT32)Hdr.Te->StrippedSize) {\r
+      ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+      return RETURN_UNSUPPORTED;\r
+    }\r
+\r
+    //\r
+    // Check the SizeOfHeaders field.\r
+    //\r
+    if (Hdr.Te->BaseOfCode <= Hdr.Te->StrippedSize) {\r
+      ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+      return RETURN_UNSUPPORTED;\r
+    }\r
+\r
+    //\r
+    // Read last byte of Hdr.Te->SizeOfHeaders from the file.\r
+    //\r
+    Size = 1;\r
+    ReadSize = Size;\r
+    Status = ImageContext->ImageRead (\r
+                             ImageContext->Handle,\r
+                             ImageContext->SizeOfHeaders - 1,\r
+                             &Size,\r
+                             &BufferData\r
+                             );\r
+    if (RETURN_ERROR (Status) || (Size != ReadSize)) {\r
+      ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
+      if (Size != ReadSize) {\r
+        Status = RETURN_UNSUPPORTED;\r
+      }\r
+      return Status;\r
+    }\r
+\r
+    //\r
+    // TE Image Data Directory Entry size is non-zero, but the Data Directory Virtual Address is zero.\r
+    // This case is not a valid TE image. \r
+    //\r
+    if ((Hdr.Te->DataDirectory[0].Size != 0 && Hdr.Te->DataDirectory[0].VirtualAddress == 0) ||\r
+        (Hdr.Te->DataDirectory[1].Size != 0 && Hdr.Te->DataDirectory[1].VirtualAddress == 0)) {\r
+      ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+      return RETURN_UNSUPPORTED;\r
+    }\r
   } else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE)  {\r
     ImageContext->IsTeImage = FALSE;\r
     ImageContext->Machine = Hdr.Pe32->FileHeader.Machine;\r
@@ -417,6 +478,13 @@ PeCoffLoaderGetPeHeader (
       return Status;\r
     }\r
 \r
+    //\r
+    // Adjust some field in Section Header for TE image.\r
+    //\r
+    if (ImageContext->IsTeImage) {\r
+      PeCoffLoaderAdjustOffsetForTeImage (&SectionHeader, (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER));\r
+    }\r
+\r
     if (SectionHeader.SizeOfRawData > 0) {\r
       //\r
       // Section data should bigger than the Pe header.\r
@@ -514,6 +582,7 @@ PeCoffLoaderGetImageInfo (
   EFI_IMAGE_DEBUG_DIRECTORY_ENTRY       DebugEntry;\r
   UINT32                                NumberOfRvaAndSizes;\r
   UINT16                                Magic;\r
+  UINT32                                TeStrippedOffset;\r
 \r
   if (ImageContext == NULL) {\r
     return RETURN_INVALID_PARAMETER;\r
@@ -535,6 +604,7 @@ PeCoffLoaderGetImageInfo (
   // Retrieve the base address of the image\r
   //\r
   if (!(ImageContext->IsTeImage)) {\r
+    TeStrippedOffset = 0;\r
     if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
       //\r
       // Use PE32 offset\r
@@ -547,7 +617,8 @@ PeCoffLoaderGetImageInfo (
       ImageContext->ImageAddress = Hdr.Pe32Plus->OptionalHeader.ImageBase;\r
     }\r
   } else {\r
-    ImageContext->ImageAddress = (PHYSICAL_ADDRESS)(Hdr.Te->ImageBase + Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER));\r
+    TeStrippedOffset = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
+    ImageContext->ImageAddress = (PHYSICAL_ADDRESS)(Hdr.Te->ImageBase + TeStrippedOffset);\r
   }\r
 \r
   //\r
@@ -581,15 +652,6 @@ PeCoffLoaderGetImageInfo (
   } else {\r
     ImageContext->RelocationsStripped = FALSE;\r
   }\r
-  \r
-  //\r
-  // TE Image Relocation Data Directory Entry size is non-zero, but the Relocation Data Directory Virtual Address is zero.\r
-  // This case is not a valid TE image. \r
-  //\r
-  if ((ImageContext->IsTeImage) && (Hdr.Te->DataDirectory[0].Size != 0) && (Hdr.Te->DataDirectory[0].VirtualAddress == 0)) {\r
-    ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
-    return RETURN_UNSUPPORTED;\r
-  }\r
 \r
   if (!(ImageContext->IsTeImage)) {\r
     if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
@@ -723,9 +785,8 @@ PeCoffLoaderGetImageInfo (
           DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) {\r
         DebugDirectoryEntryFileOffset = DebugDirectoryEntryRva -\r
                                         SectionHeader.VirtualAddress +\r
-                                        SectionHeader.PointerToRawData +\r
-                                        sizeof (EFI_TE_IMAGE_HEADER) -\r
-                                        Hdr.Te->StrippedSize;\r
+                                        SectionHeader.PointerToRawData -\r
+                                        TeStrippedOffset;\r
 \r
         //\r
         // File offset of the debug directory was found, if this is not the last\r
@@ -749,7 +810,7 @@ PeCoffLoaderGetImageInfo (
       // Section Table.  \r
       //\r
       if ((++Index) == (UINTN)Hdr.Te->NumberOfSections) {\r
-        ImageContext->ImageSize = (SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize);\r
+        ImageContext->ImageSize = (SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) - TeStrippedOffset;\r
       }\r
 \r
       SectionHeaderOffset += sizeof (EFI_IMAGE_SECTION_HEADER);\r
@@ -791,8 +852,9 @@ PeCoffLoaderGetImageInfo (
 /**\r
   Converts an image address to the loaded address.\r
 \r
-  @param  ImageContext  The context of the image being loaded.\r
-  @param  Address       The relative virtual address to be converted to the loaded address.\r
+  @param  ImageContext      The context of the image being loaded.\r
+  @param  Address           The address to be converted to the loaded address.\r
+  @param  TeStrippedOffset  Stripped offset for TE image.\r
 \r
   @return The converted address or NULL if the address can not be converted.\r
 \r
@@ -800,18 +862,19 @@ PeCoffLoaderGetImageInfo (
 VOID *\r
 PeCoffLoaderImageAddress (\r
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
-  IN     UINTN                                 Address\r
+  IN     UINTN                                 Address, \r
+  IN     UINTN                                 TeStrippedOffset\r
   )\r
 {\r
   //\r
   // Make sure that Address and ImageSize is correct for the loaded image.\r
   //\r
-  if (Address >= ImageContext->ImageSize) {\r
+  if (Address >= ImageContext->ImageSize + TeStrippedOffset) {\r
     ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_ADDRESS;\r
     return NULL;\r
   }\r
 \r
-  return (CHAR8 *)((UINTN) ImageContext->ImageAddress + Address);\r
+  return (CHAR8 *)((UINTN) ImageContext->ImageAddress + Address - TeStrippedOffset);\r
 }\r
 \r
 /**\r
@@ -867,6 +930,7 @@ PeCoffLoaderRelocateImage (
   PHYSICAL_ADDRESS                      BaseAddress;\r
   UINT32                                NumberOfRvaAndSizes;\r
   UINT16                                Magic;\r
+  UINT32                                TeStrippedOffset;\r
 \r
   ASSERT (ImageContext != NULL);\r
 \r
@@ -897,7 +961,7 @@ PeCoffLoaderRelocateImage (
 \r
   if (!(ImageContext->IsTeImage)) {\r
     Hdr.Pe32 = (EFI_IMAGE_NT_HEADERS32 *)((UINTN)ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset);\r
-\r
+    TeStrippedOffset = 0;\r
     Magic = PeCoffLoaderGetPeHeaderMagicValue (Hdr);\r
 \r
     if (Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
@@ -930,47 +994,37 @@ PeCoffLoaderRelocateImage (
     // is present in the image. You have to check the NumberOfRvaAndSizes in\r
     // the optional header to verify a desired directory entry is there.\r
     //\r
-\r
-    if ((NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) && (RelocDir->Size > 0)) {\r
-      RelocBase = PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress);\r
-      RelocBaseEnd = PeCoffLoaderImageAddress (\r
-                      ImageContext,\r
-                      RelocDir->VirtualAddress + RelocDir->Size - 1\r
-                      );\r
-      if (RelocBase == NULL || RelocBaseEnd == NULL) {\r
-        return RETURN_LOAD_ERROR;\r
-      }\r
-    } else {\r
-      //\r
-      // Set base and end to bypass processing below.\r
-      //\r
-      RelocBase = RelocBaseEnd = NULL;\r
+    if ((NumberOfRvaAndSizes < EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC)) {\r
+      RelocDir = NULL;\r
     }\r
   } else {\r
     Hdr.Te             = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
-    Adjust             = (UINT64) (BaseAddress - Hdr.Te->StrippedSize + sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->ImageBase);\r
+    TeStrippedOffset   = (UINT32)Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
+    Adjust             = (UINT64) (BaseAddress - (Hdr.Te->ImageBase + TeStrippedOffset));\r
     if (Adjust != 0) {\r
-      Hdr.Te->ImageBase  = (UINT64) (BaseAddress - Hdr.Te->StrippedSize + sizeof (EFI_TE_IMAGE_HEADER));\r
+      Hdr.Te->ImageBase  = (UINT64) (BaseAddress - TeStrippedOffset);\r
     }\r
 \r
     //\r
     // Find the relocation block\r
     //\r
     RelocDir = &Hdr.Te->DataDirectory[0];\r
-    if (RelocDir->Size > 0) {\r
-      RelocBase = (EFI_IMAGE_BASE_RELOCATION *)(UINTN)(\r
-                                      ImageContext->ImageAddress +\r
-                                      RelocDir->VirtualAddress +\r
-                                      sizeof(EFI_TE_IMAGE_HEADER) -\r
-                                      Hdr.Te->StrippedSize\r
-                                      );\r
-      RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *) ((UINTN) RelocBase + (UINTN) RelocDir->Size - 1);\r
-    } else {\r
-      //\r
-      // Set base and end to bypass processing below.\r
-      //\r
-      RelocBase = RelocBaseEnd = NULL;    \r
+  }\r
+\r
+  if ((RelocDir != NULL) && (RelocDir->Size > 0)) {\r
+    RelocBase = (EFI_IMAGE_BASE_RELOCATION *) PeCoffLoaderImageAddress (ImageContext, RelocDir->VirtualAddress, TeStrippedOffset);\r
+    RelocBaseEnd = (EFI_IMAGE_BASE_RELOCATION *) PeCoffLoaderImageAddress (ImageContext,\r
+                                                                            RelocDir->VirtualAddress + RelocDir->Size - 1,\r
+                                                                            TeStrippedOffset\r
+                                                                            );\r
+    if (RelocBase == NULL || RelocBaseEnd == NULL) {\r
+      return RETURN_LOAD_ERROR;\r
     }\r
+  } else {\r
+    //\r
+    // Set base and end to bypass processing below.\r
+    //\r
+    RelocBase = RelocBaseEnd = NULL;    \r
   }\r
 \r
   //\r
@@ -993,19 +1047,10 @@ PeCoffLoaderRelocateImage (
       }\r
 \r
       RelocEnd  = (UINT16 *) ((CHAR8 *) RelocBase + RelocBase->SizeOfBlock);\r
-\r
-      if (!(ImageContext->IsTeImage)) {\r
-        FixupBase = PeCoffLoaderImageAddress (ImageContext, RelocBase->VirtualAddress);\r
-        if (FixupBase == NULL) {\r
-          return RETURN_LOAD_ERROR;\r
-        }\r
-      } else {\r
-        FixupBase = (CHAR8 *)(UINTN)(ImageContext->ImageAddress +\r
-                      RelocBase->VirtualAddress +\r
-                      sizeof(EFI_TE_IMAGE_HEADER) -\r
-                      Hdr.Te->StrippedSize\r
-                      );\r
-      }    \r
+      FixupBase = PeCoffLoaderImageAddress (ImageContext, RelocBase->VirtualAddress, TeStrippedOffset);\r
+      if (FixupBase == NULL) {\r
+        return RETURN_LOAD_ERROR;\r
+      }  \r
 \r
       //\r
       // Run this relocation record\r
@@ -1154,7 +1199,7 @@ PeCoffLoaderLoadImage (
   EFI_IMAGE_RESOURCE_DATA_ENTRY         *ResourceDataEntry;\r
   CHAR16                                *String;\r
   UINT32                                Offset;\r
-\r
+  UINT32                                TeStrippedOffset;\r
 \r
   ASSERT (ImageContext != NULL);\r
 \r
@@ -1241,6 +1286,7 @@ PeCoffLoaderLoadImage (
                       Hdr.Pe32->FileHeader.SizeOfOptionalHeader\r
       );\r
     NumberOfSections = (UINTN) (Hdr.Pe32->FileHeader.NumberOfSections);\r
+    TeStrippedOffset = 0;\r
   } else {\r
     Status = ImageContext->ImageRead (\r
                             ImageContext->Handle,\r
@@ -1250,13 +1296,12 @@ PeCoffLoaderLoadImage (
                             );\r
 \r
     Hdr.Te = (EFI_TE_IMAGE_HEADER *)(UINTN)(ImageContext->ImageAddress);\r
-\r
     FirstSection = (EFI_IMAGE_SECTION_HEADER *) (\r
                       (UINTN)ImageContext->ImageAddress +\r
                       sizeof(EFI_TE_IMAGE_HEADER)\r
                       );\r
     NumberOfSections  = (UINTN) (Hdr.Te->NumberOfSections);\r
-\r
+    TeStrippedOffset  = (UINT32) Hdr.Te->StrippedSize - sizeof (EFI_TE_IMAGE_HEADER);\r
   }\r
 \r
   if (RETURN_ERROR (Status)) {\r
@@ -1280,11 +1325,8 @@ PeCoffLoaderLoadImage (
     //\r
     // Compute sections address\r
     //\r
-    Base = PeCoffLoaderImageAddress (ImageContext, Section->VirtualAddress);\r
-    End = PeCoffLoaderImageAddress (\r
-            ImageContext,\r
-            Section->VirtualAddress + Section->Misc.VirtualSize - 1\r
-            );\r
+    Base = PeCoffLoaderImageAddress (ImageContext, Section->VirtualAddress, TeStrippedOffset);\r
+    End  = PeCoffLoaderImageAddress (ImageContext, Section->VirtualAddress + Section->Misc.VirtualSize - 1, TeStrippedOffset);\r
 \r
     //\r
     // If the size of the section is non-zero and the base address or end address resolved to 0, then fail.\r
@@ -1294,28 +1336,13 @@ PeCoffLoaderLoadImage (
       return RETURN_LOAD_ERROR;\r
     }\r
 \r
-    if (ImageContext->IsTeImage) {\r
-      Base = (CHAR8 *)((UINTN) Base + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN)Hdr.Te->StrippedSize);\r
-      End  = (CHAR8 *)((UINTN) End +  sizeof (EFI_TE_IMAGE_HEADER) - (UINTN)Hdr.Te->StrippedSize);\r
-    }\r
-\r
     if (Section->SizeOfRawData > 0) {\r
-      if (!(ImageContext->IsTeImage)) {\r
-        Status = ImageContext->ImageRead (\r
-                                ImageContext->Handle,\r
-                                Section->PointerToRawData,\r
-                                &Size,\r
-                                Base\r
-                                );\r
-      } else {\r
-        Status = ImageContext->ImageRead (\r
-                                ImageContext->Handle,\r
-                                Section->PointerToRawData + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN)Hdr.Te->StrippedSize,\r
-                                &Size,\r
-                                Base\r
-                                );\r
-      }\r
-\r
+      Status = ImageContext->ImageRead (\r
+                              ImageContext->Handle,\r
+                              Section->PointerToRawData - TeStrippedOffset,\r
+                              &Size,\r
+                              Base\r
+                              );\r
       if (RETURN_ERROR (Status)) {\r
         ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
         return Status;\r
@@ -1350,7 +1377,8 @@ PeCoffLoaderLoadImage (
       //\r
       ImageContext->EntryPoint = (PHYSICAL_ADDRESS)(UINTN)PeCoffLoaderImageAddress (\r
                                                             ImageContext,\r
-                                                            (UINTN)Hdr.Pe32->OptionalHeader.AddressOfEntryPoint\r
+                                                            (UINTN)Hdr.Pe32->OptionalHeader.AddressOfEntryPoint,\r
+                                                            0\r
                                                             );\r
     } else {\r
       //\r
@@ -1358,16 +1386,16 @@ PeCoffLoaderLoadImage (
       //\r
       ImageContext->EntryPoint = (PHYSICAL_ADDRESS)(UINTN)PeCoffLoaderImageAddress (\r
                                                             ImageContext,\r
-                                                            (UINTN)Hdr.Pe32Plus->OptionalHeader.AddressOfEntryPoint\r
+                                                            (UINTN)Hdr.Pe32Plus->OptionalHeader.AddressOfEntryPoint,\r
+                                                            0\r
                                                             );\r
     }\r
   } else {\r
-    ImageContext->EntryPoint =  (PHYSICAL_ADDRESS) (\r
-                                (UINTN)ImageContext->ImageAddress  +\r
-                                (UINTN)Hdr.Te->AddressOfEntryPoint +\r
-                                (UINTN)sizeof(EFI_TE_IMAGE_HEADER) -\r
-                                (UINTN)Hdr.Te->StrippedSize\r
-                                );\r
+    ImageContext->EntryPoint = (PHYSICAL_ADDRESS)(UINTN)PeCoffLoaderImageAddress (\r
+                                                          ImageContext,\r
+                                                          (UINTN)Hdr.Te->AddressOfEntryPoint,\r
+                                                          TeStrippedOffset\r
+                                                          );\r
   }\r
 \r
   //\r
@@ -1411,107 +1439,82 @@ PeCoffLoaderLoadImage (
   // Load the Codeview information if present\r
   //\r
   if (ImageContext->DebugDirectoryEntryRva != 0) {\r
-    if (!(ImageContext->IsTeImage)) {\r
-      DebugEntry = PeCoffLoaderImageAddress (\r
-                    ImageContext,\r
-                    ImageContext->DebugDirectoryEntryRva\r
-                    );\r
-    } else {\r
-      DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *)(UINTN)(\r
-                      ImageContext->ImageAddress +\r
-                      ImageContext->DebugDirectoryEntryRva +\r
-                      sizeof(EFI_TE_IMAGE_HEADER) -\r
-                      Hdr.Te->StrippedSize\r
-                      );\r
+    DebugEntry = PeCoffLoaderImageAddress (\r
+                ImageContext,\r
+                ImageContext->DebugDirectoryEntryRva,\r
+                TeStrippedOffset\r
+                );\r
+    if (DebugEntry == NULL) {\r
+      ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
+      return RETURN_LOAD_ERROR;\r
     }\r
 \r
-    if (DebugEntry != NULL) {\r
-      TempDebugEntryRva = DebugEntry->RVA;\r
-      if (DebugEntry->RVA == 0 && DebugEntry->FileOffset != 0) {\r
-        Section--;\r
-        if ((UINTN)Section->SizeOfRawData < Section->Misc.VirtualSize) {\r
-          TempDebugEntryRva = Section->VirtualAddress + Section->Misc.VirtualSize;\r
-        } else {\r
-          TempDebugEntryRva = Section->VirtualAddress + Section->SizeOfRawData;\r
-        }\r
+    TempDebugEntryRva = DebugEntry->RVA;\r
+    if (DebugEntry->RVA == 0 && DebugEntry->FileOffset != 0) {\r
+      Section--;\r
+      if ((UINTN)Section->SizeOfRawData < Section->Misc.VirtualSize) {\r
+        TempDebugEntryRva = Section->VirtualAddress + Section->Misc.VirtualSize;\r
+      } else {\r
+        TempDebugEntryRva = Section->VirtualAddress + Section->SizeOfRawData;\r
       }\r
+    }\r
 \r
-      if (TempDebugEntryRva != 0) {\r
-        if (!(ImageContext->IsTeImage)) {\r
-          ImageContext->CodeView = PeCoffLoaderImageAddress (ImageContext, TempDebugEntryRva);\r
-        } else {\r
-          ImageContext->CodeView = (VOID *)(\r
-                                    (UINTN)ImageContext->ImageAddress +\r
-                                    (UINTN)TempDebugEntryRva +\r
-                                    (UINTN)sizeof (EFI_TE_IMAGE_HEADER) -\r
-                                    (UINTN) Hdr.Te->StrippedSize\r
-                                    );\r
-        }\r
+    if (TempDebugEntryRva != 0) {\r
+      ImageContext->CodeView = PeCoffLoaderImageAddress (ImageContext, TempDebugEntryRva, TeStrippedOffset); \r
+      if (ImageContext->CodeView == NULL) {\r
+        ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;\r
+        return RETURN_LOAD_ERROR;\r
+      }\r
 \r
-        if (ImageContext->CodeView == NULL) {\r
+      if (DebugEntry->RVA == 0) {\r
+        Size = DebugEntry->SizeOfData;\r
+        Status = ImageContext->ImageRead (\r
+                                ImageContext->Handle,\r
+                                DebugEntry->FileOffset - TeStrippedOffset,\r
+                                &Size,\r
+                                ImageContext->CodeView\r
+                                );\r
+        //\r
+        // Should we apply fix up to this field according to the size difference between PE and TE?\r
+        // Because now we maintain TE header fields unfixed, this field will also remain as they are\r
+        // in original PE image.\r
+        //\r
+\r
+        if (RETURN_ERROR (Status)) {\r
           ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
           return RETURN_LOAD_ERROR;\r
         }\r
 \r
-        if (DebugEntry->RVA == 0) {\r
-          Size = DebugEntry->SizeOfData;\r
-          if (!(ImageContext->IsTeImage)) {\r
-            Status = ImageContext->ImageRead (\r
-                                    ImageContext->Handle,\r
-                                    DebugEntry->FileOffset,\r
-                                    &Size,\r
-                                    ImageContext->CodeView\r
-                                    );\r
-          } else {\r
-            Status = ImageContext->ImageRead (\r
-                                    ImageContext->Handle,\r
-                                    DebugEntry->FileOffset + sizeof (EFI_TE_IMAGE_HEADER) - Hdr.Te->StrippedSize,\r
-                                    &Size,\r
-                                    ImageContext->CodeView\r
-                                    );\r
-            //\r
-            // Should we apply fix up to this field according to the size difference between PE and TE?\r
-            // Because now we maintain TE header fields unfixed, this field will also remain as they are\r
-            // in original PE image.\r
-            //\r
-          }\r
-\r
-          if (RETURN_ERROR (Status)) {\r
-            ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;\r
-            return RETURN_LOAD_ERROR;\r
-          }\r
+        DebugEntry->RVA = TempDebugEntryRva;\r
+      }\r
 \r
-          DebugEntry->RVA = TempDebugEntryRva;\r
+      switch (*(UINT32 *) ImageContext->CodeView) {\r
+      case CODEVIEW_SIGNATURE_NB10:\r
+        if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY)) {\r
+          ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+          return RETURN_UNSUPPORTED;\r
         }\r
+        ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
+        break;\r
 \r
-        switch (*(UINT32 *) ImageContext->CodeView) {\r
-        case CODEVIEW_SIGNATURE_NB10:\r
-          if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY)) {\r
-            ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
-            return RETURN_UNSUPPORTED;\r
-          }\r
-          ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY);\r
-          break;\r
-\r
-        case CODEVIEW_SIGNATURE_RSDS:\r
-          if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY)) {\r
-            ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
-            return RETURN_UNSUPPORTED;\r
-          }\r
-          ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
-          break;\r
-\r
-        case CODEVIEW_SIGNATURE_MTOC:\r
-          if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY)) {\r
-            ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
-            return RETURN_UNSUPPORTED;\r
-          }\r
-          ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY);\r
-          break;\r
+      case CODEVIEW_SIGNATURE_RSDS:\r
+        if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY)) {\r
+          ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+          return RETURN_UNSUPPORTED;\r
+        }\r
+        ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY);\r
+        break;\r
 \r
-        default:\r
-          break;\r
+      case CODEVIEW_SIGNATURE_MTOC:\r
+        if (DebugEntry->SizeOfData < sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY)) {\r
+          ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;\r
+          return RETURN_UNSUPPORTED;\r
         }\r
+        ImageContext->PdbPointer = (CHAR8 *)ImageContext->CodeView + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY);\r
+        break;\r
+\r
+      default:\r
+        break;\r
       }\r
     }\r
   }\r
@@ -1536,7 +1539,7 @@ PeCoffLoaderLoadImage (
     }\r
 \r
     if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE && DirectoryEntry->Size != 0) {\r
-      Base = PeCoffLoaderImageAddress (ImageContext, DirectoryEntry->VirtualAddress);\r
+      Base = PeCoffLoaderImageAddress (ImageContext, DirectoryEntry->VirtualAddress, 0);\r
       if (Base != NULL) {\r
         ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) Base;\r
         Offset = sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) * \r
@@ -1611,7 +1614,7 @@ PeCoffLoaderLoadImage (
                   return RETURN_UNSUPPORTED;\r
                 }\r
                 ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (Base + ResourceDirectoryEntry->u2.OffsetToData);\r
-                ImageContext->HiiResourceData = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData);\r
+                ImageContext->HiiResourceData = (PHYSICAL_ADDRESS) (UINTN) PeCoffLoaderImageAddress (ImageContext, ResourceDataEntry->OffsetToData, 0);\r
                 break;\r
               }\r
             }\r
index 358ec27fd0fbd8468533c9f862dd5445fc702e94..0851acc18c1931e505405c9651d34644343b23b3 100644 (file)
@@ -116,8 +116,9 @@ PeCoffLoaderGetPeHeader (
 /**\r
   Converts an image address to the loaded address.\r
 \r
-  @param  ImageContext  The context of the image being loaded.\r
-  @param  Address       The address to be converted to the loaded address.\r
+  @param  ImageContext      The context of the image being loaded.\r
+  @param  Address           The address to be converted to the loaded address.\r
+  @param  TeStrippedOffset  Stripped offset for TE image.\r
 \r
   @return The converted address or NULL if the address can not be converted.\r
 \r
@@ -125,7 +126,8 @@ PeCoffLoaderGetPeHeader (
 VOID *\r
 PeCoffLoaderImageAddress (\r
   IN OUT PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,\r
-  IN     UINTN                                 Address\r
+  IN     UINTN                                 Address,\r
+  IN     UINTN                                 TeStrippedOffset\r
   );\r
 \r
 #endif\r