File: MAIN.C | Size: 11,334 bytes | Download file | Back to directory listing | BWPOW's homepage
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <all312.h>
 
#define VERZIA "1.1"
 
void uloz_do_logu(char name[256]);
 
typedef struct SUBOR{
  int start;
  int size;
  char type;
}SUBOR;
 
SUBOR subor[10000];
short num_sub;
 
PACKFILE *s;
unsigned char buff[65536+50];
unsigned char buff1[51];
long length;
 
void about_fh()
{
  char tbuf[70];
  _box_maker(20,8,60,17,15,7,"About");
 
  textcolor(0);
  gotoxy(40,10);
  outtext_centre("Universal File Hacker");
 
  sprintf(tbuf,"version %s (%s,%s)",VERZIA,__DATE__,__TIME__);
  gotoxy(40,11);
  outtext_centre(tbuf);
 
  gotoxy(40,13);
  outtext_centre("By Samuel Kupka, IdeaZ 2000");
  gotoxy(40,14);
  outtext_centre("!!! FREEWARE !!!");
 
  textcolor(5);
  gotoxy(40,16);
  outtext_centre("Press Enter");
 
  while(!key[KEY_ENTER]);
  _delete_box();
  clear_keybuf();
}
 
 
 
void najdi(long pos)
{
  int i;
 
  i=look_in_database(buff1);
  if(i>=0){
    subor[num_sub].start=pos-50;
    subor[num_sub].type=i;
    num_sub++;
  }
}
 
 
void prehladaj(char filename[256])
{
  long l,t,r,i;
  char tbuf[30];
  float per;
 
  s=pack_fopen(filename,F_READ);
  if(s==NULL){
    koniec("Error reading file!");
  }
 
  l=file_size(filename);
 
  length=l;
  t=0;
 
  _box_maker(37,16,77,22,14,1,"Reading");
 
  gotoxy(57,18);
  outtext_centre("0 bytes read (0.0%%)");
 
  textcolor(7+128);
  gotoxy(57,21);
  outtext_centre("Press ESC to cancel");
 
  while(l>0){
    if(l>65536) r=65536;
    else r=l;
 
    memcpy(buff,buff+65536,50);
    pack_fread(buff+50,r,s);
 
    for(i=0;i<r;i++){
      memcpy(buff1,buff+i,50);
      najdi(t+i);
      if(key[KEY_ESC]){l=-1;i=r;}
    }
 
    t+=r;
    l-=r;
 
    gotoxy(57,18);
    per=(float)t/(float)length;
    sprintf(tbuf,"%ld bytes read (%3.1f%%)",t,per*100);
 
    textcolor(14);
    outtext_centre(tbuf);
 
    sprintf(tbuf,"%d file(s) found",num_sub);
    gotoxy(57,19);
    textcolor(11);
    outtext_centre(tbuf);
 
    if(key[KEY_ESC]) l=-1;
 
  }
  pack_fclose(s);
 
  if(l==0){
    uloz_do_logu(filename);
 
    textcolor(10);
    gotoxy(57,21);
    outtext_centre("Press ENTER to continue");
 
    while(!key[KEY_ENTER]);
  }
  _delete_box();
  clear_keybuf();
 
  if(l==-1){
    koniec("Reading is not completed!");
  }
 
 
}
 
char sel[10000];
short num_sel;
 
 
void extract_files(char filename[128])
{
  int ext=0,op=0;
  FILE *out,*f;
  char tbuf[80];
  int i,r,l;
 
  if(num_sel==0){
    nekoniec("No files selected!");
    return;
  }
  if(sel[0]==-1){
    nekoniec("First file can't be part of other file!");
    return;
  }
 
  for(i=0;i<num_sub-1;i++)
    subor[i].size=subor[i+1].start-subor[i].start;
 
  subor[num_sub-1].size=file_size(filename)-subor[num_sub-1].start;
 
  f=fopen(filename,"rb");
  if(f==0) koniec("Disk read error!");
 
  _box_maker(37,16,77,22,14,1,"Extracting");
 
  gotoxy(57,18);
  outtext_centre("0 files extracted");
 
  for(i=0;i<num_sub;i++){
    if(sel[i]==1){
      if(op==1){
        fclose(out);
        op=0;
 
        gotoxy(57,18);
        sprintf(tbuf,"%d files extracted",ext);
        outtext_centre(tbuf);
 
      }
 
      sprintf(tbuf,"file%04d.",i);
      dopln_ext(tbuf,subor[i].type);
      ext++;
 
      out=fopen(tbuf,"wb+");
      if(out==0) koniec("Write error");
      op=1;
 
      gotoxy(57,19);
      outtext_centre(tbuf);
 
      fseek(f,subor[i].start,0);
 
      l=subor[i].size;
      while(l>0){
        if(l>65536) r=65536;
        else r=l;
 
        fread(buff,r,1,f);
        fwrite(buff,r,1,out);
        l-=r;
      }
    }
 
    if(sel[i]==0){
      if(op==1){
        fclose(out);
        op=0;
        gotoxy(57,18);
        sprintf(tbuf,"%d files extracted",ext);
        outtext_centre(tbuf);
 
      }
    }
    if(sel[i]==-1){
      fseek(f,subor[i].start,0);
 
      l=subor[i].size;
      while(l>0){
        if(l>65536) r=65536;
        else r=l;
 
        fread(buff,r,1,f);
        fwrite(buff,r,1,out);
        l-=r;
      }
    }
 
  }
  if(op==1) fclose(out);
  fclose(f);
 
  gotoxy(57,18);
  sprintf(tbuf,"%d files extracted",ext);
  outtext_centre(tbuf);
 
 
  textcolor(10);
  gotoxy(57,21);
  outtext_centre("Press Enter");
 
  while(!key[KEY_ENTER]);
  _delete_box();
  clear_keybuf();
}
 
