+ PeHdr->FileHeader.TimeDateStamp = (UINT32) TimeStamp;\r
+ }\r
+\r
+ if (PeHdr->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->OptionalHeader;\r
+ Optional32->MajorLinkerVersion = 0;\r
+ Optional32->MinorLinkerVersion = 0;\r
+ Optional32->MajorOperatingSystemVersion = 0;\r
+ Optional32->MinorOperatingSystemVersion = 0;\r
+ Optional32->MajorImageVersion = 0;\r
+ Optional32->MinorImageVersion = 0;\r
+ Optional32->MajorSubsystemVersion = 0;\r
+ Optional32->MinorSubsystemVersion = 0;\r
+ Optional32->Win32VersionValue = 0;\r
+ Optional32->CheckSum = 0;\r
+ Optional32->SizeOfStackReserve = 0;\r
+ Optional32->SizeOfStackCommit = 0;\r
+ Optional32->SizeOfHeapReserve = 0;\r
+ Optional32->SizeOfHeapCommit = 0;\r
+\r
+ //\r
+ // Strip zero padding at the end of the .reloc section \r
+ //\r
+ if (Optional32->NumberOfRvaAndSizes >= 6) {\r
+ if (Optional32->DataDirectory[5].Size != 0) {\r
+ SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
+ for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
+ //\r
+ // Look for the Section Header that starts as the same virtual address as the Base Relocation Data Directory\r
+ //\r
+ if (SectionHeader->VirtualAddress == Optional32->DataDirectory[5].VirtualAddress) {\r
+ SectionHeader->Misc.VirtualSize = Optional32->DataDirectory[5].Size;\r
+ AllignedRelocSize = (Optional32->DataDirectory[5].Size + Optional32->FileAlignment - 1) & (~(Optional32->FileAlignment - 1));\r
+ //\r
+ // Check to see if there is zero padding at the end of the base relocations\r
+ //\r
+ if (AllignedRelocSize < SectionHeader->SizeOfRawData) {\r
+ //\r
+ // Check to see if the base relocations are at the end of the file\r
+ //\r
+ if (SectionHeader->PointerToRawData + SectionHeader->SizeOfRawData == Optional32->SizeOfImage) {\r
+ //\r
+ // All the required conditions are met to strip the zero padding of the end of the base relocations section\r
+ //\r
+ Optional32->SizeOfImage -= (SectionHeader->SizeOfRawData - AllignedRelocSize);\r
+ Optional32->SizeOfInitializedData -= (SectionHeader->SizeOfRawData - AllignedRelocSize);\r
+ SectionHeader->SizeOfRawData = AllignedRelocSize;\r
+ FileLength = Optional32->SizeOfImage;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ } \r
+ if (PeHdr->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
+ Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->OptionalHeader;\r
+ Optional64->MajorLinkerVersion = 0;\r
+ Optional64->MinorLinkerVersion = 0;\r
+ Optional64->MajorOperatingSystemVersion = 0;\r
+ Optional64->MinorOperatingSystemVersion = 0;\r
+ Optional64->MajorImageVersion = 0;\r
+ Optional64->MinorImageVersion = 0;\r
+ Optional64->MajorSubsystemVersion = 0;\r
+ Optional64->MinorSubsystemVersion = 0;\r
+ Optional64->Win32VersionValue = 0;\r
+ Optional64->CheckSum = 0;\r
+ Optional64->SizeOfStackReserve = 0;\r
+ Optional64->SizeOfStackCommit = 0;\r
+ Optional64->SizeOfHeapReserve = 0;\r
+ Optional64->SizeOfHeapCommit = 0;\r
+\r
+ //\r
+ // Zero the .pdata section if the machine type is X64 and the Debug Directory is empty\r
+ //\r
+ if (PeHdr->FileHeader.Machine == 0x8664) { // X64\r
+ if (Optional64->NumberOfRvaAndSizes >= 4) {\r
+ if (Optional64->NumberOfRvaAndSizes < 7 || (Optional64->NumberOfRvaAndSizes >= 7 && Optional64->DataDirectory[6].Size == 0)) {\r
+ SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
+ for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
+ if (SectionHeader->VirtualAddress == Optional64->DataDirectory[3].VirtualAddress) {\r
+ RuntimeFunction = (RUNTIME_FUNCTION *)(FileBuffer + SectionHeader->PointerToRawData);\r
+ for (Index1 = 0; Index1 < Optional64->DataDirectory[3].Size / sizeof (RUNTIME_FUNCTION); Index1++, RuntimeFunction++) {\r
+ SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
+ for (Index2 = 0; Index2 < PeHdr->FileHeader.NumberOfSections; Index2++, SectionHeader++) {\r
+ if (RuntimeFunction->UnwindInfoAddress > SectionHeader->VirtualAddress && RuntimeFunction->UnwindInfoAddress < (SectionHeader->VirtualAddress + SectionHeader->SizeOfRawData)) {\r
+ UnwindInfo = (UNWIND_INFO *)(FileBuffer + SectionHeader->PointerToRawData + (RuntimeFunction->UnwindInfoAddress - SectionHeader->VirtualAddress));\r
+ if (UnwindInfo->Version == 1) {\r
+ memset (UnwindInfo + 1, 0, UnwindInfo->CountOfUnwindCodes * sizeof (UINT16));\r
+ memset (UnwindInfo, 0, sizeof (UNWIND_INFO));\r
+ }\r
+ }\r
+ }\r
+ memset (RuntimeFunction, 0, sizeof (RUNTIME_FUNCTION));\r
+ }\r
+ }\r
+ }\r
+ Optional64->DataDirectory[3].Size = 0;\r
+ Optional64->DataDirectory[3].VirtualAddress = 0;\r
+ }\r
+ }\r
+ }\r
+\r
+ //\r
+ // Strip zero padding at the end of the .reloc section \r
+ //\r
+ if (Optional64->NumberOfRvaAndSizes >= 6) {\r
+ if (Optional64->DataDirectory[5].Size != 0) {\r
+ SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);\r
+ for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {\r
+ //\r
+ // Look for the Section Header that starts as the same virtual address as the Base Relocation Data Directory\r
+ //\r
+ if (SectionHeader->VirtualAddress == Optional64->DataDirectory[5].VirtualAddress) {\r
+ SectionHeader->Misc.VirtualSize = Optional64->DataDirectory[5].Size;\r
+ AllignedRelocSize = (Optional64->DataDirectory[5].Size + Optional64->FileAlignment - 1) & (~(Optional64->FileAlignment - 1));\r
+ //\r
+ // Check to see if there is zero padding at the end of the base relocations\r
+ //\r
+ if (AllignedRelocSize < SectionHeader->SizeOfRawData) {\r
+ //\r
+ // Check to see if the base relocations are at the end of the file\r
+ //\r
+ if (SectionHeader->PointerToRawData + SectionHeader->SizeOfRawData == Optional64->SizeOfImage) {\r
+ //\r
+ // All the required conditions are met to strip the zero padding of the end of the base relocations section\r
+ //\r
+ Optional64->SizeOfImage -= (SectionHeader->SizeOfRawData - AllignedRelocSize);\r
+ Optional64->SizeOfInitializedData -= (SectionHeader->SizeOfRawData - AllignedRelocSize);\r
+ SectionHeader->SizeOfRawData = AllignedRelocSize;\r
+ FileLength = Optional64->SizeOfImage;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r