home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gambler 19
/
GAMBLERCD19.BIN
/
UTILS
/
DDTPACK
/
PROGS
/
EOF
/
SRC
/
EOF.C
next >
Wrap
C/C++ Source or Header
|
1997-07-22
|
5KB
|
134 lines
/**********************************************************************/
/* Equal Offsets Finder by Biker */
/* Sun 06-22-1997 11:12:11 am */
/* !!!! NIE OPTYMALIZOWANE - NIE SMIAC SIE !!!! */
/**********************************************************************/
/* wszystkie tabulacje zamienilem w spacje */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> /*cprintf, textattr, clrscr, textcolor*/
#include <string.h> /*strcmp*/
#include <io.h> /*filelength, fileno*/
#define VERSION 1
#define REVISION 1
#define ULONG unsigned long
void errorExit(const char* msg)
{
textattr(0x07);
clrscr();
textattr(0x3e);
cprintf("Equal Offsets Finder");
textattr(0x0d);
cprintf(" by BiKeR v.%d.%d\r\n", VERSION, REVISION);
textattr(0x07);
cprintf("Przyklad uzycia dla n plikow:\r\n EOF file_1 file_2 ... file_n /V v_1 v_2 ... v_n\r\n");
cprintf("gdzie:\r\n file_? to nazwy plikow\r\n v_? to szukane wartosci (w tej samej kolejnosci co pliki!)\r\n");
cprintf("To /V miedzy nazwami plikow a wartosciami jest ");
textattr(0xfc);
cprintf("BARDZO WAZNE\r\n");
textattr(0x0c);
cprintf("■Error:");
textattr(0x0f);
cprintf(" %s\r\n", msg);
textattr(0x07);
exit(-1);
}
/* wolna ale przejrzysta wersja getVar
ULONG _getVar(FILE *f, int size)
{
int i;
ULONG var=0;
for(i=0; i < size; i++) var += (ULONG)fgetc(f) << (8*i);
return var;
}
*/
ULONG getVar(FILE *f, int size)
{
ULONG var=0;
/*troche dziwnie wyglada, ale za to dziala szybciej*/
var = fgetc(f);
switch (size){
case 1:
break;
case 2:
var += (ULONG)fgetc(f) << 8;
break;
case 4:
var += (ULONG)fgetc(f) << 8;
var += (ULONG)fgetc(f) << 16;
var += (ULONG)fgetc(f) << 24;
break;
default:
var = 0;
}
return var;
}
void main(int argc, char** argv)
{
FILE **ftab;
char msg[80];
int i, n, s;
ULONG offset=0, *vars, len;
if(argc < 4) errorExit("Za malo argumentow");
for(i=1; i < argc; i++)
if((!strcmp("/V", argv[i])) || (!strcmp("/v", argv[i]))) break;
if(i == argc) errorExit("Nie znalazlem w parametrach /V");
n = i - 1; /* teraz n to liczba plikow do otwarcia*/
/* f1 f2 f3 f4 ... fn /V v1 v2 v3 v4 ... vn
| |
pozycja n i
*/
/* allokacja na potrzeby tablicy wskaznikow do plikow*/
if(!(ftab = calloc(n, sizeof(FILE*)))) errorExit("Za malo pamieci - bardzo dziwne..:(");
/*i dla tablicy wartosci*/
if(!(vars = calloc(n, sizeof(ULONG)))) errorExit("Za malo pamieci - bardzo dziwne..:(");
/*otwieramy wszystkie pliki*/
for(i=0; i < n; i++){
if(!(ftab[i] = fopen(argv[i+1], "rb"))){
sprintf(msg, "Klopoty z otwarciem pliku nr %d", i+1);
errorExit(msg);
}
vars[i] = atol(argv[n + 2 +i]);
}
/*teraz sprawdzam czego sukac: bajtow, short'ow, long'ow?
najpierw szukam najwiekszej wartosci a potem ustalam rozmiar
szukanej komorki*/
len=0;
for(i=0; i < n; i++) if(vars[i] > len) len = vars[i];
if(len < 256) s = sizeof(char);
else if(len < 65536) s = sizeof(short); else s = sizeof(long);
/*s to liczba bajtow ktore mamy porownywac: 1, 2 lub 4*/
/*szukam dlugosci najmniejszego z plików (na wypadek gdyby nie byly rowne
len to ulong, przypisujac mu wartosc -1 ustawiam go na 4G co jak na
dlugosc pliku powinno wystarczyc :)*/
len = -1;
for(i=0; i < n; i++) if((ULONG)filelength(fileno(ftab[i])) < len) len = filelength(fileno(ftab[i]));
for(;len; len--){
for(i=0; i < n; i++) if(getVar(ftab[i], s) != vars[i]) break;
/* jesli i < n to znaczy ze wyskoczylismy z petli przed odczytaniem
ostatniego pliku i teraz trzeba wyrownac offsety we wszystkich
plikach od i+1 do konca*/
if(i < n) for(i++; i < n; i++) getVar(ftab[i], s);
/*a jesli i = n to znaczy ze porownanie przeszlo przez wszystkie pliki
a to skolei znaczy ze o taki offset nam chodzilo*/
else printf("Offset: %lu %lx\n", offset, offset);
offset += s;
}
for(i=0; i < n; i++) fclose(ftab[i]);
free(ftab);
free(vars);
}