+VOID\r
+SetHeaderChecksum (\r
+ IN EFI_FFS_FILE_HEADER *FfsHeader\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Caculate the checksum for the FFS header.\r
+\r
+ Parameters:\r
+ FfsHeader - FFS File Header which needs to caculate the checksum\r
+\r
+ Return:\r
+ N/A\r
+\r
+--*/\r
+{\r
+ EFI_FFS_FILE_STATE State;\r
+ UINT8 HeaderChecksum;\r
+ UINT8 FileChecksum;\r
+\r
+ //\r
+ // The state and the File checksum are not included\r
+ //\r
+ State = FfsHeader->State;\r
+ FfsHeader->State = 0;\r
+\r
+ FileChecksum = FfsHeader->IntegrityCheck.Checksum.File;\r
+ FfsHeader->IntegrityCheck.Checksum.File = 0;\r
+\r
+ FfsHeader->IntegrityCheck.Checksum.Header = 0;\r
+\r
+ HeaderChecksum = CalculateChecksum8 ((UINT8 *)FfsHeader,sizeof (EFI_FFS_FILE_HEADER));\r
+\r
+ FfsHeader->IntegrityCheck.Checksum.Header = (UINT8) (~(0x100-HeaderChecksum) + 1);\r
+\r
+ FfsHeader->State = State;\r
+ FfsHeader->IntegrityCheck.Checksum.File = FileChecksum;\r
+\r
+ return ;\r
+}\r
+\r
+VOID\r
+SetFileChecksum (\r
+ IN EFI_FFS_FILE_HEADER *FfsHeader,\r
+ IN UINTN ActualFileSize\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Caculate the checksum for the FFS File, usually it is caculated before\r
+ the file tail is set.\r
+\r
+ Parameters:\r
+ FfsHeader - FFS File Header which needs to caculate the checksum\r
+ ActualFileSize - The whole Ffs File Length, including the FFS Tail\r
+ if exists, but at this time, it is 0.\r
+ Return:\r
+ N/A\r
+\r
+--*/\r
+{\r
+ EFI_FFS_FILE_STATE State;\r
+ UINT8 FileChecksum;\r
+ UINTN ActualSize;\r
+\r
+ if (FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) {\r
+ //\r
+ // The file state is not included\r
+ //\r
+ State = FfsHeader->State;\r
+ FfsHeader->State = 0;\r
+\r
+ FfsHeader->IntegrityCheck.Checksum.File = 0;\r
+\r
+ if (FfsHeader->Attributes & FFS_ATTRIB_TAIL_PRESENT) {\r
+ ActualSize = ActualFileSize - 2;\r
+ } else {\r
+ ActualSize = ActualFileSize;\r
+ }\r
+ //\r
+ // File checksum does not including the file tail\r
+ //\r
+ FileChecksum = CalculateChecksum8 ((UINT8 *)FfsHeader,sizeof (EFI_FFS_FILE_HEADER));\r
+\r
+ FfsHeader->IntegrityCheck.Checksum.File = (UINT8) (~(0x100-FileChecksum) + 1);\r
+\r
+ FfsHeader->State = State;\r
+\r
+ } else {\r
+\r
+ FfsHeader->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
+\r
+ }\r
+\r
+ return ;\r
+}\r
+\r
+VOID\r
+SetFileTail (\r
+ IN EFI_FFS_FILE_HEADER *FfsHeader,\r
+ IN UINTN ActualFileSize\r
+ )\r
+/*++\r
+\r
+ Routine Description:\r
+ Set the file tail if needed\r
+\r
+ Parameters:\r
+ FfsHeader - FFS File Header which needs to caculate the checksum\r
+ ActualFileSize - The whole Ffs File Length, including the FFS Tail\r
+ if exists.\r
+ Return:\r
+ N/A\r
+\r
+--*/\r
+{\r
+ UINT8 TailLow;\r
+ UINT8 TailHigh;\r
+ UINT16 Tail;\r
+\r
+ if (FfsHeader->Attributes & FFS_ATTRIB_TAIL_PRESENT) {\r
+ //\r
+ // Insert tail here, since tail may not aligned on an even\r
+ // address, we need to do byte operation here.\r
+ //\r
+ Tail = (UINT16)~FfsHeader->IntegrityCheck.TailReference;\r
+ TailLow = (UINT8) Tail;\r
+ TailHigh = (UINT8) (Tail >> 8);\r
+ *((UINT8 *) FfsHeader + ActualFileSize - 2) = TailLow;\r
+ *((UINT8 *) FfsHeader + ActualFileSize - 1) = TailHigh;\r
+ }\r
+\r
+ return ;\r
+}\r