#include <stdio.h> | |
struct dir0 { | |
unsigned short dfirstblk; | |
unsigned short dflastblk; | |
unsigned short dfkind; | |
char length; | |
char dvid[7]; | |
unsigned short deovblk; | |
unsigned short dnumfiles; | |
unsigned short dloadtime; | |
unsigned short dlastboot; | |
unsigned short padding; | |
}; | |
struct dirn { | |
unsigned short dfirstblk; | |
unsigned short dflastblk; | |
unsigned short dfkind; | |
char length; | |
char dtid[15]; | |
unsigned short dlastbyte; | |
unsigned short daccess; | |
}; | |
unsigned short swap(unsigned short x) { | |
union u { | |
unsigned short x; | |
unsigned char c[2]; | |
} u; | |
unsigned char s; | |
u.x = x; | |
s = u.c[0]; | |
u.c[0] = u.c[1]; | |
u.c[1] = s; | |
return u.x; | |
} | |
int main(int argc, char* argv[]) | |
{ | |
char name[17]; | |
char cbuf[512]; | |
char buf[512*4]; | |
FILE* in,*out; | |
int i,n,k; | |
int b,e,l; | |
struct dir0* dir0; | |
struct dirn* dirn; | |
if (argc != 2) { | |
fprintf(stderr,"Usage: %s diskimage.bin\n",argv[0]); | |
exit (1); | |
} | |
if ((in=fopen(argv[1],"rb"))==NULL) { | |
fprintf(stderr,"Can't read %s\n",argv[1]); | |
exit(2); | |
} | |
/* read boot block (two sectors) */ | |
printf("Extract boot record\n"); | |
fread(buf,2,512,in); | |
out = fopen("bootrec.bin","wb"); | |
fwrite(buf,2,512,out); | |
fclose(out); | |
/* read directory records */ | |
fread(buf,4,512,in); | |
dir0 = (struct dir0*)buf; | |
dirn = (struct dirn*)(buf+26); | |
printf("Directory:\n"); | |
printf(" firstblock=%d\n",swap(dir0->dfirstblk)); | |
printf(" lastblock=%d\n",swap(dir0->dflastblk)); | |
printf(" volumeid="); | |
for (i=0; i<dir0->length; i++) printf("%c",dir0->dvid[i]); | |
putchar('\n'); | |
printf(" lastblock=%d\n",swap(dir0->deovblk)); | |
printf(" numfiles=%d\n",swap(dir0->dnumfiles)); | |
for (n=0; n<swap(dir0->dnumfiles); n++) { | |
if (dirn[n].dfkind) { | |
printf("\nFile="); | |
for (i=0; i<dirn[n].length; i++) printf("%c",dirn[n].dtid[i]); | |
putchar('\n'); | |
b = swap(dirn[n].dfirstblk); | |
e = swap(dirn[n].dflastblk); | |
l = swap(dirn[n].dlastbyte); | |
printf(" firstblock=%d\n",b); | |
printf(" lastblock=%d\n",e); | |
printf(" filetype=0x%04x\n",swap(dirn[n].dfkind)); | |
printf(" lastbyte=%d\n",l); | |
memset(name,0,17); | |
strncpy(name,dirn[n].dtid,dirn[n].length); | |
out = fopen(name,"wb"); | |
fseek(in,b*512,0); | |
for (k=0; k<(e-b)-1; k++) { | |
fread(cbuf,1,512,in); | |
fwrite(cbuf,1,512,out); | |
} | |
fread(cbuf,1,l,in); | |
fwrite(cbuf,1,l,out); | |
fclose(out); | |
} | |
} | |
} |