2 # Generate a capsule windows driver.
4 # Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
5 # SPDX-License-Identifier: BSD-2-Clause-Patent
23 from WindowsCapsuleSupportHelper
import WindowsCapsuleSupportHelper
24 from Common
.Uefi
.Capsule
.FmpCapsuleHeader
import FmpCapsuleHeaderClass
25 from Common
.Uefi
.Capsule
.UefiCapsuleHeader
import UefiCapsuleHeaderClass
28 # Globals for help information
30 __prog__
= 'GenerateWindowsDriver'
32 __copyright__
= 'Copyright (c) 2019, Intel Corporation. All rights reserved.'
33 __description__
= 'Generate Capsule Windows Driver.\n'
35 def GetCapGuid (InputFile
):
36 with
open(InputFile
, 'rb') as File
:
39 Result
= UefiCapsuleHeader
.Decode (Buffer
)
41 FmpCapsuleHeader
.Decode (Result
)
42 for index
in range (0, FmpCapsuleHeader
.PayloadItemCount
):
43 Guid
= FmpCapsuleHeader
.GetFmpCapsuleImageHeader (index
).UpdateImageTypeId
46 print ('GenerateCapsule: error: can not decode capsule')
50 Version
= args
.CapsuleVersion_DotString
.split('.')
53 logging
.critical("Name invalid: '%s'", args
.CapsuleVersion_DotString
)
54 raise ValueError("Name invalid.")
56 if int(sub
, 16) > 65536:
57 logging
.critical("Name invalid: '%s'", args
.CapsuleVersion_DotString
)
58 raise ValueError("Name exceed limit 65536.")
60 if not (re
.compile(r
'[\a-fA-F0-9]*$')).match(args
.CapsuleVersion_DotString
):
61 logging
.critical("Name invalid: '%s'", args
.CapsuleVersion_DotString
)
62 raise ValueError("Name has invalid chars.")
64 def CapsuleGuidCheck(InputFile
, Guid
):
65 CapGuid
= GetCapGuid(InputFile
)
66 if (str(Guid
).lower() != str(CapGuid
)):
67 print('GenerateWindowsDriver error: Different Guid from Capsule')
70 if __name__
== '__main__':
71 def convert_arg_line_to_args(arg_line
):
72 for arg
in arg_line
.split():
77 parser
= argparse
.ArgumentParser (
79 description
= __description__
+ __copyright__
,
80 conflict_handler
= 'resolve',
81 fromfile_prefix_chars
= '@'
83 parser
.convert_arg_line_to_args
= convert_arg_line_to_args
84 parser
.add_argument("--output-folder", dest
= 'OutputFolder', help = "firmware resource update driver package output folder.")
85 parser
.add_argument("--product-fmp-guid", dest
= 'ProductFmpGuid', help = "firmware GUID of resource update driver package")
86 parser
.add_argument("--capsuleversion-dotstring", dest
= 'CapsuleVersion_DotString', help = "firmware version with date on which update driver package is authored")
87 parser
.add_argument("--capsuleversion-hexstring", dest
= 'CapsuleVersion_HexString', help = "firmware version in Hex of update driver package")
88 parser
.add_argument("--product-fw-provider", dest
= 'ProductFwProvider', help = "vendor/provider of entire firmware resource update driver package")
89 parser
.add_argument("--product-fw-mfg-name", dest
= 'ProductFwMfgName', help = "manufacturer/vendor of firmware resource update driver package")
90 parser
.add_argument("--product-fw-desc", dest
= "ProductFwDesc", help = "description about resource update driver")
91 parser
.add_argument("--capsule-file-name", dest
= 'CapsuleFileName', help ="firmware resource image file")
92 parser
.add_argument("--pfx-file", dest
= 'PfxFile', help = "pfx file path used to sign resource update driver")
93 parser
.add_argument("--arch", dest
= 'Arch', help = "supported architecture:arm/x64/amd64/arm64/aarch64", default
= 'amd64')
94 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")
96 args
= parser
.parse_args()
97 InputFile
= os
.path
.join(args
.OutputFolder
, '') + args
.CapsuleFileName
98 UefiCapsuleHeader
= UefiCapsuleHeaderClass ()
99 FmpCapsuleHeader
= FmpCapsuleHeaderClass ()
100 CapsuleGuidCheck(InputFile
, args
.ProductFmpGuid
)
102 ProductName
= os
.path
.splitext(args
.CapsuleFileName
)[0]
103 WindowsDriver
= WindowsCapsuleSupportHelper ()
105 WindowsDriver
.PackageWindowsCapsuleFiles (
109 args
.CapsuleVersion_DotString
,
110 args
.CapsuleVersion_HexString
,
111 args
.ProductFwProvider
,
112 args
.ProductFwMfgName
,
114 args
.CapsuleFileName
,
119 args
.OperatingSystemString