void upload_files(char filename[128])
{
  int ext=0;
  FILE *out,*f;
  char tbuf[80],op=0;
  int i,r,l;
 
  if(num_sel==0){
    nekoniec("No files selected!");
    return;
  }
  if(sel[0]==-1){
    nekoniec("First file can't be part of other file!");
    return;
  }
 
  for(i=0;i<num_sub-1;i++)
    subor[i].size=subor[i+1].start-subor[i].start;
 
  subor[num_sub-1].size=file_size(filename)-subor[num_sub-1].start;
 
  f=fopen(filename,"r+b");
  if(f==0) koniec("Disk read error!");
 
  _box_maker(37,16,77,22,14,1,"Uploading");
 
  gotoxy(57,18);
  outtext_centre("0 files uploaded");
 
  for(i=0;i<num_sub;i++){
    if(sel[i]==1){
      if(op==1){
        fclose(out);
        op=0;
 
        gotoxy(57,18);
        sprintf(tbuf,"%d files uploaded",ext);
        outtext_centre(tbuf);
 
      }
 
      sprintf(tbuf,"file%04d.",i);
      dopln_ext(tbuf,subor[i].type);
 
      if(exists(tbuf)){
 
        ext++;
 
        out=fopen(tbuf,"rb");
        if(out==0) koniec("Read error");
        op=1;
 
        gotoxy(57,19);
        outtext_centre(tbuf);
 
        fseek(f,subor[i].start,0);
 
        l=file_size(tbuf);
        while(l>0){
          if(l>65536) r=65536;
          else r=l;
 
          fread(buff,r,1,out);
          fwrite(buff,r,1,f);
          l-=r;
        }
      }
    }
 
    if(sel[i]==0){
      if(op==1){
        fclose(out);
        op=0;
        gotoxy(57,18);
        sprintf(tbuf,"%d files uploaded",ext);
        outtext_centre(tbuf);
 
      }
    }
    if(sel[i]==-1){
      fseek(f,subor[i].start,0);
 
      l=subor[i].size;
      while(l>0){
        if(l>65536) r=65536;
        else r=l;
 
        fread(buff,r,1,f);
        fwrite(buff,r,1,out);
        l-=r;
      }
    }
 
  }
  if(op==1) fclose(out);
  fclose(f);
 
  gotoxy(57,18);
  sprintf(tbuf,"%d files extracted",ext);
  outtext_centre(tbuf);
 
 
  textcolor(10);
  gotoxy(57,21);
  outtext_centre("Press Enter");
 
  while(!key[KEY_ENTER]);
  _delete_box();
  clear_keybuf();
}
 
 
static char *typez[]={
"part of previous file",
"unselected           ",
"selected             "
};
 
