mirror of
https://github.com/platomav/BIOSUtilities.git
synced 2025-05-13 06:34:42 -04:00

Added AMI PFAT nested detection at each file Added Award BIOS payload naming at each file Switched Panasonic BIOS LZNT1 external library Improved Panasonic LZNT1 detection and length Improved Dell PFS code structure and fixed bugs Improved code exception handling (raise, catch) Improved code definitions (PEP8, docs, types) Fixed some arguments missing from help screens
60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
#!/usr/bin/env python3 -B
|
|
# coding=utf-8
|
|
|
|
"""
|
|
Copyright (C) 2022-2024 Plato Mavropoulos
|
|
"""
|
|
|
|
import os
|
|
import subprocess
|
|
|
|
from common.externals import get_tiano_path
|
|
from common.system import printer
|
|
|
|
|
|
def get_compress_sizes(data):
|
|
""" Get EFI compression sizes """
|
|
|
|
size_compress = int.from_bytes(data[0x0:0x4], 'little')
|
|
size_original = int.from_bytes(data[0x4:0x8], 'little')
|
|
|
|
return size_compress, size_original
|
|
|
|
|
|
def is_efi_compressed(data, strict=True):
|
|
""" Check if data is EFI compressed, controlling EOF padding """
|
|
|
|
size_comp, size_orig = get_compress_sizes(data)
|
|
|
|
check_diff = size_comp < size_orig
|
|
|
|
if strict:
|
|
check_size = size_comp + 0x8 == len(data)
|
|
else:
|
|
check_size = size_comp + 0x8 <= len(data)
|
|
|
|
return check_diff and check_size
|
|
|
|
|
|
def efi_decompress(in_path, out_path, padding=0, silent=False, comp_type='--uefi'):
|
|
""" EFI/Tiano Decompression via TianoCompress """
|
|
|
|
try:
|
|
subprocess.run([get_tiano_path(), '-d', in_path, '-o', out_path, '-q', comp_type],
|
|
check=True, stdout=subprocess.DEVNULL)
|
|
|
|
with open(in_path, 'rb') as file:
|
|
_, size_orig = get_compress_sizes(file.read())
|
|
|
|
if os.path.getsize(out_path) != size_orig:
|
|
raise OSError('EFI decompressed file & header size mismatch!')
|
|
except Exception as error: # pylint: disable=broad-except
|
|
if not silent:
|
|
printer(f'Error: TianoCompress could not extract file {in_path}: {error}!', padding)
|
|
|
|
return 1
|
|
|
|
if not silent:
|
|
printer('Succesfull EFI decompression via TianoCompress!', padding)
|
|
|
|
return 0
|