From c07e897df4b1d64307550049d08ebcbbe258e593 Mon Sep 17 00:00:00 2001 From: Peter Lemenkov Date: Sat, 1 Aug 2009 20:55:17 +0400 Subject: [PATCH] Fix for endianness in AMI extraction routines. Subj. Since I finally found AMI bios images among other ~ 2.5 Gbytes of proprietary bioses. Signed-off-by: Peter Lemenkov diff --git a/ami.c b/ami.c index 108ef1e..88a00d4 100644 --- a/ami.c +++ b/ami.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "bios_extract.h" #include "lh5_extract.h" @@ -177,7 +178,7 @@ AMI95Extract(unsigned char *BIOSImage, int BIOSLength, int BIOSOffset, } /* now dump the individual modules */ - Offset = (abc->BeginHi << 4) + abc->BeginLo; + Offset = (le16toh(abc->BeginHi) << 4) + le16toh(abc->BeginLo); for (i = 0; i < 0x80; i++) { char filename[64], *ModuleName; @@ -198,15 +199,15 @@ AMI95Extract(unsigned char *BIOSImage, int BIOSLength, int BIOSOffset, sprintf(filename, "amibody_%02x.rom", part->PartID); if (Compressed) - printf("0x%05X (%6d bytes)", Offset - BIOSOffset + 0x14, part->ROMSize); + printf("0x%05X (%6d bytes)", Offset - BIOSOffset + 0x14, le32toh(part->ROMSize)); else - printf("0x%05X (%6d bytes)", Offset - BIOSOffset + 0x0C, part->CSize); + printf("0x%05X (%6d bytes)", Offset - BIOSOffset + 0x0C, le16toh(part->CSize)); printf(" -> %s", filename); if (part->PartID != 0x20) printf(" "); if (Compressed) - printf(" (%5d bytes)", part->ExpSize); + printf(" (%5d bytes)", le32toh(part->ExpSize)); else printf("\t\t"); @@ -217,25 +218,25 @@ AMI95Extract(unsigned char *BIOSImage, int BIOSLength, int BIOSOffset, printf("\n"); if (Compressed) - BufferSize = part->ExpSize; + BufferSize = le32toh(part->ExpSize); else - BufferSize = part->CSize; + BufferSize = le16toh(part->CSize); Buffer = MMapOutputFile(filename, BufferSize); if (!Buffer) return FALSE; if (Compressed) - LH5Decode(BIOSImage + (Offset - BIOSOffset) + 0x14, part->ROMSize, + LH5Decode(BIOSImage + (Offset - BIOSOffset) + 0x14, le32toh(part->ROMSize), Buffer, BufferSize); else memcpy(Buffer, BIOSImage + (Offset - BIOSOffset) + 0x0C, BufferSize); munmap(Buffer, BufferSize); - if ((part->PrePartHi == 0xFFFF) || (part->PrePartLo == 0xFFFF)) + if ((le16toh(part->PrePartHi) == 0xFFFF) || (le16toh(part->PrePartLo) == 0xFFFF)) break; - Offset = (part->PrePartHi << 4) + part->PrePartLo; + Offset = (le16toh(part->PrePartHi) << 4) + le16toh(part->PrePartLo); } return TRUE;