#include 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; ilength; 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; ndnumfiles); n++) { if (dirn[n].dfkind) { printf("\nFile="); for (i=0; i