diff options
author | Luc Verhaegen <lverhaegen@ridcully.suse.de> | 2009-01-08 15:31:13 +0100 |
---|---|---|
committer | Luc Verhaegen <lverhaegen@ridcully.suse.de> | 2009-01-08 15:31:13 +0100 |
commit | d2151b17f4a1c1173ac511b3929ad9b0af5ee0db (patch) | |
tree | 5870a558d016e6bed6ab28aa16ff6177f721d275 | |
parent | 29b164f3af7f09845c2931c8956e2c7f338c151b (diff) |
Fix version handling.
Unify code for checking the AMIBIOS version.
Single switch statement now handles all the different versions.
Make offset calculation sensible by simple logical reduction.
-rw-r--r-- | src/amideco.c | 151 |
1 files changed, 84 insertions, 67 deletions
diff --git a/src/amideco.c b/src/amideco.c index c69b740..561f4e3 100644 --- a/src/amideco.c +++ b/src/amideco.c @@ -417,7 +417,7 @@ Xtract95(FILE *ptx, uint8_t Action, uint32_t ConstOff, uint32_t Offset, char *fn sLen = strlen(fname); for (i = sLen; i > 0; i--) - if(*(fname + i) == '/' || *(fname + i ) == '\\') { + if (*(fname + i) == '/' || *(fname + i ) == '\\') { i++; break; } @@ -432,7 +432,7 @@ Xtract95(FILE *ptx, uint8_t Action, uint32_t ConstOff, uint32_t Offset, char *fn if ((Action & 0x80) && (Action & 0x10)) { doDir = 1; - if(!mkdir(MyDirName, 0755)) + if (!mkdir(MyDirName, 0755)) printf("\nOperation mkdir() is permitted"); else printf("\nOperation mkdir() isn't permitted. Directory already exist?"); @@ -447,7 +447,7 @@ Xtract95(FILE *ptx, uint8_t Action, uint32_t ConstOff, uint32_t Offset, char *fn ); while((part.PrePartLo != 0xFFFF || part.PrePartHi != 0xFFFF) && PartTotal < 0x80) { - fseek(ptx, Offset-ConstOff, SEEK_SET); + fseek(ptx, Offset - ConstOff, SEEK_SET); fread(&part, 1, sizeof(part), ptx); PartTotal++; @@ -460,7 +460,7 @@ Xtract95(FILE *ptx, uint8_t Action, uint32_t ConstOff, uint32_t Offset, char *fn (part.IsComprs!=0x80) ? (part.ExpSize) : (part.CSize), (part.IsComprs!=0x80) ? (part.ExpSize) : (part.CSize), (part.IsComprs!=0x80) ? ("+") : (" "), - Offset-ConstOff); + Offset - ConstOff); break; case Xtract: /* Xtracting Part */ if (part.PartID == 0x20) { @@ -688,15 +688,11 @@ int main(int argc, char *argv[]) { FILE *ptx; - uint32_t fLen, i, RealRead = 0; - char Temp[] = "AMIBIOSC", *BufBlk; - char Buf[12]; + uint32_t fLen; ABCTag abc; char Date[9]; - uint32_t ConstOff, Offset, BODYOff = 0; - + uint32_t Offset; uint8_t AMIVer = 0; - uint8_t PartTotal = 0; uint8_t Action = 0; uint8_t HelpID = 0; @@ -730,87 +726,108 @@ main(int argc, char *argv[]) printf("FileLength\t: %X (%u bytes)\n", fLen, fLen); printf("FileName\t: %s\n", argv[1]); - /*------- Memory Alloc --------*/ - BufBlk = (char *) calloc(BLOCK, 1); - if(!BufBlk) - exit(1); - i = 0; - - while (!feof(ptx)) { - fseek(ptx, i, SEEK_SET); - RealRead = fread(BufBlk, 1, BLOCK, ptx); - if ((i = FoundAt(ptx, BufBlk, Temp, RealRead) ) != 0) { - fseek(ptx, i + 8, SEEK_SET); - fread(&abc, 1, sizeof(abc), ptx); - AMIVer = 95; - break; + /* + * Look for AMI bios header. + */ + { + char Temp[] = "AMIBIOSC"; + char *BufBlk = (char *) calloc(BLOCK, 1); + int i = 0; + + if (!BufBlk) + exit(1); + + while (!feof(ptx)) { + uint32_t RealRead; + + fseek(ptx, i, SEEK_SET); + RealRead = fread(BufBlk, 1, BLOCK, ptx); + if ((i = FoundAt(ptx, BufBlk, Temp, RealRead)) != 0) { + fseek(ptx, i + 8, SEEK_SET); + fread(&abc, 1, sizeof(abc), ptx); + AMIVer = 95; + break; + } + i = ftell(ptx) - 0x100; } - i = ftell(ptx) - 0x100; - } - if (AMIVer != 95) { - printf("AMI'95 hook not found..Turning to AMI'94\n"); - fseek(ptx, 0, SEEK_SET); - fread(&Buf, 1, 8, ptx); - if(memcmp(Buf, Temp, 8) != 0) { - printf("Obviously not even AMIBIOS standard..Exit\n"); - return 0; - } else - AMIVer = 94; - }; + free(BufBlk); - printf("\n\tAMIBIOS information:"); + if (AMIVer != 95) { + char Buf[12]; - switch (AMIVer) { - case 95: - printf("\nVersion\t\t: %.4s", abc.Version); - printf("\nPacked Data\t: %X (%u bytes)", (uint32_t) abc.CRCLen * 8, (uint32_t) abc.CRCLen * 8); - printf("\nStart\t\t: %X", Offset = ((uint32_t) abc.BeginHi << 4) + (uint32_t) abc.BeginLo); - - BODYOff = fLen - ( 0x100000 - ( Offset + 8 + sizeof(abc)) ) - 8 - sizeof(abc); - printf("\nPacked Offset\t: %X", BODYOff); + printf("AMI'95 hook not found..Turning to AMI'94\n"); - ConstOff = Offset - BODYOff; - printf("\nOffset\t\t: %X", ConstOff); + fseek(ptx, 0, SEEK_SET); + fread(&Buf, 1, 8, ptx); - break; - case 94: - { - AMIDATE amidate; - - fread(&amidate, 1, sizeof(amidate), ptx); + if (memcmp(Buf, Temp, 8) != 0) { + printf("Obviously not even AMIBIOS standard..Exit\n"); + return 0; + } else { + AMIDATE amidate; - if (atoi(amidate.Day) == 10 && atoi(amidate.Month) == 10) { - Offset = 0x30; - AMIVer = 10; - } else - Offset = 0x10; + fread(&amidate, 1, sizeof(amidate), ptx); + if (atoi(amidate.Day) == 10 && atoi(amidate.Month) == 10) + AMIVer = 10; + else + AMIVer = 94; + } } - break; - }; + } + /* Get Date */ fseek(ptx, -11L, SEEK_END); fread(Date, 1, 8, ptx); Date[8] = 0; - printf("\nReleased\t: %s", Date); + + printf("\n\tAMIBIOS information:"); switch (AMIVer) { case 95: - PartTotal = Xtract95(ptx, HelpID, ConstOff, Offset, argv[1]); + { + uint32_t ConstOff; + + printf("\nAMI95 Version\t\t: %.4s", abc.Version); + printf("\nPacked Data\t: %X (%u bytes)", (uint32_t) abc.CRCLen * 8, (uint32_t) abc.CRCLen * 8); + + Offset = (((uint32_t) abc.BeginHi) << 4) + (uint32_t) abc.BeginLo; + printf("\nStart\t\t: %X", Offset); + + printf("\nPacked Offset\t: %X", fLen - 0x100000 + Offset); + + ConstOff = 0x100000 - fLen; + printf("\nOffset\t\t: %X", ConstOff); + printf("\nReleased\t: %s", Date); + + PartTotal = Xtract95(ptx, HelpID, ConstOff, Offset, argv[1]); + + printf("\nTotal Sections\t: %i\n", PartTotal); + } break; case 94: + printf("\n AMI94."); + Offset = 0x10; + printf("\nStart\t\t: %X", Offset); + printf("\nReleased\t: %s", Date); + PartTotal = Xtract0725(ptx, Action, Offset); + + printf("\nTotal Sections\t: %i\n", PartTotal); break; case 10: - PartTotal = Xtract1010(ptx, Action, Offset); + printf("\n AMI 10."); + Offset = 0x30; + printf("\nStart\t\t: %X", Offset); + printf("\nReleased\t: %s", Date); + + PartTotal = Xtract1010(ptx, Action, 0x30); + + printf("\nTotal Sections\t: %i\n", PartTotal); break; default: break; } - printf("\nTotal Sections\t: %i", PartTotal); - - free(BufBlk); - printf("\n"); return 0; } |