#include #include #define DISK_SIZE 655360 #define min(a,b) (((a)>(b))?(b):(a)) unsigned char disk[DISK_SIZE]; long tolong(unsigned char * c) { unsigned long l =0; int i; for (i=0;i<4;i++) { l= (l<<8)| *c; c++; } return (long) l; } main() { long i, type, stype; unsigned int len; unsigned char *cp; fread(disk,1,DISK_SIZE,stdin); for (i=0; i0) { printf("%6d: TYPE %6ld", i/1024, type); if (type !=8) { printf(" OWN KEY %6ld", tolong(&disk[i+4])); printf(" FIRST DATA %6ld", tolong(&disk[i+16])); printf(" PARENT %6ld", tolong(&disk[i+1012])); printf(" SECONDARY TYPE %6ld", stype=tolong(&disk[i+1020])); } else { printf(" HEADER %6ld", tolong(&disk[i+4])); printf(" DATA SIZE %6ld",tolong(&disk[i+12])); printf(" NEXT DATA %6ld",tolong(&disk[i+16])); } if (type==2) { len=min(disk[i+1024-80],30); cp = &disk[i+1024-79]; printf(" \""); while(len--) printf("%c",*(cp++)); printf("\""); if (stype== (-3)) { long j=1024*tolong(&disk[i+16]); long siz; printf("\n"); while (j) { fwrite(&disk[j+24],4*tolong(&disk[j+12]),1,stdout); j = 1024*tolong(&disk[j+16]); } } } printf("\n"); } } }