From f29896fc91a0f0fe8a3299553e38de58a76ad329 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 10 Apr 2022 20:21:35 -0300 Subject: [PATCH] bios_extract: Keep partially-decompressed AMI modules around --- bios_extract/src/ami.c | 46 ++++++++++++++++++++++++++++++++++++------ biostools/analyzers.py | 7 ++++--- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/bios_extract/src/ami.c b/bios_extract/src/ami.c index 2d92e4b..e98d8ab 100644 --- a/bios_extract/src/ami.c +++ b/bios_extract/src/ami.c @@ -122,6 +122,25 @@ static char *AMI95ModuleNameGet(uint8_t ID) return NULL; } +static Bool +IsAllZero(unsigned char *Buffer, int BufferSize) +{ + /* Optimized for x86, no idea about other architectures. */ + register uintptr_t *ip = (uintptr_t *) Buffer; + register uintptr_t *iq = (uintptr_t *) (Buffer + BufferSize - (BufferSize % sizeof(uintptr_t))); + while (ip < iq) { + if (*ip++) + return FALSE; + } + register unsigned char *p = (unsigned char *) ip; + register unsigned char *q = Buffer + BufferSize; + while (p < q) { + if (*p++) + return FALSE; + } + return TRUE; +} + /* * */ @@ -218,9 +237,14 @@ NotCompressed: if (Compressed) { if (LH5Decode(BIOSImage + Offset + 8, ROMSize, Buffer, BufferSize) == -1) { - Compressed = FALSE; + Compressed = IsAllZero(Buffer, BufferSize); munmap(Buffer, BufferSize); - unlink(filename); + if (Compressed) { + Compressed = FALSE; + unlink(filename); + } else { + strcpy(&filename[strlen(filename) - 3], "cmp"); + } goto NotCompressed; } } else @@ -355,9 +379,14 @@ NotCompressed: if (Compressed) { if (LH5Decode(BIOSImage + ABCOffset + part->RealCS + 8, ROMSize, Buffer, BufferSize) == -1) { - Compressed = FALSE; + Compressed = IsAllZero(Buffer, BufferSize); munmap(Buffer, BufferSize); - unlink(filename); + if (Compressed) { + Compressed = FALSE; + unlink(filename); + } else { + strcpy(&filename[strlen(filename) - 3], "cmp"); + } goto NotCompressed; } } else @@ -579,9 +608,14 @@ NotCompressed: if (Compressed) { if (LH5Decode(BIOSImage + NewOffset, ROMSize, Buffer, BufferSize) == -1) { - Compressed = FALSE; + Compressed = IsAllZero(Buffer, BufferSize); munmap(Buffer, BufferSize); - unlink(filename); + if (Compressed) { + Compressed = FALSE; + unlink(filename); + } else { + strcpy(&filename[strlen(filename) - 3], "cmp"); + } goto NotCompressed; } } else diff --git a/biostools/analyzers.py b/biostools/analyzers.py index ae0f709..caf828a 100644 --- a/biostools/analyzers.py +++ b/biostools/analyzers.py @@ -322,14 +322,15 @@ class AMIAnalyzer(Analyzer): self._check_pattern = re.compile(b'''American Megatrends Inc|AMIBIOSC| Access Methods Inc\\.|AMI- ([0-9]{2}/[0-9]{2}/[0-9]{2}) (?:IBM is a TM of IBM|[\\x00-\\xFF]{2} AMI-[^-]+-BIOS )''') self._date_pattern = re.compile(b'''([0-9]{2}/[0-9]{2}/[0-9]{2})[^0-9]''') self._uefi_csm_pattern = re.compile('''63-0100-000001-00101111-......-Chipset$''') - self._intel_86_pattern = re.compile('''(?:[0-9A-Z]{8})\.86(?:[0-9A-Z])\.(?:[0-9A-Z]{4})\.(?:[0-9A-Z]{3})\.(?:[0-9]{10})$''') + self._intel_86_pattern = re.compile('''(?:[0-9A-Z]{8})\\.86(?:[0-9A-Z])\\.(?:[0-9A-Z]{4})\\.(?:[0-9A-Z]{3})\\.(?:[0-9]{10})$''') # The "All Rights Reserved" is important to not catch the same header on other files. + # "All