]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFw/GenFw.c
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / C / GenFw / GenFw.c
index e41fe6e82ba78091124d654f7ad1d6ba104f822b..7976bec60a4b3c04e01e3521c7a27a60f69b6510 100644 (file)
@@ -1,6 +1,7 @@
 /** @file\r
+Converts a pe32+ image to an FW, Te image type, or other specific image.\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2018, 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
@@ -9,14 +10,6 @@ http://opensource.org/licenses/bsd-license.php
 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
 \r
-Module Name:\r
-\r
-    GenFw.c\r
-\r
-Abstract:\r
-\r
-    Converts a pe32+ image to an FW, Te image type, or other specific image.\r
-\r
 **/\r
 \r
 #include "WinNtInclude.h"\r
@@ -62,33 +55,10 @@ Abstract:
 \r
 #define HII_RESOURCE_SECTION_INDEX  1\r
 #define HII_RESOURCE_SECTION_NAME   "HII"\r
-//\r
-// Action for this tool.\r
-//\r
-#define FW_DUMMY_IMAGE                0\r
-#define FW_EFI_IMAGE                  1\r
-#define FW_TE_IMAGE                   2\r
-#define FW_ACPI_IMAGE                 3\r
-#define FW_BIN_IMAGE                  4\r
-#define FW_ZERO_DEBUG_IMAGE           5\r
-#define FW_SET_STAMP_IMAGE            6\r
-#define FW_MCI_IMAGE                  7\r
-#define FW_MERGE_IMAGE                8\r
-#define FW_RELOC_STRIPEED_IMAGE       9\r
-#define FW_HII_PACKAGE_LIST_RCIMAGE   10\r
-#define FW_HII_PACKAGE_LIST_BINIMAGE  11\r
-#define FW_REBASE_IMAGE               12\r
-#define FW_SET_ADDRESS_IMAGE          13\r
-\r
-#define DUMP_TE_HEADER  0x11\r
 \r
 #define DEFAULT_MC_PAD_BYTE_VALUE  0xFF\r
 #define DEFAULT_MC_ALIGNMENT       16\r
 \r
-#ifndef _MAX_PATH\r
-#define _MAX_PATH 500\r
-#endif\r
-\r
 #define STATUS_IGNORE 0xA\r
 //\r
 // Structure definition for a microcode header\r
