int main(int argc, char **argv) { char id[7]; int32_t l; uint16_t s; int verbose = 0; int32_t offset; int foundnullsegment = 0; int version; int32_t segmentcontentlength = 0; int nsegments = 0; int32_t headerlength = 0; int32_t objectlength = 0; printf("RDOFF dump utility, version %s\n", PROGRAM_VERSION); printf("RDOFF2 revision %s\n", RDOFF2_REVISION); puts("Copyright (c) 1996,99 Julian R Hall\n" "Improvements and fixes (c) 2002-2004 RET & COM Research."); if (argc < 2) { fputs("Usage: rdfdump [-v] <filename>\n", stderr); exit(1); } rdoff_init(); if (!strcmp(argv[1], "-v")) { verbose = 1; if (argc < 3) { fputs("required parameter missing\n", stderr); exit(1); } argv++; } infile = fopen(argv[1], "rb"); if (!infile) { fprintf(stderr, "rdfdump: Could not open %s\n", argv[1]); exit(1); } nasm_read(id, 6, infile); if (strncmp(id, "RDOFF", 5)) { fputs("rdfdump: File does not contain valid RDOFF header\n", stderr); exit(1); } printf("File %s: RDOFF version %c\n\n", argv[1], id[5]); if (id[5] < '1' || id[5] > '2') { fprintf(stderr, "rdfdump: unknown RDOFF version '%c'\n", id[5]); exit(1); } version = id[5] - '0'; if (version > 1) { nasm_read(&l, 4, infile); objectlength = translateint32_t(l); printf("Object content size: %"PRId32" bytes\n", objectlength); } nasm_read(&l, 4, infile); headerlength = translateint32_t(l); printf("Header (%"PRId32" bytes):\n", headerlength); print_header(headerlength, version); if (version == 1) { nasm_read(&l, 4, infile); l = translateint32_t(l); printf("\nText segment length = %"PRId32" bytes\n", l); offset = 0; while (l--) { nasm_read(id, 1, infile); if (verbose) { if (offset % 16 == 0) printf("\n%08"PRIx32" ", offset); printf(" %02x", (int)(uint8_t)id[0]); offset++; } } if (verbose) printf("\n\n"); nasm_read(&l, 4, infile); l = translateint32_t(l); printf("Data segment length = %"PRId32" bytes\n", l); if (verbose) { offset = 0; while (l--) { nasm_read(id, 1, infile); if (offset % 16 == 0) printf("\n%08"PRIx32" ", offset); printf(" %02x", (int)(uint8_t)id[0]); offset++; } printf("\n"); } } else { do { nasm_read(&s, 2, infile); s = translateint16_t(s); if (!s) { printf("\nNULL segment\n"); foundnullsegment = 1; break; } printf("\nSegment:\n Type = %04X (%s)\n", (int)s, translatesegmenttype(s)); nsegments++; nasm_read(&s, 2, infile); printf(" Number = %04X\n", (int)translateint16_t(s)); nasm_read(&s, 2, infile); printf(" Resrvd = %04X\n", (int)translateint16_t(s)); nasm_read(&l, 4, infile); l = translateint32_t(l); printf(" Length = %"PRId32" bytes\n", l); segmentcontentlength += l; offset = 0; while (l--) { nasm_read(id, 1, infile); if (verbose) { if (offset % 16 == 0) printf("\n%08"PRIx32" ", offset); printf(" %02x", (int)(uint8_t)id[0]); offset++; } } if (verbose) printf("\n"); } while (!feof(infile)); if (!foundnullsegment) printf("\nWarning: unexpected end of file - " "NULL segment not found\n"); printf("\nTotal number of segments: %d\n", nsegments); printf("Total segment content length: %"PRId32" bytes\n", segmentcontentlength); /* calculate what the total object content length should have been */ l = segmentcontentlength + 10 * (nsegments + 1) + headerlength + 4; if (l != objectlength) printf("Warning: actual object length (%"PRId32") != " "stored object length (%"PRId32")\n", l, objectlength); } fclose(infile); return 0; }
int main(int argc,char **argv) { char id[7]; long l; int16 s; int verbose = 0; long offset; int foundnullsegment = 0; int version; long segmentcontentlength = 0; int nsegments = 0; long headerlength = 0; long objectlength = 0; puts("RDOFF Dump utility v2.1\n(c) Copyright 1996,99,2000 Julian R Hall, Yuri M Zaporogets"); if (argc < 2) { fputs("Usage: rdfdump [-v] <filename>\n",stderr); exit(1); } if (! strcmp (argv[1], "-v") ) { verbose = 1; if (argc < 3) { fputs("required parameter missing\n",stderr); exit(1); } argv++; } infile = fopen(argv[1],"rb"); if (! infile) { fprintf(stderr,"rdfdump: Could not open %s\n",argv[1]); exit(1); } fread(id,6,1,infile); if (strncmp(id,"RDOFF",5)) { fputs("rdfdump: File does not contain valid RDOFF header\n",stderr); exit(1); } printf("File %s: RDOFF version %c\n\n",argv[1],id[5]); if (id[5] < '1' || id[5] > '2') { fprintf(stderr,"rdfdump: unknown RDOFF version '%c'\n",id[5]); exit(1); } version = id[5] - '0'; if (version > 1) { fread(&l, 4, 1, infile); objectlength = translatelong(l); printf("Object content size: %ld bytes\n", objectlength); } fread(&l,4,1,infile); headerlength = translatelong(l); printf("Header (%ld bytes):\n",headerlength); print_header(headerlength, version); if (version == 1) { fread(&l,4,1,infile); l = translatelong(l); printf("\nText segment length = %ld bytes\n",l); offset = 0; while(l--) { fread(id,1,1,infile); if (verbose) { if (offset % 16 == 0) printf("\n%08lx ", offset); printf(" %02x",(int) (unsigned char)id[0]); offset++; } } if (verbose) printf("\n\n"); fread(&l,4,1,infile); l = translatelong(l); printf("Data segment length = %ld bytes\n",l); if (verbose) { offset = 0; while (l--) { fread(id,1,1,infile); if (offset % 16 == 0) printf("\n%08lx ", offset); printf(" %02x",(int) (unsigned char) id[0]); offset++; } printf("\n"); } } else { do { fread(&s,2,1,infile); s = translateshort(s); if (!s) { printf("\nNULL segment\n"); foundnullsegment = 1; break; } printf("\nSegment:\n Type = %04X (%s)\n",(int)s, translatesegmenttype(s)); nsegments++; fread(&s,2,1,infile); printf(" Number = %04X\n",(int)translateshort(s)); fread(&s,2,1,infile); printf(" Resrvd = %04X\n",(int)translateshort(s)); fread(&l,4,1,infile); l = translatelong(l); printf(" Length = %ld bytes\n",l); segmentcontentlength += l; offset = 0; while(l--) { fread(id,1,1,infile); if (verbose) { if (offset % 16 == 0) printf("\n%08lx ", offset); printf(" %02x",(int) (unsigned char)id[0]); offset++; } } if (verbose) printf("\n"); } while (!feof(infile)); if (! foundnullsegment) printf("\nWarning: unexpected end of file - " "NULL segment not found\n"); printf("\nTotal number of segments: %d\n", nsegments); printf("Total segment content length: %ld bytes\n",segmentcontentlength); /* calculate what the total object content length should have been */ l = segmentcontentlength + 10 * (nsegments+1) + headerlength + 4; if (l != objectlength) printf("Warning: actual object length (%ld) != " "stored object length (%ld)\n", l, objectlength); } fclose(infile); return 0; }