diff options
author | Peter Lemenkov <lemenkov@gmail.com> | 2009-07-23 23:46:34 +0400 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-12-17 14:52:44 +0100 |
commit | fec24c92f7008661593b2382755f677011af54a8 (patch) | |
tree | 05e6e977d6ee2dca50eda5a6354f3456ddce14bf | |
parent | b156725ecdad2538a3c7688cd3d2cee419a5dc59 (diff) |
New version of endian patch.
I removed #ifdefs completely, since they already exists in <endian.h>,
so we may simply (and safely) use htole[16,32]/le[16,32]toh. I also fixed
nasty typo in my prevoius patch - I should use le[16,32]to h rather than
htole[16,32]. However this renders to correct results,also, since both of
them are actually just #defines around bswap_[16,32].
Also, I found one phoenix BIOS image and therefore was able to fix extraction
from it on PowerPC. See patch.
Signed-off-by: Peter Lemenkov <lemenkov@gmail.com>
-rw-r--r-- | lh5_extract.c | 9 | ||||
-rw-r--r-- | phoenix.c | 33 |
2 files changed, 22 insertions, 20 deletions
diff --git a/lh5_extract.c b/lh5_extract.c index 60ecd48..b3e2d98 100644 --- a/lh5_extract.c +++ b/lh5_extract.c @@ -32,6 +32,7 @@ #include <stdio.h> #include <string.h> #include <stdlib.h> +#include <endian.h> #include "lh5_extract.h" @@ -129,18 +130,18 @@ LH5HeaderParse(unsigned char *Buffer, int BufferSize, return 0; } - *packed_size = *(unsigned int *) (Buffer + 7); - *original_size = *(unsigned int *) (Buffer + 11); + *packed_size = le32toh(*(unsigned int *) (Buffer + 7)); + *original_size = le32toh(*(unsigned int *) (Buffer + 11)); name_length = Buffer[21]; *name = strndup((char *) Buffer + 22, name_length); - *crc = *(unsigned short *) (Buffer + 22 + name_length); + *crc = le16toh(*(unsigned short *) (Buffer + 22 + name_length)); offset = header_size + 2; /* Skip extended headers */ while (1) { - unsigned short extend_size = *(unsigned short *) (Buffer + offset - 2); + unsigned short extend_size = le16toh(*(unsigned short *) (Buffer + offset - 2)); if (!extend_size) break; @@ -26,6 +26,7 @@ #include <errno.h> #include <sys/stat.h> #include <sys/mman.h> +#include <endian.h> #include "bios_extract.h" #include "lh5_extract.h" @@ -108,10 +109,10 @@ PhoenixModule(unsigned char *BIOSImage, int BIOSLength, int Offset) return 0; } - if ((Offset + Module->HeadLen + 4 + Module->Packed1) > BIOSLength) { + if ((Offset + Module->HeadLen + 4 + le32toh(Module->Packed1)) > BIOSLength) { fprintf(stderr, "Error: Module overruns buffer at 0x%05X\n", Offset); - return Module->Previous; + return le32toh(Module->Previous); } ModuleName = PhoenixModuleNameGet(Module->Type); @@ -134,47 +135,47 @@ PhoenixModule(unsigned char *BIOSImage, int BIOSLength, int Offset) switch (Module->Compression) { case 5: /* LH5 */ printf("0x%05X (%6d bytes) -> %s\t(%d bytes)", Offset + Module->HeadLen + 4, - Module->Packed1, filename, Module->ExpLen1); + le32toh(Module->Packed1), filename, le32toh(Module->ExpLen1)); - Buffer = MMapOutputFile(filename, Module->ExpLen1); + Buffer = MMapOutputFile(filename, le32toh(Module->ExpLen1)); if (!Buffer) break; LH5Decode(BIOSImage + Offset + Module->HeadLen + 4, - Module->Packed1, Buffer, Module->ExpLen1); + le32toh(Module->Packed1), Buffer, le32toh(Module->ExpLen1)); - munmap(Buffer, Module->ExpLen1); + munmap(Buffer, le32toh(Module->ExpLen1)); break; /* case 3 */ /* LZSS */ case 0: /* not compressed at all */ /* why do we not use the full header here? */ printf("0x%05X (%6d bytes) -> %s", Offset + Module->HeadLen, - Module->Packed1, filename); + le32toh(Module->Packed1), filename); - write(fd, BIOSImage + Offset + Module->HeadLen, Module->Packed1); + write(fd, BIOSImage + Offset + Module->HeadLen, le32toh(Module->Packed1)); break; default: fprintf(stderr, "Unsupported compression type for %s: %d\n", filename, Module->Compression); printf("0x%05X (%6d bytes) -> %s\t(%d bytes)", Offset + Module->HeadLen + 4, - Module->Packed1, filename, Module->ExpLen1); + le32toh(Module->Packed1), filename, le32toh(Module->ExpLen1)); - write(fd, BIOSImage + Offset + Module->HeadLen + 4, Module->Packed1); + write(fd, BIOSImage + Offset + Module->HeadLen + 4, le32toh(Module->Packed1)); break; } close(fd); free(filename); - if (Module->Offset || Module->Segment) { + if (le16toh(Module->Offset) || le16toh(Module->Segment)) { if (!Module->Compression) printf("\t\t"); - printf("\t [0x%04X:0x%04X]\n", Module->Segment << 12, Module->Offset); + printf("\t [0x%04X:0x%04X]\n", le16toh(Module->Segment) << 12, le16toh(Module->Offset)); } else printf("\n"); - return Module->Previous; + return le32toh(Module->Previous); } /* @@ -195,11 +196,11 @@ PhoenixExtract(unsigned char *BIOSImage, int BIOSLength, int BIOSOffset, for (ID = (struct PhoenixID *) (BIOSImage + BCPSegmentOffset + 10); ((void *) ID < (void *) (BIOSImage + BIOSLength)) && ID->Name[0]; - ID = (struct PhoenixID *) (((unsigned char *) ID) + ID->Length)) { + ID = (struct PhoenixID *) (((unsigned char *) ID) + le16toh(ID->Length))) { #if 0 printf("PhoenixID: Name %c%c%c%c%c%c, Flags 0x%04X, Length %d\n", ID->Name[0], ID->Name[1], ID->Name[2], ID->Name[3], - ID->Name[4], ID->Name[5], ID->Flags, ID->Length); + ID->Name[4], ID->Name[5], le16toh(ID->Flags), le16toh(ID->Length)); #endif if (!strncmp(ID->Name, "BCPSYS", 6)) break; @@ -224,7 +225,7 @@ PhoenixExtract(unsigned char *BIOSImage, int BIOSLength, int BIOSOffset, printf("Version \"%s\", created on %s at %s.\n", Version, Date, Time); } - Offset = *((uint32_t *) (((char *) ID) + 0x77)); + Offset = le32toh(*((uint32_t *) (((char *) ID) + 0x77))); Offset &= (BIOSLength - 1); if (!Offset) { fprintf(stderr, "Error: retrieved invalid Modules offset.\n"); |