/** @file\r
Converts a pe32+ image to an FW, Te image type, or other specific image.\r
\r
-Copyright (c) 2004 - 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
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
PEI_CORE, PEIM, DXE_CORE, DXE_DRIVER, UEFI_APPLICATION,\n\\r
SEC, DXE_SAL_DRIVER, UEFI_DRIVER, DXE_RUNTIME_DRIVER,\n\\r
DXE_SMM_DRIVER, SECURITY_CORE, COMBINED_PEIM_DRIVER,\n\\r
+ MM_STANDALONE, MM_CORE_STANDALONE,\n\\r
PIC_PEIM, RELOCATABLE_PEIM, BS_DRIVER, RT_DRIVER,\n\\r
APPLICATION, SAL_RT_DRIVER to support all module types\n\\r
It can only be used together with --keepexceptiontable,\n\\r
// Allocate the extra space that we need to grow the image\r
//\r
XipFile = malloc (XipLength);\r
+ if (XipFile == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return;\r
+ }\r
memset (XipFile, 0, XipLength);\r
\r
//\r
+ 3 * (sizeof (UINT16) + 3 * sizeof (CHAR16)) \r
+ sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY);\r
HiiSectionHeader = malloc (HiiSectionHeaderSize);\r
+ if (HiiSectionHeader == NULL) {\r
+ Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+ return NULL;\r
+ }\r
memset (HiiSectionHeader, 0, HiiSectionHeaderSize);\r
\r
HiiSectionOffset = 0;\r
}\r
}\r
\r
- //\r
- // No available section header is found.\r
- //\r
- if (Index == ImgHdr->Pe32.FileHeader.NumberOfSections) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
//\r
// BaseAddress is set to section header.\r
//\r
EFI_HII_PACKAGE_LIST_HEADER HiiPackageListHeader;\r
EFI_HII_PACKAGE_HEADER HiiPackageHeader;\r
EFI_IFR_FORM_SET IfrFormSet;\r
- UINT8 NumberOfFormPacakge;\r
+ UINT8 NumberOfFormPackage;\r
EFI_HII_PACKAGE_HEADER EndPackage;\r
UINT32 HiiSectionHeaderSize;\r
UINT8 *HiiSectionHeader;\r
KeepExceptionTableFlag = FALSE;\r
KeepOptionalHeaderFlag = FALSE;\r
KeepZeroPendingFlag = FALSE;\r
- NumberOfFormPacakge = 0;\r
+ NumberOfFormPackage = 0;\r
HiiPackageListBuffer = NULL;\r
HiiPackageDataPointer = NULL;\r
EndPackage.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
fread (&IfrFormSet, 1, sizeof (IfrFormSet), fpIn);\r
memcpy (&HiiPackageListGuid, &IfrFormSet.Guid, sizeof (EFI_GUID));\r
}\r
- NumberOfFormPacakge ++;\r
+ NumberOfFormPackage ++;\r
}\r
HiiPackageListHeader.PackageLength += FileLength;\r
fclose (fpIn);\r
//\r
// Check whether hii packages are valid\r
//\r
- if (NumberOfFormPacakge > 1) {\r
+ if (NumberOfFormPackage > 1) {\r
Error (NULL, 0, 3000, "Invalid", "The input hii packages contains more than one hii form package");\r
goto Finish;\r
}\r
// Create the resource section header\r
//\r
HiiSectionHeader = CreateHiiResouceSectionHeader (&HiiSectionHeaderSize, HiiPackageListHeader.PackageLength);\r
+ if (HiiSectionHeader == NULL) {\r
+ free (HiiPackageListBuffer);\r
+ goto Finish;\r
+ }\r
//\r
// Wrtie section header and HiiData into File.\r
//\r
stricmp (ModuleType, "DXE_DRIVER") == 0 ||\r
stricmp (ModuleType, "DXE_SMM_DRIVER") == 0 ||\r
stricmp (ModuleType, "UEFI_DRIVER") == 0 ||\r
- stricmp (ModuleType, "SMM_CORE") == 0) {\r
+ stricmp (ModuleType, "SMM_CORE") == 0 ||\r
+ stricmp (ModuleType, "MM_STANDALONE") == 0 ||\r
+ stricmp (ModuleType, "MM_CORE_STANDALONE") == 0) {\r
Type = EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;\r
VerboseMsg ("Efi Image subsystem type is efi boot service driver.");\r
\r
{\r
UINT32 Index;\r
UINT32 DebugDirectoryEntryRva;\r
+ UINT32 DebugDirectoryEntrySize;\r
UINT32 DebugDirectoryEntryFileOffset;\r
UINT32 ExportDirectoryEntryRva;\r
UINT32 ExportDirectoryEntryFileOffset;\r
EFI_IMAGE_OPTIONAL_HEADER64 *Optional64Hdr;\r
EFI_IMAGE_SECTION_HEADER *SectionHeader;\r
EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
+ EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *RsdsEntry;\r
UINT32 *NewTimeStamp; \r
\r
//\r
// Init variable.\r
//\r
DebugDirectoryEntryRva = 0;\r
+ DebugDirectoryEntrySize = 0;\r
ExportDirectoryEntryRva = 0;\r
ResourceDirectoryEntryRva = 0;\r
DebugDirectoryEntryFileOffset = 0;\r
// Get Debug, Export and Resource EntryTable RVA address.\r
// Resource Directory entry need to review.\r
//\r
- if (FileHdr->Machine == EFI_IMAGE_MACHINE_IA32) {\r
- Optional32Hdr = (EFI_IMAGE_OPTIONAL_HEADER32 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
+ Optional32Hdr = (EFI_IMAGE_OPTIONAL_HEADER32 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
+ Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
+ if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional32Hdr + FileHdr->SizeOfOptionalHeader);\r
if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT && \\r
Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0) {\r
if (Optional32Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && \\r
Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size != 0) {\r
DebugDirectoryEntryRva = Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;\r
+ DebugDirectoryEntrySize = Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size;\r
if (ZeroDebugFlag) {\r
Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0;\r
Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress = 0;\r
}\r
}\r
} else {\r
- Optional64Hdr = (EFI_IMAGE_OPTIONAL_HEADER64 *) ((UINT8*) FileHdr + sizeof (EFI_IMAGE_FILE_HEADER));\r
SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) Optional64Hdr + FileHdr->SizeOfOptionalHeader);\r
if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_EXPORT && \\r
Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size != 0) {\r
if (Optional64Hdr->NumberOfRvaAndSizes > EFI_IMAGE_DIRECTORY_ENTRY_DEBUG && \\r
Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size != 0) {\r
DebugDirectoryEntryRva = Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;\r
+ DebugDirectoryEntrySize = Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size;\r
if (ZeroDebugFlag) {\r
Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = 0;\r
Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress = 0;\r
\r
if (DebugDirectoryEntryFileOffset != 0) {\r
DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (FileBuffer + DebugDirectoryEntryFileOffset);\r
- DebugEntry->TimeDateStamp = 0;\r
- mImageTimeStamp = 0;\r
- if (ZeroDebugFlag) {\r
- memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData);\r
- memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY));\r
+ Index = 0;\r
+ for (Index=0; Index < DebugDirectoryEntrySize / sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); Index ++, DebugEntry ++) {\r
+ DebugEntry->TimeDateStamp = 0;\r
+ if (ZeroDebugFlag || DebugEntry->Type != EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
+ memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOfData);\r
+ memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY));\r
+ }\r
+ if (DebugEntry->Type == EFI_IMAGE_DEBUG_TYPE_CODEVIEW) {\r
+ RsdsEntry = (EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *) (FileBuffer + DebugEntry->FileOffset);\r
+ if (RsdsEntry->Signature == CODEVIEW_SIGNATURE_RSDS) {\r
+ RsdsEntry->Unknown = 0;\r
+ RsdsEntry->Unknown2 = 0;\r
+ RsdsEntry->Unknown3 = 0;\r
+ RsdsEntry->Unknown4 = 0;\r
+ RsdsEntry->Unknown5 = 0;\r
+ } else if (RsdsEntry->Signature == CODEVIEW_SIGNATURE_MTOC) {\r
+ // MTOC sets DebugDirectoryEntrySize to size of the .debug section, so fix it.\r
+ if (!ZeroDebugFlag) {\r
+ if (Optional32Hdr->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
+ Optional32Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+ } else {\r
+ Optional64Hdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].Size = sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY);\r
+ }\r
+ }\r
+ break;\r
+ }\r
+ }\r
}\r
}\r
\r
}\r
\r
ptime = localtime (&newtime);\r
- DebugMsg (NULL, 0, 9, "New Image Time Stamp", "%04d-%02d-%02d %02d:%02d:%02d",\r
- ptime->tm_year + 1900, ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_hour, ptime->tm_min, ptime->tm_sec);\r
+ if (ptime != NULL) {\r
+ DebugMsg (NULL, 0, 9, "New Image Time Stamp", "%04d-%02d-%02d %02d:%02d:%02d",\r
+ ptime->tm_year + 1900, ptime->tm_mon + 1, ptime->tm_mday, ptime->tm_hour, ptime->tm_min, ptime->tm_sec);\r
+ }\r
//\r
// Set new time and data into PeImage.\r
//\r
{\r
CHAR8 Line[MAX_LINE_LEN];\r
CHAR8 *cptr;\r
- unsigned ScannedData = 0;\r
+ int ScannedData = 0;\r
\r
Line[MAX_LINE_LEN - 1] = 0;\r
while (1) {\r