+## @file\r
+# Generate a capsule windows driver.\r
+#\r
+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+\r
+'''\r
+GenerateWindowsDriver\r
+'''\r
+\r
+import sys\r
+import argparse\r
+import uuid\r
+import struct\r
+import subprocess\r
+import os\r
+import tempfile\r
+import shutil\r
+import platform\r
+import re\r
+import logging\r
+from WindowsCapsuleSupportHelper import WindowsCapsuleSupportHelper\r
+from Common.Uefi.Capsule.FmpCapsuleHeader import FmpCapsuleHeaderClass\r
+from Common.Uefi.Capsule.UefiCapsuleHeader import UefiCapsuleHeaderClass\r
+\r
+#\r
+# Globals for help information\r
+#\r
+__prog__ = 'GenerateWindowsDriver'\r
+__version__ = '0.0'\r
+__copyright__ = 'Copyright (c) 2019, Intel Corporation. All rights reserved.'\r
+__description__ = 'Generate Capsule Windows Driver.\n'\r
+\r
+def GetCapGuid (InputFile):\r
+ with open(InputFile, 'rb') as File:\r
+ Buffer = File.read()\r
+ try:\r
+ Result = UefiCapsuleHeader.Decode (Buffer)\r
+ if len (Result) > 0:\r
+ FmpCapsuleHeader.Decode (Result)\r
+ for index in range (0, FmpCapsuleHeader.PayloadItemCount):\r
+ Guid = FmpCapsuleHeader.GetFmpCapsuleImageHeader (index).UpdateImageTypeId\r
+ return Guid\r
+ except:\r
+ print ('GenerateCapsule: error: can not decode capsule')\r
+ sys.exit (1)\r
+\r
+def ArgCheck(args):\r
+ Version = args.CapsuleVersion_DotString.split('.')\r
+\r
+ if len(Version) != 4:\r
+ logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)\r
+ raise ValueError("Name invalid.")\r
+ for sub in Version:\r
+ if int(sub, 16) > 65536:\r
+ logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)\r
+ raise ValueError("Name exceed limit 65536.")\r
+\r
+ if not (re.compile(r'[\a-fA-F0-9]*$')).match(args.CapsuleVersion_DotString):\r
+ logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)\r
+ raise ValueError("Name has invalid chars.")\r
+\r
+def CapsuleGuidCheck(InputFile, Guid):\r
+ CapGuid = GetCapGuid(InputFile)\r
+ if (str(Guid).lower() != str(CapGuid)):\r
+ print('GenerateWindowsDriver error: Different Guid from Capsule')\r
+ sys.exit(1)\r
+\r
+if __name__ == '__main__':\r
+ def convert_arg_line_to_args(arg_line):\r
+ for arg in arg_line.split():\r
+ if not arg.strip():\r
+ continue\r
+ yield arg\r
+\r
+ parser = argparse.ArgumentParser (\r
+ prog = __prog__,\r
+ description = __description__ + __copyright__,\r
+ conflict_handler = 'resolve',\r
+ fromfile_prefix_chars = '@'\r
+ )\r
+ parser.convert_arg_line_to_args = convert_arg_line_to_args\r
+ parser.add_argument("--output-folder", dest = 'OutputFolder', help = "firmware resource update driver package output folder.")\r
+ parser.add_argument("--product-fmp-guid", dest = 'ProductFmpGuid', help = "firmware GUID of resource update driver package")\r
+ parser.add_argument("--capsuleversion-dotstring", dest = 'CapsuleVersion_DotString', help = "firmware version with date on which update driver package is authored")\r
+ parser.add_argument("--capsuleversion-hexstring", dest = 'CapsuleVersion_HexString', help = "firmware version in Hex of update driver package")\r
+ parser.add_argument("--product-fw-provider", dest = 'ProductFwProvider', help = "vendor/provider of entire firmware resource update driver package")\r
+ parser.add_argument("--product-fw-mfg-name", dest = 'ProductFwMfgName', help = "manufacturer/vendor of firmware resource update driver package")\r
+ parser.add_argument("--product-fw-desc", dest = "ProductFwDesc", help = "description about resource update driver")\r
+ parser.add_argument("--capsule-file-name", dest = 'CapsuleFileName', help ="firmware resource image file")\r
+ parser.add_argument("--pfx-file", dest = 'PfxFile', help = "pfx file path used to sign resource update driver")\r
+ parser.add_argument("--arch", dest = 'Arch', help = "supported architecture:arm/x64/amd64/arm64/aarch64", default = 'amd64')\r
+ parser.add_argument("--operating-system-string", dest = 'OperatingSystemString', help = "supported operating system:win10/10/10_au/10_rs2/10_rs3/10_rs4/server10/server2016/serverrs2/serverrs3/serverrs4", default = "win10")\r
+\r
+ args = parser.parse_args()\r
+ InputFile = os.path.join(args.OutputFolder, '') + args.CapsuleFileName\r
+ UefiCapsuleHeader = UefiCapsuleHeaderClass ()\r
+ FmpCapsuleHeader = FmpCapsuleHeaderClass ()\r
+ CapsuleGuidCheck(InputFile, args.ProductFmpGuid)\r
+ ArgCheck(args)\r
+ ProductName = os.path.splitext(args.CapsuleFileName)[0]\r
+ WindowsDriver = WindowsCapsuleSupportHelper ()\r
+\r
+ WindowsDriver.PackageWindowsCapsuleFiles (\r
+ args.OutputFolder,\r
+ ProductName,\r
+ args.ProductFmpGuid,\r
+ args.CapsuleVersion_DotString,\r
+ args.CapsuleVersion_HexString,\r
+ args.ProductFwProvider,\r
+ args.ProductFwMfgName,\r
+ args.ProductFwDesc,\r
+ args.CapsuleFileName,\r
+ args.PfxFile,\r
+ None,\r
+ None,\r
+ args.Arch,\r
+ args.OperatingSystemString\r
+ )\r