]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py
BaseTools/Capsule: Tool to generate Windows Firmware Update Driver
[mirror_edk2.git] / BaseTools / Source / Python / Capsule / GenerateWindowsDriver.py
diff --git a/BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py b/BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py
new file mode 100644 (file)
index 0000000..bea7a0d
--- /dev/null
@@ -0,0 +1,120 @@
+## @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