char mainmenu()
{
  short c=1,n=0,f=0,i;
  char k=1;
 
  _box_maker(3,3,11,23,14,1,"Num");
  _box_maker(12,3,20,23,14,1,"Ext");
  _box_maker(21,3,41,23,14,1,"Filetype");
 
  _box_maker(45,3,77,13,15,1,"Fileinfo");
  _box_maker(45,15,77,23,10,3,"Extract info");
 
  textcolor(14);textbackground(1);
  gotoxy(47,4);cprintf("Number");
  gotoxy(47,5);cprintf("Extension");
  gotoxy(47,7);cprintf("Type");
  gotoxy(47,9);cprintf("Start position");
  gotoxy(47,11);cprintf("Flag");
 
  textbackground(3);textcolor(15);
  gotoxy(61,17);
  outtext_centre("Total files");
  gotoxy(61,20);
  outtext_centre("Selected files");
 
  textcolor(14);
  gotoxy(59,18);cprintf("%05d",num_sub);
 
  memset(sel,1,10000);
  num_sel=num_sub;
 
  while(k==1){
    if(c==1){
      for(i=0;i<19;i++){
        if(i+n>=num_sub) break;
        if(sel[i+n]==1) textcolor(15);
        if(sel[i+n]==0) textcolor(12);
        if(sel[i+n]==-1) textcolor(8);
 
        if(f==i) textbackground(0);
        else textbackground(1);
        gotoxy(4,i+4);
        cprintf(" %05d ",i+n);
 
        draw_info_from_db(subor[i+n].type,i+4);
      }
      textcolor(11);textbackground(1);
 
      gotoxy(63,4);cprintf("%05d",f+n);
      draw_info_extended_db(subor[f+n].type);
 
      gotoxy(50,10);cprintf("%09d",subor[f+n].start);
      gotoxy(50,12);cprintf("%s",typez[sel[f+n]+1]);
 
      textcolor(14);textbackground(3);
      gotoxy(59,21);cprintf("%05d",num_sel);
 
 
      c=0;
    }
 
    if(key[KEY_DOWN]){
      c=1;
      f++;
      if(n+f>=num_sub){
        f--;
        c=0;
      }
      if(f>=19){
        f=18;
        n++;
        if(n+f>=num_sub){
          n--;
          c=0;
        }
      }
    }
    if(key[KEY_INSERT]&&sel[n+f]>=0){
      sel[n+f]=!sel[n+f];
      if(sel[n+f]==0) num_sel--;
      else num_sel++;
      c=1;
      f++;
      if(n+f>=num_sub){
        f--;
      }
      if(f>=19){
        f=18;
        n++;
        if(n+f>=num_sub){
          n--;
        }
      }
    }
    if(key[KEY_DEL]){
      if(sel[n+f]>=0){
        if(sel[n+f]==1) num_sel--;
        sel[n+f]=-1;
      }
      else sel[n+f]=0;
      c=1;
      f++;
      if(n+f>=num_sub){
        f--;
      }
      if(f>=19){
        f=18;
        n++;
        if(n+f>=num_sub){
          n--;
        }
      }
    }
 
    if(key[KEY_HOME]){
      n=0;f=0;c=1;
    }
    if(key[KEY_END]){
      if(num_sub<19){
        n=0;f=num_sub-1;c=1;
      }
      else{
        f=18;
        n=num_sub-19;
        c=1;
      }
    }
 
 
    if(key[KEY_PGUP]){
      c=1;
      for(i=0;i<19;i++){
        f--;
        if(f<0){
          f=0;
          n--;
          if(n+f<0){
            n++;
            break;
          }
        }
      }
 
    }
 
 
    if(key[KEY_PGDN]){
      c=1;
      for(i=0;i<19;i++){
        f++;
        if(n+f>=num_sub){
          f--;
          break;
        }
        if(f>=19){
          f=18;
          n++;
          if(n+f>=num_sub){
            n--;
            break;
          }
        }
      }
    }
 
    if(key[KEY_UP]){
      c=1;
      f--;
      if(f<0){
        f=0;
        n--;
        if(n+f<0){
          n++;
          c=0;
        }
      }
    }
 
 
    clear_keybuf();
    if(key[KEY_F1]) about_fh();
    if(key[KEY_F3]) k=0;
    if(key[KEY_F5]) k=2;
    if(key[KEY_F6]) k=3;
    if(key[KEY_ESC]) k=-1;
  }
 
  _delete_box();
  _delete_box();
  _delete_box();
  _delete_box();
  _delete_box();
  return k;
}
 
int nacitaj_z_logu(char name[256])
{
  char fname[256]="";
 
  replace_extension(fname,name,"fhl",255);
  if(exists(fname)==0) return 0;
 
  s=pack_fopen(fname,F_READ);
  if(s==0) return 0;
 
  num_sub=pack_igetw(s);
  pack_fread(subor,sizeof(SUBOR)*num_sub,s);
 
  pack_fclose(s);
  return 1;
}
 
void uloz_do_logu(char name[256])
{
  char fname[256]="";
 
  replace_extension(fname,name,"fhl",255);
 
  s=pack_fopen(fname,F_WRITE);
  if(s==0) return;
 
  pack_iputw(num_sub,s);
  pack_fwrite(subor,sizeof(SUBOR)*num_sub,s);
 
  pack_fclose(s);
}
 
int main(int argc,char *argv[])
{
  char k=0,a=0;
  allegro_init();
  install_keyboard();
 
  make_background();
  load_database(); // perfect stuff
 
  if(argc!=2){
    koniec("Usage: FILEHACK.EXE file.in");
  }
 
  while(k!=-1){
    if(k==0){
      num_sub=0;
      if(a==0){
        if(nacitaj_z_logu(argv[1])==0)
          prehladaj(argv[1]);
        a=1;
      }
      else prehladaj(argv[1]);
      if(num_sub==0) koniec("No files found!");
    }
    k=mainmenu();
    if(k==2) extract_files(argv[1]);
    if(k==3) upload_files(argv[1]);
 
  }
  koniec1();
}