39 UINT32 TeStrippedOffset
42 SectionHeader->VirtualAddress -= TeStrippedOffset;
43 SectionHeader->PointerToRawData -= TeStrippedOffset;
71 UINT32 SectionHeaderOffset;
73 UINT32 HeaderWithoutDataDir;
75 UINTN NumberOfSections;
83 Status = ImageContext->ImageRead (
90 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
91 if (Size != ReadSize) {
98 ImageContext->PeCoffHeaderOffset = 0;
99 if (DosHdr.
e_magic == EFI_IMAGE_DOS_SIGNATURE) {
104 ImageContext->PeCoffHeaderOffset = DosHdr.
e_lfanew;
115 Status = ImageContext->ImageRead (
116 ImageContext->Handle,
117 ImageContext->PeCoffHeaderOffset,
122 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
123 if (Size != ReadSize) {
133 if (Hdr.Te->Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {
134 ImageContext->IsTeImage =
TRUE;
135 ImageContext->Machine = Hdr.Te->Machine;
136 ImageContext->ImageType = (UINT16)(Hdr.Te->Subsystem);
141 ImageContext->ImageSize = 0;
142 ImageContext->SectionAlignment = 0;
149 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
156 if (Hdr.Te->BaseOfCode <= Hdr.Te->StrippedSize) {
157 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
166 Status = ImageContext->ImageRead (
167 ImageContext->Handle,
168 ImageContext->SizeOfHeaders - 1,
173 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
174 if (Size != ReadSize) {
185 if (((Hdr.Te->DataDirectory[0].Size != 0) && (Hdr.Te->DataDirectory[0].VirtualAddress == 0)) ||
186 ((Hdr.Te->DataDirectory[1].Size != 0) && (Hdr.Te->DataDirectory[1].VirtualAddress == 0)))
188 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
191 }
else if (Hdr.Pe32->Signature == EFI_IMAGE_NT_SIGNATURE) {
192 ImageContext->IsTeImage =
FALSE;
193 ImageContext->Machine = Hdr.Pe32->FileHeader.Machine;
199 if (EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES < Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes) {
200 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
210 if (((UINT32)Hdr.Pe32->FileHeader.SizeOfOptionalHeader - HeaderWithoutDataDir) !=
213 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
217 SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +
sizeof (UINT32) +
sizeof (
EFI_IMAGE_FILE_HEADER) + Hdr.Pe32->FileHeader.SizeOfOptionalHeader;
221 if (Hdr.Pe32->OptionalHeader.SizeOfImage <= SectionHeaderOffset) {
222 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
227 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
234 if (Hdr.Pe32->OptionalHeader.SizeOfHeaders <= SectionHeaderOffset) {
235 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
239 if (Hdr.Pe32->OptionalHeader.SizeOfHeaders >= Hdr.Pe32->OptionalHeader.SizeOfImage) {
240 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
244 if ((Hdr.Pe32->OptionalHeader.SizeOfHeaders - SectionHeaderOffset) /
EFI_IMAGE_SIZEOF_SECTION_HEADER < (UINT32)Hdr.Pe32->FileHeader.NumberOfSections) {
245 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
254 Status = ImageContext->ImageRead (
255 ImageContext->Handle,
256 Hdr.Pe32->OptionalHeader.SizeOfHeaders - 1,
261 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
262 if (Size != ReadSize) {
274 if (EFI_IMAGE_DIRECTORY_ENTRY_SECURITY < Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes) {
275 if (Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size != 0) {
279 if ((UINT32)(~0) - Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress <
280 Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size)
282 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
291 Status = ImageContext->ImageRead (
292 ImageContext->Handle,
293 Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress +
294 Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size - 1,
299 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
300 if (Size != ReadSize) {
312 ImageContext->ImageType = Hdr.Pe32->OptionalHeader.Subsystem;
313 ImageContext->ImageSize = (UINT64)Hdr.Pe32->OptionalHeader.SizeOfImage;
314 ImageContext->SectionAlignment = Hdr.Pe32->OptionalHeader.SectionAlignment;
315 ImageContext->SizeOfHeaders = Hdr.Pe32->OptionalHeader.SizeOfHeaders;
316 ImageContext->DllCharacteristics = Hdr.Pe32->OptionalHeader.DllCharacteristics;
321 if (EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES < Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes) {
322 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
332 if (((UINT32)Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader - HeaderWithoutDataDir) !=
335 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
339 SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +
sizeof (UINT32) +
sizeof (
EFI_IMAGE_FILE_HEADER) + Hdr.Pe32Plus->FileHeader.SizeOfOptionalHeader;
343 if (Hdr.Pe32Plus->OptionalHeader.SizeOfImage <= SectionHeaderOffset) {
344 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
349 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
356 if (Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders <= SectionHeaderOffset) {
357 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
361 if (Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders >= Hdr.Pe32Plus->OptionalHeader.SizeOfImage) {
362 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
366 if ((Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders - SectionHeaderOffset) /
EFI_IMAGE_SIZEOF_SECTION_HEADER < (UINT32)Hdr.Pe32Plus->FileHeader.NumberOfSections) {
367 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
376 Status = ImageContext->ImageRead (
377 ImageContext->Handle,
378 Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders - 1,
383 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
384 if (Size != ReadSize) {
396 if (EFI_IMAGE_DIRECTORY_ENTRY_SECURITY < Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes) {
397 if (Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size != 0) {
401 if ((UINT32)(~0) - Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress <
402 Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size)
404 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
413 Status = ImageContext->ImageRead (
414 ImageContext->Handle,
415 Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress +
416 Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size - 1,
421 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
422 if (Size != ReadSize) {
434 ImageContext->ImageType = Hdr.Pe32Plus->OptionalHeader.Subsystem;
435 ImageContext->ImageSize = (UINT64)Hdr.Pe32Plus->OptionalHeader.SizeOfImage;
436 ImageContext->SectionAlignment = Hdr.Pe32Plus->OptionalHeader.SectionAlignment;
437 ImageContext->SizeOfHeaders = Hdr.Pe32Plus->OptionalHeader.SizeOfHeaders;
438 ImageContext->DllCharacteristics = Hdr.Pe32Plus->OptionalHeader.DllCharacteristics;
440 ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;
444 ImageContext->ImageError = IMAGE_ERROR_INVALID_MACHINE_TYPE;
461 if (ImageContext->IsTeImage) {
463 NumberOfSections = (
UINTN)(Hdr.Te->NumberOfSections);
465 SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +
sizeof (UINT32) +
sizeof (
EFI_IMAGE_FILE_HEADER) + Hdr.Pe32->FileHeader.SizeOfOptionalHeader;
466 NumberOfSections = (
UINTN)(Hdr.Pe32->FileHeader.NumberOfSections);
469 for (Index = 0; Index < NumberOfSections; Index++) {
475 Status = ImageContext->ImageRead (
476 ImageContext->Handle,
482 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
483 if (Size != ReadSize) {
493 if (ImageContext->IsTeImage) {
497 if (SectionHeader.SizeOfRawData > 0) {
501 if ((SectionHeader.VirtualAddress < ImageContext->SizeOfHeaders) ||
502 (SectionHeader.PointerToRawData < ImageContext->SizeOfHeaders))
504 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
511 if ((UINT32)(~0) - SectionHeader.PointerToRawData < SectionHeader.SizeOfRawData) {
512 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
522 Status = ImageContext->ImageRead (
523 ImageContext->Handle,
524 SectionHeader.PointerToRawData + SectionHeader.SizeOfRawData - 1,
529 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
530 if (Size != ReadSize) {
582 RETURN_STATUS Status;
590 UINTN DebugDirectoryEntryRva;
591 UINTN DebugDirectoryEntryFileOffset;
592 UINTN SectionHeaderOffset;
595 UINT32 NumberOfRvaAndSizes;
596 UINT32 TeStrippedOffset;
598 if (ImageContext ==
NULL) {
605 ImageContext->ImageError = IMAGE_ERROR_SUCCESS;
607 Hdr.Union = &HdrData;
616 if (!(ImageContext->IsTeImage)) {
617 TeStrippedOffset = 0;
622 ImageContext->ImageAddress = Hdr.Pe32->OptionalHeader.
ImageBase;
627 ImageContext->ImageAddress = Hdr.Pe32Plus->OptionalHeader.
ImageBase;
631 ImageContext->ImageAddress = (PHYSICAL_ADDRESS)(Hdr.Te->
ImageBase + TeStrippedOffset);
638 ImageContext->DestinationAddress = 0;
643 ImageContext->DebugDirectoryEntryRva = 0;
644 ImageContext->CodeView =
NULL;
645 ImageContext->PdbPointer =
NULL;
659 ImageContext->RelocationsStripped =
TRUE;
660 }
else if ((ImageContext->IsTeImage) && (Hdr.Te->
DataDirectory[0].Size == 0) && (Hdr.Te->
DataDirectory[0].VirtualAddress == 0)) {
661 ImageContext->RelocationsStripped =
TRUE;
663 ImageContext->RelocationsStripped =
FALSE;
666 if (!(ImageContext->IsTeImage)) {
671 NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
672 DebugDirectoryEntry = (
EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);
677 NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
678 DebugDirectoryEntry = (
EFI_IMAGE_DATA_DIRECTORY *)&(Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG]);
681 if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG) {
682 DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;
689 DebugDirectoryEntryFileOffset = 0;
691 SectionHeaderOffset = ImageContext->PeCoffHeaderOffset +
694 Hdr.Pe32->FileHeader.SizeOfOptionalHeader;
696 for (Index = 0; Index < Hdr.Pe32->FileHeader.NumberOfSections; Index++) {
702 Status = ImageContext->ImageRead (
703 ImageContext->Handle,
709 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
710 if (Size != ReadSize) {
717 if ((DebugDirectoryEntryRva >= SectionHeader.VirtualAddress) &&
718 (DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize))
720 DebugDirectoryEntryFileOffset = DebugDirectoryEntryRva - SectionHeader.VirtualAddress + SectionHeader.PointerToRawData;
727 if (DebugDirectoryEntryFileOffset != 0) {
734 Status = ImageContext->ImageRead (
735 ImageContext->Handle,
736 DebugDirectoryEntryFileOffset + Index,
741 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
742 if (Size != ReadSize) {
755 ImageContext->DebugDirectoryEntryRva = (UINT32)(DebugDirectoryEntryRva + Index);
757 ImageContext->ImageSize += DebugEntry.SizeOfData;
768 if ((NextIndex < DebugDirectoryEntry->Size) &&
769 (DebugEntry.
FileOffset == (DebugDirectoryEntryFileOffset + NextIndex)))
777 if (DebugEntry.Type == EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS) {
780 Status = ImageContext->ImageRead (
781 ImageContext->Handle,
784 &ImageContext->DllCharacteristicsEx
787 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
788 if (Size != ReadSize) {
802 DebugDirectoryEntryRva = DebugDirectoryEntry->VirtualAddress;
805 DebugDirectoryEntryFileOffset = 0;
813 Status = ImageContext->ImageRead (
814 ImageContext->Handle,
820 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
821 if (Size != ReadSize) {
828 if ((DebugDirectoryEntryRva >= SectionHeader.VirtualAddress) &&
829 (DebugDirectoryEntryRva < SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize))
831 DebugDirectoryEntryFileOffset = DebugDirectoryEntryRva -
832 SectionHeader.VirtualAddress +
833 SectionHeader.PointerToRawData -
858 ImageContext->ImageSize = (SectionHeader.VirtualAddress + SectionHeader.Misc.VirtualSize) - TeStrippedOffset;
864 if (DebugDirectoryEntryFileOffset != 0) {
871 Status = ImageContext->ImageRead (
872 ImageContext->Handle,
873 DebugDirectoryEntryFileOffset + Index,
878 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
879 if (Size != ReadSize) {
887 ImageContext->DebugDirectoryEntryRva = (UINT32)(DebugDirectoryEntryRva + Index);
917 if (Address >= ImageContext->ImageSize + TeStrippedOffset) {
918 ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_ADDRESS;
922 return (CHAR8 *)((
UINTN)ImageContext->ImageAddress + Address - TeStrippedOffset);
961 RETURN_STATUS Status;
976 PHYSICAL_ADDRESS BaseAddress;
977 UINT32 NumberOfRvaAndSizes;
978 UINT32 TeStrippedOffset;
981 ASSERT (ImageContext !=
NULL);
986 ImageContext->ImageError = IMAGE_ERROR_SUCCESS;
991 if (ImageContext->RelocationsStripped) {
1002 if (ImageContext->DestinationAddress != 0) {
1003 BaseAddress = ImageContext->DestinationAddress;
1005 BaseAddress = ImageContext->ImageAddress;
1008 if (!(ImageContext->IsTeImage)) {
1010 TeStrippedOffset = 0;
1016 Adjust = (UINT64)BaseAddress - Hdr.Pe32->OptionalHeader.
ImageBase;
1018 Hdr.Pe32->OptionalHeader.
ImageBase = (UINT32)BaseAddress;
1021 NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
1022 RelocDir = &Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
1027 Adjust = (UINT64)BaseAddress - Hdr.Pe32Plus->OptionalHeader.
ImageBase;
1029 Hdr.Pe32Plus->OptionalHeader.
ImageBase = (UINT64)BaseAddress;
1032 NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
1033 RelocDir = &Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
1042 if ((NumberOfRvaAndSizes < EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC)) {
1048 Adjust = (UINT64)(BaseAddress - (Hdr.Te->
ImageBase + TeStrippedOffset));
1050 Hdr.Te->
ImageBase = (UINT64)(BaseAddress - TeStrippedOffset);
1060 RelocBaseEnd =
NULL;
1061 if ((RelocDir !=
NULL) && (RelocDir->Size > 0)) {
1062 Status =
SafeUint32Add (RelocDir->VirtualAddress, (RelocDir->Size - 1), &EndAddress);
1072 if ((RelocBase ==
NULL) || (RelocBaseEnd ==
NULL) || ((
UINTN)RelocBaseEnd < (
UINTN)RelocBase)) {
1073 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1074 DEBUG ((DEBUG_ERROR,
"Relocation block is not valid\n"));
1079 RelocBaseOrg = RelocBase;
1088 FixupData = ImageContext->FixupData;
1089 while ((
UINTN)RelocBase < (
UINTN)RelocBaseEnd) {
1094 if (RelocBase->SizeOfBlock == 0) {
1095 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1100 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1104 RelocEnd = (UINT16 *)((CHAR8 *)RelocBase + RelocBase->SizeOfBlock);
1105 if ((
UINTN)RelocEnd > (
UINTN)RelocBaseOrg + RelocDir->Size) {
1106 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1111 if (FixupBase ==
NULL) {
1112 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1121 if (Fixup ==
NULL) {
1122 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1126 switch ((*Reloc) >> 12) {
1127 case EFI_IMAGE_REL_BASED_ABSOLUTE:
1130 case EFI_IMAGE_REL_BASED_HIGH:
1131 Fixup16 = (UINT16 *)Fixup;
1132 *Fixup16 = (UINT16)(*Fixup16 + ((UINT16)((UINT32)Adjust >> 16)));
1133 if (FixupData !=
NULL) {
1134 *(UINT16 *)FixupData = *Fixup16;
1135 FixupData = FixupData +
sizeof (UINT16);
1140 case EFI_IMAGE_REL_BASED_LOW:
1141 Fixup16 = (UINT16 *)Fixup;
1142 *Fixup16 = (UINT16)(*Fixup16 + (UINT16)Adjust);
1143 if (FixupData !=
NULL) {
1144 *(UINT16 *)FixupData = *Fixup16;
1145 FixupData = FixupData +
sizeof (UINT16);
1150 case EFI_IMAGE_REL_BASED_HIGHLOW:
1151 Fixup32 = (UINT32 *)Fixup;
1152 *Fixup32 = *Fixup32 + (UINT32)Adjust;
1153 if (FixupData !=
NULL) {
1155 *(UINT32 *)FixupData = *Fixup32;
1156 FixupData = FixupData +
sizeof (UINT32);
1161 case EFI_IMAGE_REL_BASED_DIR64:
1162 Fixup64 = (UINT64 *)Fixup;
1163 *Fixup64 = *Fixup64 + (UINT64)Adjust;
1164 if (FixupData !=
NULL) {
1166 *(UINT64 *)(FixupData) = *Fixup64;
1167 FixupData = FixupData +
sizeof (UINT64);
1180 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1197 ASSERT ((
UINTN)FixupData <= (
UINTN)ImageContext->FixupData + ImageContext->FixupDataSize);
1202 if (ImageContext->DestinationAddress != 0) {
1203 ImageContext->EntryPoint -= (UINT64)ImageContext->ImageAddress;
1204 ImageContext->EntryPoint += (UINT64)ImageContext->DestinationAddress;
1252 RETURN_STATUS Status;
1257 UINTN NumberOfSections;
1264 UINT32 TempDebugEntryRva;
1265 UINT32 NumberOfRvaAndSizes;
1272 UINT32 TeStrippedOffset;
1274 ASSERT (ImageContext !=
NULL);
1279 ImageContext->ImageError = IMAGE_ERROR_SUCCESS;
1296 if (ImageContext->ImageSize < CheckContext.
ImageSize) {
1297 ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_SIZE;
1301 if (ImageContext->ImageAddress == 0) {
1305 ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_ADDRESS;
1318 if (CheckContext.
ImageType == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) {
1319 ImageContext->ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM;
1327 if (CheckContext.
ImageAddress != ImageContext->ImageAddress) {
1328 ImageContext->ImageError = IMAGE_ERROR_INVALID_IMAGE_ADDRESS;
1336 if (!(ImageContext->IsTeImage)) {
1337 if ((ImageContext->ImageAddress & (CheckContext.
SectionAlignment - 1)) != 0) {
1338 ImageContext->ImageError = IMAGE_ERROR_INVALID_SECTION_ALIGNMENT;
1346 if (!(ImageContext->IsTeImage)) {
1347 Status = ImageContext->ImageRead (
1348 ImageContext->Handle,
1350 &ImageContext->SizeOfHeaders,
1351 (
VOID *)(
UINTN)ImageContext->ImageAddress
1357 (
UINTN)ImageContext->ImageAddress +
1358 ImageContext->PeCoffHeaderOffset +
1361 Hdr.Pe32->FileHeader.SizeOfOptionalHeader
1363 NumberOfSections = (
UINTN)(Hdr.Pe32->FileHeader.NumberOfSections);
1364 TeStrippedOffset = 0;
1366 Status = ImageContext->ImageRead (
1367 ImageContext->Handle,
1369 &ImageContext->SizeOfHeaders,
1370 (
void *)(
UINTN)ImageContext->ImageAddress
1375 (
UINTN)ImageContext->ImageAddress +
1383 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
1390 Section = FirstSection;
1391 for (Index = 0; Index < NumberOfSections; Index++) {
1395 Size = (
UINTN)Section->Misc.VirtualSize;
1396 if ((Size == 0) || (Size > Section->SizeOfRawData)) {
1397 Size = (
UINTN)Section->SizeOfRawData;
1404 End =
PeCoffLoaderImageAddress (ImageContext, Section->VirtualAddress + Section->Misc.VirtualSize - 1, TeStrippedOffset);
1409 if ((Size > 0) && ((Base ==
NULL) || (End ==
NULL))) {
1410 ImageContext->ImageError = IMAGE_ERROR_SECTION_NOT_LOADED;
1414 if ((Section->SizeOfRawData > 0) && (Base !=
NULL)) {
1415 Status = ImageContext->ImageRead (
1416 ImageContext->Handle,
1417 Section->PointerToRawData - TeStrippedOffset,
1422 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
1431 if ((Size < Section->Misc.VirtualSize) && (Base !=
NULL)) {
1432 ZeroMem (Base + Size, Section->Misc.VirtualSize - Size);
1444 if (!(ImageContext->IsTeImage)) {
1454 (
UINTN)Hdr.Pe32->OptionalHeader.AddressOfEntryPoint,
1463 (
UINTN)Hdr.Pe32Plus->OptionalHeader.AddressOfEntryPoint,
1482 if (!(ImageContext->IsTeImage)) {
1487 NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
1488 DirectoryEntry = (
EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
1493 NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
1494 DirectoryEntry = (
EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC];
1500 if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {
1501 ImageContext->FixupDataSize = DirectoryEntry->Size /
sizeof (UINT16) *
sizeof (UINT64);
1503 ImageContext->FixupDataSize = 0;
1507 ImageContext->FixupDataSize = DirectoryEntry->Size /
sizeof (UINT16) *
sizeof (UINT64);
1514 ImageContext->FixupData =
NULL;
1519 if (ImageContext->DebugDirectoryEntryRva != 0) {
1522 ImageContext->DebugDirectoryEntryRva,
1525 if (DebugEntry ==
NULL) {
1526 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1530 TempDebugEntryRva = DebugEntry->
RVA;
1531 if ((DebugEntry->
RVA == 0) && (DebugEntry->
FileOffset != 0)) {
1533 if ((
UINTN)Section->SizeOfRawData < Section->Misc.VirtualSize) {
1534 TempDebugEntryRva = Section->VirtualAddress + Section->Misc.VirtualSize;
1536 TempDebugEntryRva = Section->VirtualAddress + Section->SizeOfRawData;
1540 if (TempDebugEntryRva != 0) {
1542 if (ImageContext->CodeView ==
NULL) {
1543 ImageContext->ImageError = IMAGE_ERROR_FAILED_RELOCATION;
1547 if (DebugEntry->
RVA == 0) {
1548 Size = DebugEntry->SizeOfData;
1549 Status = ImageContext->ImageRead (
1550 ImageContext->Handle,
1553 ImageContext->CodeView
1562 ImageContext->ImageError = IMAGE_ERROR_IMAGE_READ;
1566 DebugEntry->
RVA = TempDebugEntryRva;
1569 switch (*(UINT32 *)ImageContext->CodeView) {
1572 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1581 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1590 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1606 ImageContext->HiiResourceData = 0;
1607 if (!(ImageContext->IsTeImage)) {
1612 NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
1613 DirectoryEntry = (
EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];
1618 NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
1619 DirectoryEntry = (
EFI_IMAGE_DATA_DIRECTORY *)&Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE];
1622 if ((NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE) && (DirectoryEntry->Size != 0)) {
1627 (ResourceDirectory->NumberOfNamedEntries + ResourceDirectory->NumberOfIdEntries);
1628 if (Offset > DirectoryEntry->Size) {
1629 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1635 for (Index = 0; Index < ResourceDirectory->NumberOfNamedEntries; Index++) {
1636 if (ResourceDirectoryEntry->u1.s.NameIsString) {
1640 if (ResourceDirectoryEntry->u1.s.NameOffset >= DirectoryEntry->Size) {
1641 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1646 String = &ResourceDirectoryString->String[0];
1648 if ((ResourceDirectoryString->Length == 3) &&
1649 (String[0] == L
'H') &&
1650 (String[1] == L
'I') &&
1651 (String[2] == L
'I'))
1656 if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
1660 if (ResourceDirectoryEntry->u2.s.OffsetToDirectory >= DirectoryEntry->Size) {
1661 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1668 if (Offset > DirectoryEntry->Size) {
1669 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1675 if (ResourceDirectoryEntry->u2.s.DataIsDirectory) {
1679 if (ResourceDirectoryEntry->u2.s.OffsetToDirectory >= DirectoryEntry->Size) {
1680 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1687 if (Offset > DirectoryEntry->Size) {
1688 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1699 if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) {
1700 if (ResourceDirectoryEntry->u2.OffsetToData >= DirectoryEntry->Size) {
1701 ImageContext->ImageError = IMAGE_ERROR_UNSUPPORTED;
1712 ResourceDirectoryEntry++;
1747 IN PHYSICAL_ADDRESS ImageBase,
1748 IN PHYSICAL_ADDRESS VirtImageBase,
1757 UINT32 NumberOfRvaAndSizes;
1772 RETURN_STATUS Status;
1776 if ((RelocationData ==
NULL) || (ImageBase == 0x0) || (VirtImageBase == 0x0)) {
1780 OldBase = (CHAR8 *)((
UINTN)ImageBase);
1781 NewBase = (CHAR8 *)((
UINTN)VirtImageBase);
1791 if (DosHdr->
e_magic == EFI_IMAGE_DOS_SIGNATURE) {
1803 if (Hdr.Pe32->Signature != EFI_IMAGE_NT_SIGNATURE) {
1814 NumberOfRvaAndSizes = Hdr.Pe32->OptionalHeader.NumberOfRvaAndSizes;
1820 NumberOfRvaAndSizes = Hdr.Pe32Plus->OptionalHeader.NumberOfRvaAndSizes;
1832 RelocBaseEnd =
NULL;
1833 if (NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC) {
1834 RelocDir = DataDirectory + EFI_IMAGE_DIRECTORY_ENTRY_BASERELOC;
1835 if ((RelocDir !=
NULL) && (RelocDir->Size > 0)) {
1836 Status =
SafeUint32Add (RelocDir->VirtualAddress, (RelocDir->Size - 1), &EndAddress);
1847 if ((RelocBase ==
NULL) || (RelocBaseEnd ==
NULL) || ((
UINTN)RelocBaseEnd < (
UINTN)RelocBase)) {
1864 ASSERT (RelocBase !=
NULL && RelocBaseEnd !=
NULL);
1874 FixupData = RelocationData;
1875 RelocBaseOrig = RelocBase;
1876 while ((
UINTN)RelocBase < (
UINTN)RelocBaseEnd) {
1880 if ((RelocBase->SizeOfBlock == 0) || (RelocBase->SizeOfBlock > RelocDir->Size)) {
1888 RelocEnd = (UINT16 *)((UINT8 *)RelocBase + RelocBase->SizeOfBlock);
1889 if ((
UINTN)RelocEnd > (
UINTN)RelocBaseOrig + RelocDir->Size) {
1894 if (FixupBase ==
NULL) {
1903 if (Fixup ==
NULL) {
1907 switch ((*Reloc) >> 12) {
1908 case EFI_IMAGE_REL_BASED_ABSOLUTE:
1911 case EFI_IMAGE_REL_BASED_HIGH:
1912 Fixup16 = (UINT16 *)Fixup;
1913 if (*(UINT16 *)FixupData == *Fixup16) {
1914 *Fixup16 = (UINT16)(*Fixup16 + ((UINT16)((UINT32)Adjust >> 16)));
1917 FixupData = FixupData +
sizeof (UINT16);
1920 case EFI_IMAGE_REL_BASED_LOW:
1921 Fixup16 = (UINT16 *)Fixup;
1922 if (*(UINT16 *)FixupData == *Fixup16) {
1923 *Fixup16 = (UINT16)(*Fixup16 + ((UINT16)Adjust & 0xffff));
1926 FixupData = FixupData +
sizeof (UINT16);
1929 case EFI_IMAGE_REL_BASED_HIGHLOW:
1930 Fixup32 = (UINT32 *)Fixup;
1932 if (*(UINT32 *)FixupData == *Fixup32) {
1933 *Fixup32 = *Fixup32 + (UINT32)Adjust;
1936 FixupData = FixupData +
sizeof (UINT32);
1939 case EFI_IMAGE_REL_BASED_DIR64:
1940 Fixup64 = (UINT64 *)Fixup;
1942 if (*(UINT64 *)FixupData == *Fixup64) {
1943 *Fixup64 = *Fixup64 + (UINT64)Adjust;
1946 FixupData = FixupData +
sizeof (UINT64);
2007 ASSERT (ReadSize !=
NULL);
2008 ASSERT (FileHandle !=
NULL);
2009 ASSERT (Buffer !=
NULL);
2011 CopyMem (Buffer, ((UINT8 *)FileHandle) + FileOffset, *ReadSize);
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
RETURN_STATUS EFIAPI PeCoffLoaderLoadImage(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
RETURN_STATUS EFIAPI PeCoffLoaderRelocateImage(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
VOID EFIAPI PeCoffLoaderRelocateImageForRuntime(IN PHYSICAL_ADDRESS ImageBase, IN PHYSICAL_ADDRESS VirtImageBase, IN UINTN ImageSize, IN VOID *RelocationData)
VOID PeCoffLoaderAdjustOffsetForTeImage(EFI_IMAGE_SECTION_HEADER *SectionHeader, UINT32 TeStrippedOffset)
RETURN_STATUS EFIAPI PeCoffLoaderUnloadImage(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
VOID * PeCoffLoaderImageAddress(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, IN UINTN Address, IN UINTN TeStrippedOffset)
RETURN_STATUS PeCoffLoaderGetPeHeader(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext, OUT EFI_IMAGE_OPTIONAL_HEADER_PTR_UNION Hdr)
RETURN_STATUS EFIAPI PeCoffLoaderGetImageInfo(IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
RETURN_STATUS EFIAPI PeCoffLoaderImageReadFromMemory(IN VOID *FileHandle, IN UINTN FileOffset, IN OUT UINTN *ReadSize, OUT VOID *Buffer)
RETURN_STATUS PeHotRelocateImageEx(IN UINT16 *Reloc, IN OUT CHAR8 *Fixup, IN OUT CHAR8 **FixupData, IN UINT64 Adjust)
RETURN_STATUS PeCoffLoaderRelocateImageEx(IN UINT16 *Reloc, IN OUT CHAR8 *Fixup, IN OUT CHAR8 **FixupData, IN UINT64 Adjust)
BOOLEAN PeCoffLoaderImageFormatSupported(IN UINT16 Machine)
#define RETURN_LOAD_ERROR
#define RETURN_BUFFER_TOO_SMALL
#define RETURN_ERROR(StatusCode)
#define RETURN_UNSUPPORTED
#define ALIGN_POINTER(Pointer, Alignment)
#define RETURN_INVALID_PARAMETER
#define DEBUG(Expression)
#define CODEVIEW_SIGNATURE_NB10
#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW
The Visual C++ debug information.
#define CODEVIEW_SIGNATURE_RSDS
#define EFI_IMAGE_SIZEOF_SECTION_HEADER
#define EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC
#define EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC
#define EFI_IMAGE_FILE_RELOCS_STRIPPED
0x0001 Relocation info stripped from file.
#define CODEVIEW_SIGNATURE_MTOC
RETURN_STATUS EFIAPI SafeUint32Add(IN UINT32 Augend, IN UINT32 Addend, OUT UINT32 *Result)
UINT32 FileOffset
The file pointer to the debug data.
UINT32 RVA
The address of the debug data when loaded, relative to the image base.
UINT32 e_lfanew
File address of new exe header.
UINT16 e_magic
Magic number.
UINT32 AddressOfEntryPoint
Offset to entry point – from original optional header.
UINT64 ImageBase
From original file header.
EFI_IMAGE_DATA_DIRECTORY DataDirectory[2]
Only base relocation and debug directory.
UINT16 StrippedSize
Number of bytes we removed from the header.
UINT8 NumberOfSections
From the original file header.
BOOLEAN RelocationsStripped
PHYSICAL_ADDRESS ImageAddress