home *** CD-ROM | disk | FTP | other *** search
/ Gambler 19 / GAMBLERCD19.BIN / UTILS / DDTPACK / PROGS / EOF / SRC / EOF.C next >
C/C++ Source or Header  |  1997-07-22  |  5KB  |  134 lines

  1. /**********************************************************************/
  2. /*                     Equal Offsets Finder by Biker                  */
  3. /*  Sun 06-22-1997 11:12:11 am                                        */
  4. /*           !!!!  NIE OPTYMALIZOWANE -  NIE SMIAC SIE   !!!!         */
  5. /**********************************************************************/
  6. /* wszystkie tabulacje zamienilem w spacje */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <conio.h>      /*cprintf, textattr, clrscr, textcolor*/
  10. #include <string.h>     /*strcmp*/
  11. #include <io.h>         /*filelength, fileno*/
  12.  
  13. #define VERSION 1
  14. #define REVISION 1
  15. #define ULONG unsigned long
  16.  
  17. void errorExit(const char* msg)
  18. {
  19.         textattr(0x07);
  20.         clrscr();
  21.         textattr(0x3e);
  22.         cprintf("Equal Offsets Finder");
  23.         textattr(0x0d);
  24.         cprintf(" by BiKeR v.%d.%d\r\n", VERSION, REVISION);
  25.         textattr(0x07);
  26.         cprintf("Przyklad uzycia dla n plikow:\r\n        EOF file_1 file_2 ... file_n /V v_1 v_2 ... v_n\r\n");
  27.         cprintf("gdzie:\r\n    file_? to nazwy plikow\r\n    v_? to szukane wartosci (w tej samej kolejnosci co pliki!)\r\n");
  28.         cprintf("To /V miedzy nazwami plikow a wartosciami jest ");
  29.         textattr(0xfc);
  30.         cprintf("BARDZO WAZNE\r\n");
  31.         textattr(0x0c);
  32.         cprintf("■Error:");
  33.         textattr(0x0f);
  34.         cprintf(" %s\r\n", msg);
  35.         textattr(0x07);
  36.         exit(-1);
  37. }
  38.  
  39. /* wolna ale przejrzysta wersja getVar
  40. ULONG _getVar(FILE *f, int size)
  41. {
  42.         int i;
  43.         ULONG var=0;
  44.  
  45.         for(i=0; i < size; i++) var += (ULONG)fgetc(f) << (8*i);
  46.         return var;
  47. }
  48. */
  49. ULONG getVar(FILE *f, int size)
  50. {
  51.         ULONG var=0;
  52. /*troche dziwnie wyglada, ale za to dziala szybciej*/
  53.         var = fgetc(f);
  54.         switch (size){
  55.                 case 1:
  56.                         break;
  57.                 case 2:
  58.                         var += (ULONG)fgetc(f) << 8;
  59.                         break;
  60.                 case 4:
  61.                         var += (ULONG)fgetc(f) << 8;
  62.                         var += (ULONG)fgetc(f) << 16;
  63.                         var += (ULONG)fgetc(f) << 24;
  64.                         break;
  65.                 default:
  66.                         var = 0;
  67.         }
  68.         return var;
  69. }
  70.  
  71. void main(int argc, char** argv)
  72. {
  73.         FILE **ftab;
  74.         char msg[80];
  75.         int i, n, s;
  76.         ULONG offset=0, *vars, len;
  77.  
  78.         if(argc < 4) errorExit("Za malo argumentow");
  79.  
  80.         for(i=1; i < argc; i++)
  81.             if((!strcmp("/V", argv[i])) || (!strcmp("/v", argv[i]))) break;
  82.         if(i == argc) errorExit("Nie znalazlem w parametrach /V");
  83.         n = i - 1;      /* teraz n to liczba plikow do otwarcia*/
  84.         /* f1 f2 f3 f4 ... fn /V v1 v2 v3 v4 ... vn
  85.                             |  |
  86.            pozycja          n  i
  87.         */
  88.  
  89.         /* allokacja na potrzeby tablicy wskaznikow do plikow*/
  90.         if(!(ftab = calloc(n, sizeof(FILE*)))) errorExit("Za malo pamieci - bardzo dziwne..:(");
  91.         /*i dla tablicy wartosci*/
  92.         if(!(vars = calloc(n, sizeof(ULONG)))) errorExit("Za malo pamieci - bardzo dziwne..:(");
  93.  
  94.         /*otwieramy wszystkie pliki*/
  95.         for(i=0; i < n; i++){
  96.                 if(!(ftab[i] = fopen(argv[i+1], "rb"))){
  97.                     sprintf(msg, "Klopoty z otwarciem pliku nr %d", i+1);
  98.                     errorExit(msg);
  99.                 }
  100.                 vars[i] = atol(argv[n + 2 +i]);
  101.         }
  102.         /*teraz sprawdzam czego sukac: bajtow, short'ow, long'ow?
  103.         najpierw szukam najwiekszej wartosci a potem ustalam rozmiar
  104.         szukanej komorki*/
  105.         len=0;
  106.         for(i=0; i < n; i++) if(vars[i] > len) len = vars[i];
  107.         if(len < 256) s = sizeof(char);
  108.         else if(len < 65536) s = sizeof(short); else s = sizeof(long);
  109.         /*s to liczba bajtow ktore mamy porownywac: 1, 2 lub 4*/
  110.  
  111.         /*szukam dlugosci najmniejszego z plików (na wypadek gdyby nie byly rowne
  112.         len to ulong, przypisujac mu wartosc -1 ustawiam go na 4G co jak na
  113.         dlugosc pliku powinno wystarczyc :)*/
  114.         len = -1;
  115.         for(i=0; i < n; i++) if((ULONG)filelength(fileno(ftab[i])) < len) len = filelength(fileno(ftab[i]));
  116.  
  117.         for(;len; len--){
  118.                 for(i=0; i < n; i++) if(getVar(ftab[i], s) != vars[i]) break;
  119.  
  120.                 /* jesli i < n to znaczy ze wyskoczylismy z petli przed odczytaniem
  121.                 ostatniego pliku i teraz trzeba wyrownac offsety we wszystkich
  122.                 plikach od i+1 do konca*/
  123.                 if(i < n) for(i++; i < n; i++) getVar(ftab[i], s);
  124.  
  125.                 /*a jesli i = n to znaczy ze porownanie przeszlo przez wszystkie pliki
  126.                 a to skolei znaczy ze o taki offset nam chodzilo*/
  127.                 else printf("Offset: %lu   %lx\n", offset, offset);
  128.                 offset += s;
  129.         }
  130.         for(i=0; i < n; i++) fclose(ftab[i]);
  131.         free(ftab);
  132.         free(vars);
  133. }
  134.