2019-08-12 15:45:12 +08:00
## @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 " )
2025-09-17 14:24:49 -07:00
parser . add_argument ( " --arch " , dest = ' Arch ' , help = " supported architecture:x64/amd64/arm64/aarch64 " , default = ' amd64 ' )
2019-08-12 15:45:12 +08:00
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
)