## @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: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 | |
) |