@@ -121,6 +91,8 @@ static const char *gHiiPackageRCFileHeader[] = {
 CHAR8  *mInImageName;\r
 UINT32 mImageTimeStamp = 0;\r
 UINT32 mImageSize = 0;\r
+UINT32 mOutImageType = FW_DUMMY_IMAGE;\r
+BOOLEAN mIsConvertXip = FALSE;\r
 \r
 \r
 STATIC\r
@@ -165,7 +137,7 @@ Returns:
 \r
 --*/\r
 {\r
-  fprintf (stdout, "%s Version %d.%d\n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION);\r
+  fprintf (stdout, "%s Version %d.%d %s \n", UTILITY_NAME, UTILITY_MAJOR_VERSION, UTILITY_MINOR_VERSION, __BUILD_VERSION);\r
 }\r
 \r
 STATIC\r
@@ -197,7 +169,7 @@ Returns:
   //\r
   // Copyright declaration\r
   //\r
-  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -210,12 +182,13 @@ Returns:
                         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
-                        --keepzeropending, -r, -o option.It is a action option.\n\\r
-                        If it is combined with other action options, the later\n\\r
-                        input action option will override the previous one.\n");\r
+                        --keepzeropending, --keepoptionalheader, -r, -o option.\n\\r
+                        It is a action option. If it is combined with other action options,\n\\r
+                        the later input action option will override the previous one.\n");\r
   fprintf (stdout, "  -c, --acpi            Create Acpi table.\n\\r
                         It can't be combined with other action options\n\\r
                         except for -o, -r option. It is a action option.\n\\r
@@ -223,9 +196,9 @@ Returns:
                         input action option will override the previous one.\n");\r
   fprintf (stdout, "  -t, --terse           Create Te Image.\n\\r
                         It can only be used together with --keepexceptiontable,\n\\r
-                        --keepzeropending, -r, -o option.It is a action option.\n\\r
-                        If it is combined with other action options, the later\n\\r
-                        input action option will override the previous one.\n");\r
+                        --keepzeropending, --keepoptionalheader, -r, -o option.\n\\r
+                        It is a action option. If it is combined with other action options,\n\\r
+                        the later input action option will override the previous one.\n");\r
   fprintf (stdout, "  -u, --dump            Dump TeImage Header.\n\\r
                         It can't be combined with other action options\n\\r
                         except for -o, -r option. It is a action option.\n\\r
@@ -269,12 +242,15 @@ Returns:
                         If it is combined with other action options, the later\n\\r
                         input action option will override the previous one.\n");\r
   fprintf (stdout, "  -a NUM, --align NUM   NUM is one HEX or DEC format alignment value.\n\\r
-                        This option is only used together with -j option.\n");  \r
+                        This option is only used together with -j option.\n");\r
   fprintf (stdout, "  -p NUM, --pad NUM     NUM is one HEX or DEC format padding value.\n\\r
                         This option is only used together with -j option.\n");\r
   fprintf (stdout, "  --keepexceptiontable  Don't clear exception table.\n\\r
                         This option can be used together with -e or -t.\n\\r
                         It doesn't work for other options.\n");\r
+  fprintf (stdout, "  --keepoptionalheader  Don't zero PE/COFF optional header fields.\n\\r
+                        This option can be used together with -e or -t.\n\\r
+                        It doesn't work for other options.\n");\r
   fprintf (stdout, "  --keepzeropending     Don't strip zero pending of .reloc.\n\\r
                         This option can be used together with -e or -t.\n\\r
                         It doesn't work for other options.\n");\r
@@ -514,7 +490,7 @@ SetHiiResourceHeader (
         }\r
 \r
         //\r
-        // Now it ought to be resource Data and update its OffsetToData value \r
+        // Now it ought to be resource Data and update its OffsetToData value\r
         //\r
         if (!ResourceDirectoryEntry->u2.s.DataIsDirectory) {\r
           ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *) (HiiBinData + ResourceDirectoryEntry->u2.OffsetToData);\r
@@ -525,7 +501,7 @@ SetHiiResourceHeader (
     }\r
     ResourceDirectoryEntry++;\r
   }\r
-  \r
+\r
   return;\r
 }\r
 \r
@@ -554,7 +530,7 @@ GetPeCoffHeader (
       return NULL;\r
     }\r
   }\r
-  \r
+\r
   return PeHdr;\r
 }\r
 \r
@@ -579,7 +555,7 @@ PeCoffConvertImageToXip (
   if (PeHdr == NULL) {\r
     return;\r
   }\r
-  \r
+\r
   if (PeHdr->Pe32.OptionalHeader.SectionAlignment != PeHdr->Pe32.OptionalHeader.FileAlignment) {\r
     //\r
     // The only reason to expand zero fill sections is to make them compatible with XIP images.\r
@@ -651,6 +627,10 @@ PeCoffConvertImageToXip (
   // 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
@@ -676,18 +656,23 @@ PeCoffConvertImageToXip (
         SectionHeader->SizeOfRawData\r
         );\r
     }\r
-    SectionHeader->SizeOfRawData = SectionHeader->Misc.VirtualSize;\r
+    //\r
+    // Make the size of raw data in section header alignment.\r
+    //\r
+    SectionHeader->SizeOfRawData = (SectionHeader->Misc.VirtualSize + PeHdr->Pe32.OptionalHeader.FileAlignment - 1) & (~(PeHdr->Pe32.OptionalHeader.FileAlignment - 1));\r
     SectionHeader->PointerToRawData = SectionHeader->VirtualAddress;\r
   }\r
 \r
   free (*FileBuffer);\r
   *FileLength = XipLength;\r
   *FileBuffer = XipFile;\r
+\r
+  mIsConvertXip = TRUE;\r
 }\r
 \r
 UINT8 *\r
 CreateHiiResouceSectionHeader (\r
-  UINT32 *pSectionHeaderSize, \r
+  UINT32 *pSectionHeaderSize,\r
   UINT32 HiiDataSize\r
   )\r
 /*++\r
@@ -720,15 +705,19 @@ Returns:
   // Calculate the total size for the resource header (include Type, Name and Language)\r
   // then allocate memory for the resource header.\r
   //\r
-  HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY)) \r
-                          + 3 * (sizeof (UINT16) + 3 * sizeof (CHAR16)) \r
+  HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY))\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
-  // Create Type entry \r
+  // Create Type entry\r
   //\r
   ResourceDirectory = (EFI_IMAGE_RESOURCE_DIRECTORY *) (HiiSectionHeader + HiiSectionOffset);\r
   HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DIRECTORY);\r
@@ -888,7 +877,7 @@ Returns:
 \r
   if (ImageContext.RelocationsStripped) {\r
     Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);\r
-    return Status;    \r
+    return Status;\r
   }\r
 \r
   //\r
@@ -901,8 +890,8 @@ Returns:
   //\r
   SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
     (UINTN) ImgHdr +\r
-    sizeof (UINT32) + \r
-    sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+    sizeof (UINT32) +\r
+    sizeof (EFI_IMAGE_FILE_HEADER) +\r
     ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
     );\r
 \r
@@ -916,13 +905,6 @@ Returns:
     }\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
@@ -975,7 +957,7 @@ Returns:
 \r
   if (ImageContext.RelocationsStripped) {\r
     Error (NULL, 0, 3000, "Invalid", "The input PeImage %s has no relocation to be fixed up", FileName);\r
-    return Status;    \r
+    return Status;\r
   }\r
 \r
   //\r
@@ -1014,15 +996,15 @@ Returns:
   //\r
   SectionHeader = (EFI_IMAGE_SECTION_HEADER *) (\r
     (UINTN) ImgHdr +\r
-    sizeof (UINT32) + \r
-    sizeof (EFI_IMAGE_FILE_HEADER) +  \r
+    sizeof (UINT32) +\r
+    sizeof (EFI_IMAGE_FILE_HEADER) +\r
     ImgHdr->Pe32.FileHeader.SizeOfOptionalHeader\r
     );\r
 \r
   for (Index = 0; Index < ImgHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
     CopyMem (\r
-      FileBuffer + SectionHeader->PointerToRawData, \r
-      (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress), \r
+      FileBuffer + SectionHeader->PointerToRawData,\r
+      (VOID*) (UINTN) (ImageContext.ImageAddress + SectionHeader->VirtualAddress),\r
       SectionHeader->SizeOfRawData\r
       );\r
   }\r
@@ -1080,7 +1062,6 @@ Returns:
   char                             *OutImageName;\r
   char                             *ModuleType;\r
   CHAR8                            *TimeStamp;\r
-  UINT32                           OutImageType;\r
   FILE                             *fpIn;\r
   FILE                             *fpOut;\r
   FILE                             *fpInOut;\r
@@ -1106,6 +1087,7 @@ Returns:
   STATUS                           Status;\r
   BOOLEAN                          ReplaceFlag;\r
   BOOLEAN                          KeepExceptionTableFlag;\r
+  BOOLEAN                          KeepOptionalHeaderFlag;\r
   BOOLEAN                          KeepZeroPendingFlag;\r
   UINT64                           LogLevel;\r
   EFI_TE_IMAGE_HEADER              TEImageHeader;\r
@@ -1123,7 +1105,7 @@ Returns:
   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
@@ -1147,7 +1129,6 @@ Returns:
   mInImageName      = NULL;\r
   OutImageName      = NULL;\r
   ModuleType        = NULL;\r
-  OutImageType      = FW_DUMMY_IMAGE;\r
   Type              = 0;\r
   Status            = STATUS_SUCCESS;\r
   FileBuffer        = NULL;\r
@@ -1169,8 +1150,9 @@ Returns:
   Optional32        = NULL;\r
   Optional64        = NULL;\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
@@ -1221,8 +1203,8 @@ Returns:
         goto Finish;\r
       }\r
       ModuleType = argv[1];\r
-      if (OutImageType != FW_TE_IMAGE) {\r
-        OutImageType = FW_EFI_IMAGE;\r
+      if (mOutImageType != FW_TE_IMAGE) {\r
+        mOutImageType = FW_EFI_IMAGE;\r
       }\r
       argc -= 2;\r
       argv += 2;\r
@@ -1230,49 +1212,49 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-l") == 0) || (stricmp (argv[0], "--stripped") == 0)) {\r
-      OutImageType = FW_RELOC_STRIPEED_IMAGE;\r
+      mOutImageType = FW_RELOC_STRIPEED_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-c") == 0) || (stricmp (argv[0], "--acpi") == 0)) {\r
-      OutImageType = FW_ACPI_IMAGE;\r
+      mOutImageType = FW_ACPI_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-t") == 0) || (stricmp (argv[0], "--terse") == 0)) {\r
-      OutImageType = FW_TE_IMAGE;\r
+      mOutImageType = FW_TE_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-u") == 0) || (stricmp (argv[0], "--dump") == 0)) {\r
-      OutImageType = DUMP_TE_HEADER;\r
+      mOutImageType = DUMP_TE_HEADER;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-b") == 0) || (stricmp (argv[0], "--exe2bin") == 0)) {\r
-      OutImageType = FW_BIN_IMAGE;\r
+      mOutImageType = FW_BIN_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-z") == 0) || (stricmp (argv[0], "--zero") == 0)) {\r
-      OutImageType = FW_ZERO_DEBUG_IMAGE;\r
+      mOutImageType = FW_ZERO_DEBUG_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-s") == 0) || (stricmp (argv[0], "--stamp") == 0)) {\r
-      OutImageType = FW_SET_STAMP_IMAGE;\r
+      mOutImageType = FW_SET_STAMP_IMAGE;\r
       if (argv[1] == NULL || argv[1][0] == '-') {\r
         Error (NULL, 0, 1003, "Invalid option value", "time stamp is missing for -s option");\r
         goto Finish;\r
@@ -1297,6 +1279,13 @@ Returns:
       continue;\r
     }\r
 \r
+    if (stricmp(argv[0], "--keepoptionalheader") == 0) {\r
+      KeepOptionalHeaderFlag = TRUE;\r
+      argc--;\r
+      argv++;\r
+      continue;\r
+    }\r
+\r
     if (stricmp (argv[0], "--keepzeropending") == 0) {\r
       KeepZeroPendingFlag = TRUE;\r
       argc --;\r
@@ -1305,14 +1294,14 @@ Returns:
     }\r
 \r
     if ((stricmp (argv[0], "-m") == 0) || (stricmp (argv[0], "--mcifile") == 0)) {\r
-      OutImageType = FW_MCI_IMAGE;\r
+      mOutImageType = FW_MCI_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if ((stricmp (argv[0], "-j") == 0) || (stricmp (argv[0], "--join") == 0)) {\r
-      OutImageType = FW_MERGE_IMAGE;\r
+      mOutImageType = FW_MERGE_IMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
@@ -1341,7 +1330,7 @@ Returns:
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
-      OutImageType = FW_REBASE_IMAGE;\r
+      mOutImageType = FW_REBASE_IMAGE;\r
       NewBaseAddress = (UINT64) Temp64;\r
       argc -= 2;\r
       argv += 2;\r
@@ -1360,7 +1349,7 @@ Returns:
         Error (NULL, 0, 1003, "Invalid option value", "%s = %s", argv[0], argv[1]);\r
         goto Finish;\r
       }\r
-      OutImageType = FW_SET_ADDRESS_IMAGE;\r
+      mOutImageType = FW_SET_ADDRESS_IMAGE;\r
       NewBaseAddress = (UINT64) Temp64;\r
       argc -= 2;\r
       argv += 2;\r
@@ -1423,14 +1412,14 @@ Returns:
     }\r
 \r
     if (stricmp (argv[0], "--hiipackage") == 0) {\r
-      OutImageType = FW_HII_PACKAGE_LIST_RCIMAGE;\r
+      mOutImageType = FW_HII_PACKAGE_LIST_RCIMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
     }\r
 \r
     if (stricmp (argv[0], "--hiibinpackage") == 0) {\r
-      OutImageType = FW_HII_PACKAGE_LIST_BINIMAGE;\r
+      mOutImageType = FW_HII_PACKAGE_LIST_BINIMAGE;\r
       argc --;\r
       argv ++;\r
       continue;\r
@@ -1475,7 +1464,7 @@ Returns:
 \r
   VerboseMsg ("%s tool start.", UTILITY_NAME);\r
 \r
-  if (OutImageType == FW_DUMMY_IMAGE) {\r
+  if (mOutImageType == FW_DUMMY_IMAGE) {\r
     Error (NULL, 0, 1001, "Missing option", "No create file action specified; pls specify -e, -c or -t option to create efi image, or acpi table or TeImage!");\r
     if (ReplaceFlag) {\r
       Error (NULL, 0, 1001, "Missing option", "-r option is not supported as the independent option. It can be used together with other create file option specified at the above.");\r
@@ -1494,7 +1483,7 @@ Returns:
   //\r
   // Combine MciBinary files to one file\r
   //\r
-  if ((OutImageType == FW_MERGE_IMAGE) && ReplaceFlag) {\r
+  if ((mOutImageType == FW_MERGE_IMAGE) && ReplaceFlag) {\r
     Error (NULL, 0, 1002, "Conflicting option", "-r replace option cannot be used with -j merge files option.");\r
     goto Finish;\r
   }\r
@@ -1502,12 +1491,12 @@ Returns:
   //\r
   // Combine HiiBinary packages to a single package list\r
   //\r
-  if ((OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) && ReplaceFlag) {\r
+  if ((mOutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) && ReplaceFlag) {\r
     Error (NULL, 0, 1002, "Conflicting option", "-r replace option cannot be used with --hiipackage merge files option.");\r
     goto Finish;\r
   }\r
 \r
-  if ((OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) && ReplaceFlag) {\r
+  if ((mOutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) && ReplaceFlag) {\r
     Error (NULL, 0, 1002, "Conflicting option", "-r replace option cannot be used with --hiibinpackage merge files option.");\r
     goto Finish;\r
   }\r
@@ -1521,7 +1510,7 @@ Returns:
   //\r
   // Action will be taken for the input file.\r
   //\r
-  switch (OutImageType) {\r
+  switch (mOutImageType) {\r
   case FW_EFI_IMAGE:\r
     VerboseMsg ("Create efi image on module type %s based on the input PE image.", ModuleType);\r
     break;\r
@@ -1576,7 +1565,7 @@ Returns:
   // Open output file and Write image into the output file.\r
   //\r
   if (OutImageName != NULL) {\r
-    fpOut = fopen (OutImageName, "rb");\r
+    fpOut = fopen (LongFilePath (OutImageName), "rb");\r
     if (fpOut != NULL) {\r
       //\r
       // Get Output file time stamp\r
@@ -1599,7 +1588,7 @@ Returns:
       fpOut = NULL;\r
     }\r
     VerboseMsg ("Output file name is %s", OutImageName);\r
-  } else if (!ReplaceFlag && OutImageType != DUMP_TE_HEADER) {\r
+  } else if (!ReplaceFlag && mOutImageType != DUMP_TE_HEADER) {\r
     Error (NULL, 0, 1001, "Missing option", "output file");\r
     goto Finish;\r
   }\r
@@ -1607,7 +1596,7 @@ Returns:
   //\r
   // Open input file and read file data into file buffer.\r
   //\r
-  fpIn = fopen (mInImageName, "rb");\r
+  fpIn = fopen (LongFilePath (mInImageName), "rb");\r
   if (fpIn == NULL) {\r
     Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
     goto Finish;\r
@@ -1634,11 +1623,11 @@ Returns:
   //\r
   // Combine multi binary HII package files.\r
   //\r
-  if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE || OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {\r
+  if (mOutImageType == FW_HII_PACKAGE_LIST_RCIMAGE || mOutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {\r
     //\r
     // Open output file handle.\r
     //\r
-    fpOut = fopen (OutImageName, "wb");\r
+    fpOut = fopen (LongFilePath (OutImageName), "wb");\r
     if (!fpOut) {\r
       Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
       goto Finish;\r
@@ -1648,7 +1637,7 @@ Returns:
     //\r
     HiiPackageListHeader.PackageLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
     for (Index = 0; Index < InputFileNum; Index ++) {\r
-      fpIn = fopen (InputFileName [Index], "rb");\r
+      fpIn = fopen (LongFilePath (InputFileName [Index]), "rb");\r
       if (fpIn == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
         goto Finish;\r
@@ -1665,7 +1654,7 @@ Returns:
           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
@@ -1674,7 +1663,7 @@ Returns:
     //\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
@@ -1694,7 +1683,7 @@ Returns:
     memcpy (HiiPackageListBuffer, &HiiPackageListHeader, sizeof (HiiPackageListHeader));\r
     HiiPackageDataPointer = HiiPackageListBuffer + sizeof (HiiPackageListHeader);\r
     for (Index = 0; Index < InputFileNum; Index ++) {\r
-      fpIn = fopen (InputFileName [Index], "rb");\r
+      fpIn = fopen (LongFilePath (InputFileName [Index]), "rb");\r
       if (fpIn == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
         free (HiiPackageListBuffer);\r
@@ -1711,11 +1700,15 @@ Returns:
     //\r
     // write the hii package into the binary package list file with the resource section header\r
     //\r
-    if (OutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {\r
+    if (mOutImageType == FW_HII_PACKAGE_LIST_BINIMAGE) {\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
@@ -1735,7 +1728,7 @@ Returns:
     //\r
     // write the hii package into the text package list rc file.\r
     //\r
-    if (OutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) {\r
+    if (mOutImageType == FW_HII_PACKAGE_LIST_RCIMAGE) {\r
       for (Index = 0; gHiiPackageRCFileHeader[Index] != NULL; Index++) {\r
         fprintf (fpOut, "%s\n", gHiiPackageRCFileHeader[Index]);\r
       }\r
@@ -1770,17 +1763,17 @@ Returns:
   //\r
   // Combine MciBinary files to one file\r
   //\r
-  if (OutImageType == FW_MERGE_IMAGE) {\r
+  if (mOutImageType == FW_MERGE_IMAGE) {\r
     //\r
     // Open output file handle.\r
     //\r
-    fpOut = fopen (OutImageName, "wb");\r
+    fpOut = fopen (LongFilePath (OutImageName), "wb");\r
     if (!fpOut) {\r
       Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
       goto Finish;\r
     }\r
     for (Index = 0; Index < InputFileNum; Index ++) {\r
-      fpIn = fopen (InputFileName [Index], "rb");\r
+      fpIn = fopen (LongFilePath (InputFileName [Index]), "rb");\r
       if (!fpIn) {\r
         Error (NULL, 0, 0001, "Error opening file", InputFileName [Index]);\r
         goto Finish;\r
@@ -1821,8 +1814,8 @@ Returns:
   //\r
   // Convert MicroCode.txt file to MicroCode.bin file\r
   //\r
-  if (OutImageType == FW_MCI_IMAGE) {\r
-    fpIn = fopen (mInImageName, "r");\r
+  if (mOutImageType == FW_MCI_IMAGE) {\r
+    fpIn = fopen (LongFilePath (mInImageName), "r");\r
     if (fpIn == NULL) {\r
       Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
       goto Finish;\r
@@ -1935,7 +1928,7 @@ Returns:
   //\r
   // Dump TeImage Header into output file.\r
   //\r
-  if (OutImageType == DUMP_TE_HEADER) {\r
+  if (mOutImageType == DUMP_TE_HEADER) {\r
     memcpy (&TEImageHeader, FileBuffer, sizeof (TEImageHeader));\r
     if (TEImageHeader.Signature != EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
       Error (NULL, 0, 3000, "Invalid", "TE header signature of file %s is not correct.", mInImageName);\r
@@ -1945,14 +1938,14 @@ Returns:
     // Open the output file handle.\r
     //\r
     if (ReplaceFlag) {\r
-      fpInOut = fopen (mInImageName, "wb");\r
+      fpInOut = fopen (LongFilePath (mInImageName), "wb");\r
       if (fpInOut == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
         goto Finish;\r
       }\r
     } else {\r
       if (OutImageName != NULL) {\r
-        fpOut = fopen (OutImageName, "wb");\r
+        fpOut = fopen (LongFilePath (OutImageName), "wb");\r
       } else {\r
         fpOut = stdout;\r
       }\r
@@ -1994,12 +1987,12 @@ Returns:
   // Following code to convert dll to efi image or te image.\r
   // Get new image type\r
   //\r
-  if ((OutImageType == FW_EFI_IMAGE) || (OutImageType == FW_TE_IMAGE)) {\r
+  if ((mOutImageType == FW_EFI_IMAGE) || (mOutImageType == FW_TE_IMAGE)) {\r
     if (ModuleType == NULL) {\r
-      if (OutImageType == FW_EFI_IMAGE) {\r
+      if (mOutImageType == FW_EFI_IMAGE) {\r
         Error (NULL, 0, 1001, "Missing option", "EFI_FILETYPE");\r
         goto Finish;\r
-      } else if (OutImageType == FW_TE_IMAGE) {\r
+      } else if (mOutImageType == FW_TE_IMAGE) {\r
         //\r
         // Default TE Image Type is Boot service driver\r
         //\r
@@ -2020,7 +2013,9 @@ Returns:
         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
@@ -2047,7 +2042,7 @@ Returns:
   }\r
 \r
   //\r
-  // Convert EFL image to PeImage\r
+  // Convert ELF image to PeImage\r
   //\r
   if (IsElfHeader(FileBuffer)) {\r
     VerboseMsg ("Convert %s from ELF to PE/COFF.", mInImageName);\r
@@ -2066,7 +2061,7 @@ Returns:
   //\r
   // Remove reloc section from PE or TE image\r
   //\r
-  if (OutImageType == FW_RELOC_STRIPEED_IMAGE) {\r
+  if (mOutImageType == FW_RELOC_STRIPEED_IMAGE) {\r
     //\r
     // Check TeImage\r
     //\r
@@ -2184,21 +2179,21 @@ Returns:
   //\r
   // Set new base address into image\r
   //\r
-  if (OutImageType == FW_REBASE_IMAGE || OutImageType == FW_SET_ADDRESS_IMAGE) {\r
+  if (mOutImageType == FW_REBASE_IMAGE || mOutImageType == FW_SET_ADDRESS_IMAGE) {\r
     if ((PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) && (PeHdr->Pe32.FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)) {\r
       if (NewBaseAddress >= 0x100000000ULL) {\r
         Error (NULL, 0, 3000, "Invalid", "New base address is larger than 4G for 32bit PE image");\r
         goto Finish;\r
       }\r
     }\r
-    \r
+\r
     if (NegativeAddr) {\r
       //\r
       // Set Base Address to a negative value.\r
       //\r
       NewBaseAddress = (UINT64) (0 - NewBaseAddress);\r
     }\r
-    if (OutImageType == FW_REBASE_IMAGE) {\r
+    if (mOutImageType == FW_REBASE_IMAGE) {\r
       Status = RebaseImage (mInImageName, FileBuffer, NewBaseAddress);\r
     } else {\r
       Status = SetAddressToSectionHeader (mInImageName, FileBuffer, NewBaseAddress);\r
@@ -2221,7 +2216,7 @@ Returns:
   //\r
   // Extract bin data from Pe image.\r
   //\r
-  if (OutImageType == FW_BIN_IMAGE) {\r
+  if (mOutImageType == FW_BIN_IMAGE) {\r
     if (FileLength < PeHdr->Pe32.OptionalHeader.SizeOfHeaders) {\r
       Error (NULL, 0, 3000, "Invalid", "FileSize of %s is not a legal size.", mInImageName);\r
       goto Finish;\r
@@ -2230,7 +2225,7 @@ Returns:
     // Output bin data from exe file\r
     //\r
     FileLength = FileLength - PeHdr->Pe32.OptionalHeader.SizeOfHeaders;\r
-    memcpy (FileBuffer, FileBuffer + PeHdr->Pe32.OptionalHeader.SizeOfHeaders, FileLength);\r
+    memmove (FileBuffer, FileBuffer + PeHdr->Pe32.OptionalHeader.SizeOfHeaders, FileLength);\r
     VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
     goto WriteFile;\r
   }\r
@@ -2238,7 +2233,7 @@ Returns:
   //\r
   // Zero Debug Information of Pe Image\r
   //\r
-  if (OutImageType == FW_ZERO_DEBUG_IMAGE) {\r
+  if (mOutImageType == FW_ZERO_DEBUG_IMAGE) {\r
     Status = ZeroDebugData (FileBuffer, TRUE);\r
     if (EFI_ERROR (Status)) {\r
       Error (NULL, 0, 3000, "Invalid", "Zero DebugData Error status is 0x%x", (int) Status);\r
@@ -2255,7 +2250,7 @@ Returns:
   //\r
   // Set Time Stamp of Pe Image\r
   //\r
-  if (OutImageType == FW_SET_STAMP_IMAGE) {\r
+  if (mOutImageType == FW_SET_STAMP_IMAGE) {\r
     Status = SetStamp (FileBuffer, TimeStamp);\r
     if (EFI_ERROR (Status)) {\r
       goto Finish;\r
@@ -2271,7 +2266,7 @@ Returns:
   //\r
   // Extract acpi data from pe image.\r
   //\r
-  if (OutImageType == FW_ACPI_IMAGE) {\r
+  if (mOutImageType == FW_ACPI_IMAGE) {\r
     SectionHeader = (EFI_IMAGE_SECTION_HEADER *) ((UINT8 *) &(PeHdr->Pe32.OptionalHeader) + PeHdr->Pe32.FileHeader.SizeOfOptionalHeader);\r
     for (Index = 0; Index < PeHdr->Pe32.FileHeader.NumberOfSections; Index ++, SectionHeader ++) {\r
       if (strcmp ((char *)SectionHeader->Name, ".data") == 0 || strcmp ((char *)SectionHeader->Name, ".sdata") == 0) {\r
@@ -2292,7 +2287,7 @@ Returns:
         //\r
         // Output Apci data to file\r
         //\r
-        memcpy (FileBuffer, FileBuffer + SectionHeader->PointerToRawData, FileLength);\r
+        memmove (FileBuffer, FileBuffer + SectionHeader->PointerToRawData, FileLength);\r
         VerboseMsg ("the size of output file is %u bytes", (unsigned) FileLength);\r
         goto WriteFile;\r
       }\r
@@ -2331,19 +2326,20 @@ Returns:
 \r
   if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->Pe32.OptionalHeader;\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
+    if (!KeepOptionalHeaderFlag) {\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
     TEImageHeader.AddressOfEntryPoint = Optional32->AddressOfEntryPoint;\r
     TEImageHeader.BaseOfCode          = Optional32->BaseOfCode;\r
     TEImageHeader.ImageBase           = (UINT64) (Optional32->ImageBase);\r
@@ -2423,19 +2419,20 @@ Returns:
     }\r
   } else if (PeHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
     Optional64 = (EFI_IMAGE_OPTIONAL_HEADER64 *)&PeHdr->Pe32.OptionalHeader;\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
+    if (!KeepOptionalHeaderFlag) {\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
     TEImageHeader.AddressOfEntryPoint = Optional64->AddressOfEntryPoint;\r
     TEImageHeader.BaseOfCode          = Optional64->BaseOfCode;\r
     TEImageHeader.ImageBase           = (UINT64) (Optional64->ImageBase);\r
@@ -2537,7 +2534,7 @@ Returns:
     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress == 0) && \\r
     (TEImageHeader.DataDirectory[EFI_TE_IMAGE_DIRECTORY_ENTRY_BASERELOC].Size == 0)) {\r
       //\r
-      // PeImage can be loaded into memory, but it has no relocation section. \r
+      // PeImage can be loaded into memory, but it has no relocation section.\r
       // Fix TeImage Header to set VA of relocation data directory to not zero, the size is still zero.\r
       //\r
       if (Optional32 != NULL) {\r
@@ -2599,7 +2596,7 @@ Returns:
   //\r
   ZeroDebugData (FileBuffer, FALSE);\r
 \r
-  if (OutImageType == FW_TE_IMAGE) {\r
+  if (mOutImageType == FW_TE_IMAGE) {\r
     if ((PeHdr->Pe32.FileHeader.NumberOfSections &~0xFF) || (Type &~0xFF)) {\r
       //\r
       // Pack the subsystem and NumberOfSections into 1 byte. Make sure they fit both.\r
@@ -2622,7 +2619,7 @@ Returns:
     // Update Image to TeImage\r
     //\r
     FileLength = FileLength - TEImageHeader.StrippedSize;\r
-    memcpy (FileBuffer + sizeof (EFI_TE_IMAGE_HEADER), FileBuffer + TEImageHeader.StrippedSize, FileLength);\r
+    memmove (FileBuffer + sizeof (EFI_TE_IMAGE_HEADER), FileBuffer + TEImageHeader.StrippedSize, FileLength);\r
     FileLength = FileLength + sizeof (EFI_TE_IMAGE_HEADER);\r
     memcpy (FileBuffer, &TEImageHeader, sizeof (EFI_TE_IMAGE_HEADER));\r
     VerboseMsg ("the size of output file is %u bytes", (unsigned) (FileLength));\r
@@ -2658,7 +2655,7 @@ WriteFile:
       //\r
       // Update File when File is changed.\r
       //\r
-      fpInOut = fopen (mInImageName, "wb");\r
+      fpInOut = fopen (LongFilePath (mInImageName), "wb");\r
       if (fpInOut == NULL) {\r
         Error (NULL, 0, 0001, "Error opening file", mInImageName);\r
         goto Finish;\r
@@ -2671,7 +2668,7 @@ WriteFile:
       //\r
       // Update File when File is changed or File is old.\r
       //\r
-      fpOut = fopen (OutImageName, "wb");\r
+      fpOut = fopen (LongFilePath (OutImageName), "wb");\r
       if (fpOut == NULL) {\r
         Error (NULL, 0, 0001, "Error opening output file", OutImageName);\r
         goto Finish;\r
@@ -2713,13 +2710,13 @@ Finish:
       if (OutputFileBuffer == NULL) {\r
         remove (OutImageName);\r
       } else {\r
-        fpOut = fopen (OutImageName, "wb");\r
+        fpOut = fopen (LongFilePath (OutImageName), "wb");\r
         fwrite (OutputFileBuffer, 1, OutputFileLength, fpOut);\r
         fclose (fpOut);\r
       }\r
     }\r
   }\r
-  \r
+\r
   if (InputFileBuffer != NULL) {\r
     free (InputFileBuffer);\r
   }\r
@@ -2738,8 +2735,8 @@ Finish:
     ReportFileName = (CHAR8 *) malloc (FileLen + 1);\r
     if (ReportFileName != NULL) {\r
       strcpy (ReportFileName, OutImageName);\r
-      strcpy (ReportFileName + (FileLen - 4), ".txt"); \r
-      ReportFile = fopen (ReportFileName, "w+");\r
+      strcpy (ReportFileName + (FileLen - 4), ".txt");\r
+      ReportFile = fopen (LongFilePath (ReportFileName), "w+");\r
       if (ReportFile != NULL) {\r
         fprintf (ReportFile, "MODULE_SIZE = %u\n", (unsigned) mImageSize);\r
         fprintf (ReportFile, "TIME_STAMP = %u\n", (unsigned) mImageTimeStamp);\r
@@ -2779,6 +2776,7 @@ Returns:
 {\r
   UINT32                           Index;\r
   UINT32                           DebugDirectoryEntryRva;\r
+  UINT32                           DebugDirectoryEntrySize;\r
   UINT32                           DebugDirectoryEntryFileOffset;\r
   UINT32                           ExportDirectoryEntryRva;\r
   UINT32                           ExportDirectoryEntryFileOffset;\r
@@ -2790,12 +2788,14 @@ Returns:
   EFI_IMAGE_OPTIONAL_HEADER64     *Optional64Hdr;\r
   EFI_IMAGE_SECTION_HEADER        *SectionHeader;\r
   EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *DebugEntry;\r
-  UINT32                          *NewTimeStamp;  \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
@@ -2817,8 +2817,9 @@ Returns:
   // 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
@@ -2831,13 +2832,13 @@ Returns:
     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
@@ -2850,6 +2851,7 @@ Returns:
     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
@@ -2895,11 +2897,30 @@ Returns:
 \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 (mIsConvertXip) {\r
+        DebugEntry->FileOffset = DebugEntry->RVA;\r
+      }\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_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
@@ -2947,7 +2968,7 @@ Returns:
   EFI_IMAGE_OPTIONAL_HEADER64     *Optional64Hdr;\r
   EFI_IMAGE_SECTION_HEADER        *SectionHeader;\r
   UINT32                          *NewTimeStamp;\r
-  \r
+\r
   //\r
   // Init variable.\r
   //\r
@@ -3049,8 +3070,10 @@ Returns:
   }\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
@@ -3165,7 +3188,7 @@ Returns:
 {\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