import Ffs\r
from GenFdsGlobalVariable import GenFdsGlobalVariable\r
import StringIO\r
+from struct import pack\r
+import os\r
+from Common.Misc import SaveFileOnChange\r
\r
## base class for capsule data\r
#\r
# @retval string Generated file name\r
#\r
def GenCapsuleSubItem(self):\r
- return self.FileName
\ No newline at end of file
+ return self.FileName\r
+\r
+class CapsulePayload(CapsuleData):\r
+ '''Generate payload file, the header is defined below:\r
+ #pragma pack(1)\r
+ typedef struct {\r
+ UINT32 Version;\r
+ EFI_GUID UpdateImageTypeId;\r
+ UINT8 UpdateImageIndex;\r
+ UINT8 reserved_bytes[3];\r
+ UINT32 UpdateImageSize;\r
+ UINT32 UpdateVendorCodeSize;\r
+ UINT64 UpdateHardwareInstance; //Introduced in v2\r
+ } EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER;\r
+ '''\r
+ def __init__(self):\r
+ self.UiName = None\r
+ self.Version = None\r
+ self.ImageTypeId = None\r
+ self.ImageIndex = None\r
+ self.HardwareInstance = None\r
+ self.ImageFile = None\r
+ self.VendorCodeFile = None\r
+\r
+ def GenCapsuleSubItem(self):\r
+ if not self.Version:\r
+ self.Version = 0x00000002\r
+ ImageFileSize = os.path.getsize(self.ImageFile)\r
+ VendorFileSize = 0\r
+ if self.VendorCodeFile:\r
+ VendorFileSize = os.path.getsize(self.VendorCodeFile)\r
+\r
+ #\r
+ # Fill structure\r
+ #\r
+ Guid = self.ImageTypeId.split('-')\r
+ Buffer = pack('=ILHHBBBBBBBBBBBBIIQ',\r
+ int(self.Version,16),\r
+ int(Guid[0], 16), \r
+ int(Guid[1], 16), \r
+ int(Guid[2], 16), \r
+ int(Guid[3][-4:-2], 16), \r
+ int(Guid[3][-2:], 16), \r
+ int(Guid[4][-12:-10], 16),\r
+ int(Guid[4][-10:-8], 16),\r
+ int(Guid[4][-8:-6], 16),\r
+ int(Guid[4][-6:-4], 16),\r
+ int(Guid[4][-4:-2], 16),\r
+ int(Guid[4][-2:], 16),\r
+ int(self.ImageIndex, 16),\r
+ 0,\r
+ 0,\r
+ 0,\r
+ ImageFileSize,\r
+ VendorFileSize,\r
+ int(self.HardwareInstance, 16)\r
+ )\r
+ #\r
+ # Append file content to the structure\r
+ #\r
+ ImageFile = open(self.ImageFile, 'rb')\r
+ Buffer += ImageFile.read()\r
+ ImageFile.close()\r
+ if self.VendorCodeFile:\r
+ VendorFile = open(self.VendorCodeFile, 'rb')\r
+ Buffer += VendorFile.read()\r
+ VendorFile.close()\r
+ return Buffer\r