+ //\r
+ // Adjust section buffer when section alignment is required.\r
+ //\r
+ if (InputFileAlign != NULL) {\r
+ //\r
+ // Check this section is Te/Pe section, and Calculate the numbers of Te/Pe section.\r
+ //\r
+ TeOffset = 0;\r
+ //\r
+ // The section might be EFI_COMMON_SECTION_HEADER2\r
+ // But only Type needs to be checked\r
+ //\r
+ if (FileSize >= MAX_SECTION_SIZE) {\r
+ HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER2);\r
+ } else {\r
+ HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);\r
+ }\r
+ fread (&TempSectHeader, 1, HeaderSize, InFile);\r
+ if (TempSectHeader.Type == EFI_SECTION_TE) {\r
+ fread (&TeHeader, 1, sizeof (TeHeader), InFile);\r
+ if (TeHeader.Signature == EFI_TE_IMAGE_HEADER_SIGNATURE) {\r
+ TeOffset = TeHeader.StrippedSize - sizeof (TeHeader);\r
+ }\r
+ } else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {\r
+ fseek (InFile, 0, SEEK_SET);\r
+ if (FileSize >= MAX_SECTION_SIZE) {\r
+ fread (&GuidSectHeader2, 1, sizeof (GuidSectHeader2), InFile);\r
+ if ((GuidSectHeader2.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
+ HeaderSize = GuidSectHeader2.DataOffset;\r
+ }\r
+ } else {\r
+ fread (&GuidSectHeader, 1, sizeof (GuidSectHeader), InFile);\r
+ if ((GuidSectHeader.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
+ HeaderSize = GuidSectHeader.DataOffset;\r
+ }\r
+ }\r
+ } \r
+\r
+ fseek (InFile, 0, SEEK_SET);\r
+\r
+ //\r
+ // Revert TeOffset to the converse value relative to Alignment\r
+ // This is to assure the original PeImage Header at Alignment.\r
+ //\r
+ if (TeOffset != 0) {\r
+ TeOffset = InputFileAlign [Index] - (TeOffset % InputFileAlign [Index]);\r
+ TeOffset = TeOffset % InputFileAlign [Index];\r
+ }\r
+\r
+ //\r
+ // make sure section data meet its alignment requirement by adding one raw pad section.\r
+ //\r
+ if ((InputFileAlign [Index] != 0) && (((Size + HeaderSize + TeOffset) % InputFileAlign [Index]) != 0)) {\r
+ Offset = (Size + sizeof (EFI_COMMON_SECTION_HEADER) + HeaderSize + TeOffset + InputFileAlign [Index] - 1) & ~(InputFileAlign [Index] - 1);\r
+ Offset = Offset - Size - HeaderSize - TeOffset;\r
+ \r
+ if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {\r
+ //\r
+ // The maximal alignment is 64K, the raw section size must be less than 0xffffff\r
+ //\r
+ memset (FileBuffer + Size, 0, Offset);\r
+ SectHeader = (EFI_COMMON_SECTION_HEADER *) (FileBuffer + Size);\r
+ SectHeader->Type = EFI_SECTION_RAW;\r
+ SectHeader->Size[0] = (UINT8) (Offset & 0xff);\r
+ SectHeader->Size[1] = (UINT8) ((Offset & 0xff00) >> 8);\r
+ SectHeader->Size[2] = (UINT8) ((Offset & 0xff0000) >> 16);\r
+ }\r
+ DebugMsg (NULL, 0, 9, "Pad raw section for section data alignment", "Pad Raw section size is %u", (unsigned) Offset);\r
+\r
+ Size = Size + Offset;\r
+ }\r
+ }\r
+\r