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