]>
Commit | Line | Data |
---|---|---|
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 | |
9 | GenerateWindowsDriver\r | |
10 | '''\r | |
11 | \r | |
12 | import sys\r | |
13 | import argparse\r | |
14 | import uuid\r | |
15 | import struct\r | |
16 | import subprocess\r | |
17 | import os\r | |
18 | import tempfile\r | |
19 | import shutil\r | |
20 | import platform\r | |
21 | import re\r | |
22 | import logging\r | |
23 | from WindowsCapsuleSupportHelper import WindowsCapsuleSupportHelper\r | |
24 | from Common.Uefi.Capsule.FmpCapsuleHeader import FmpCapsuleHeaderClass\r | |
25 | from 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 | |
35 | def 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 | |
49 | def 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 | |
64 | def 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 | |
70 | if __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 |