]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Capsule/GenerateWindowsDriver.py
BaseTools/Capsule: Tool to generate Windows Firmware Update Driver
[mirror_edk2.git] / BaseTools / Source / Python / Capsule / GenerateWindowsDriver.py
CommitLineData
48d8d4d8
JE
1## @file\r
2# Generate a capsule windows driver.\r
3#\r
4# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>\r
5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
6#\r
7\r
8'''\r
9GenerateWindowsDriver\r
10'''\r
11\r
12import sys\r
13import argparse\r
14import uuid\r
15import struct\r
16import subprocess\r
17import os\r
18import tempfile\r
19import shutil\r
20import platform\r
21import re\r
22import logging\r
23from WindowsCapsuleSupportHelper import WindowsCapsuleSupportHelper\r
24from Common.Uefi.Capsule.FmpCapsuleHeader import FmpCapsuleHeaderClass\r
25from Common.Uefi.Capsule.UefiCapsuleHeader import UefiCapsuleHeaderClass\r
26\r
27#\r
28# Globals for help information\r
29#\r
30__prog__ = 'GenerateWindowsDriver'\r
31__version__ = '0.0'\r
32__copyright__ = 'Copyright (c) 2019, Intel Corporation. All rights reserved.'\r
33__description__ = 'Generate Capsule Windows Driver.\n'\r
34\r
35def GetCapGuid (InputFile):\r
36 with open(InputFile, 'rb') as File:\r
37 Buffer = File.read()\r
38 try:\r
39 Result = UefiCapsuleHeader.Decode (Buffer)\r
40 if len (Result) > 0:\r
41 FmpCapsuleHeader.Decode (Result)\r
42 for index in range (0, FmpCapsuleHeader.PayloadItemCount):\r
43 Guid = FmpCapsuleHeader.GetFmpCapsuleImageHeader (index).UpdateImageTypeId\r
44 return Guid\r
45 except:\r
46 print ('GenerateCapsule: error: can not decode capsule')\r
47 sys.exit (1)\r
48\r
49def ArgCheck(args):\r
50 Version = args.CapsuleVersion_DotString.split('.')\r
51\r
52 if len(Version) != 4:\r
53 logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)\r
54 raise ValueError("Name invalid.")\r
55 for sub in Version:\r
56 if int(sub, 16) > 65536:\r
57 logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)\r
58 raise ValueError("Name exceed limit 65536.")\r
59\r
60 if not (re.compile(r'[\a-fA-F0-9]*$')).match(args.CapsuleVersion_DotString):\r
61 logging.critical("Name invalid: '%s'", args.CapsuleVersion_DotString)\r
62 raise ValueError("Name has invalid chars.")\r
63\r
64def CapsuleGuidCheck(InputFile, Guid):\r
65 CapGuid = GetCapGuid(InputFile)\r
66 if (str(Guid).lower() != str(CapGuid)):\r
67 print('GenerateWindowsDriver error: Different Guid from Capsule')\r
68 sys.exit(1)\r
69\r
70if __name__ == '__main__':\r
71 def convert_arg_line_to_args(arg_line):\r
72 for arg in arg_line.split():\r
73 if not arg.strip():\r
74 continue\r
75 yield arg\r
76\r
77 parser = argparse.ArgumentParser (\r
78 prog = __prog__,\r
79 description = __description__ + __copyright__,\r
80 conflict_handler = 'resolve',\r
81 fromfile_prefix_chars = '@'\r
82 )\r
83 parser.convert_arg_line_to_args = convert_arg_line_to_args\r
84 parser.add_argument("--output-folder", dest = 'OutputFolder', help = "firmware resource update driver package output folder.")\r
85 parser.add_argument("--product-fmp-guid", dest = 'ProductFmpGuid', help = "firmware GUID of resource update driver package")\r
86 parser.add_argument("--capsuleversion-dotstring", dest = 'CapsuleVersion_DotString', help = "firmware version with date on which update driver package is authored")\r
87 parser.add_argument("--capsuleversion-hexstring", dest = 'CapsuleVersion_HexString', help = "firmware version in Hex of update driver package")\r
88 parser.add_argument("--product-fw-provider", dest = 'ProductFwProvider', help = "vendor/provider of entire firmware resource update driver package")\r
89 parser.add_argument("--product-fw-mfg-name", dest = 'ProductFwMfgName', help = "manufacturer/vendor of firmware resource update driver package")\r
90 parser.add_argument("--product-fw-desc", dest = "ProductFwDesc", help = "description about resource update driver")\r
91 parser.add_argument("--capsule-file-name", dest = 'CapsuleFileName', help ="firmware resource image file")\r
92 parser.add_argument("--pfx-file", dest = 'PfxFile', help = "pfx file path used to sign resource update driver")\r
93 parser.add_argument("--arch", dest = 'Arch', help = "supported architecture:arm/x64/amd64/arm64/aarch64", default = 'amd64')\r
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")\r
95\r
96 args = parser.parse_args()\r
97 InputFile = os.path.join(args.OutputFolder, '') + args.CapsuleFileName\r
98 UefiCapsuleHeader = UefiCapsuleHeaderClass ()\r
99 FmpCapsuleHeader = FmpCapsuleHeaderClass ()\r
100 CapsuleGuidCheck(InputFile, args.ProductFmpGuid)\r
101 ArgCheck(args)\r
102 ProductName = os.path.splitext(args.CapsuleFileName)[0]\r
103 WindowsDriver = WindowsCapsuleSupportHelper ()\r
104\r
105 WindowsDriver.PackageWindowsCapsuleFiles (\r
106 args.OutputFolder,\r
107 ProductName,\r
108 args.ProductFmpGuid,\r
109 args.CapsuleVersion_DotString,\r
110 args.CapsuleVersion_HexString,\r
111 args.ProductFwProvider,\r
112 args.ProductFwMfgName,\r
113 args.ProductFwDesc,\r
114 args.CapsuleFileName,\r
115 args.PfxFile,\r
116 None,\r
117 None,\r
118 args.Arch,\r
119 args.OperatingSystemString\r
120 )\r