Exemple #1
0
static void
print_bg(FILE *html, char *name, u64 start, u64 len, u64 used, u64 flags,
	 u64 areas)
{
	double frag = (double)areas / (len / 4096) * 2;

	fprintf(html, "<p>%s chunk starts at %lld, size is %s, %.2f%% used, "
		      "%.2f%% fragmented</p>\n", chunk_type(flags), start,
		      pretty_size(len), 100.0 * used / len, 100.0 * frag);
	fprintf(html, "<img src=\"%s\" border=\"1\" />\n", name);
}
Exemple #2
0
int main(int argc, char* argv[]){
  FILE *f = fopen(argc > 1 ? argv[1] : "Alice Deejay - Back In My Life.asf", "rb");

  if(!f){
    printf("file not found\n");
    exit(1);
  }

  //printf("sizeof=%d\n", sizeof(objh));
  //printf("sizeof=%d\n", sizeof(asfh));

  fread(&asfh, sizeof(asfh), 1, f); // header obj
  //for(i = 0; i < 16; i++)
  //  printf("%02X ", asfh.objh.guid[i]);
  printf("[%s] %d  (subchunks: %d)\n", chunk_type(asfh.objh.guid),
         (int) asfh.objh.size, asfh.cno);

  while(fread(&objh, sizeof(objh), 1, f) > 0){
    int pos = ftell(f);
    //for(i = 0; i < 16; i++)
    //  printf("%02X ", objh.guid[i]);
    printf("0x%08X  [%s] %d\n", pos-sizeof(objh), chunk_type(objh.guid),
           (int) objh.size);
    switch(*((unsigned int*)&objh.guid)){
      case 0xB7DC0791: // guid_stream_header
        fread(&streamh, sizeof(streamh), 1, f);
        printf("stream type: %s\n", chunk_type(streamh.type));
        printf("stream concealment: %s\n", chunk_type(streamh.concealment));
        printf("type: %d bytes,  stream: %d bytes  ID: %d\n",
               (int)streamh.type_size, (int)streamh.stream_size,
               (int)streamh.stream_no);
        printf("FILEPOS=0x%lX\n", ftell(f));
        // type-specific data:
        fread(buffer,streamh.type_size,1,f);
        switch(*((unsigned int*)&streamh.type)){
        case 0xF8699E40:  // guid_audio_stream
          print_wave_header((WAVEFORMATEX*)buffer);
          break;
        case 0xBC19EFC0:  // guid_video_stream
          print_video_header((BITMAPINFOHEADER*)&buffer[4 + 4 + 1 + 2]);
          break;
        }
        // stream-specific data:
        fread(buffer, streamh.stream_size, 1, f);
        break;
      //case 0xD6E229D1:
      //  return "guid_header_2_0";
      case 0x8CABDCA1: // guid_file_header
        fread(&fileh, sizeof(fileh), 1, f);
        printf("packets: %d  flags: %d  pack_size: %d  frame_size: %d\n",
               (int)fileh.packets, (int)fileh.flags, (int)fileh.packetsize,
               (int)fileh.frame_size);
        break;
      case 0x75b22636: // guid_data_chunk
        { int endp = pos + objh.size - sizeof(objh);
          unsigned char* packet = malloc((int)fileh.packetsize);
          int fpos;
          fseek(f, 26, SEEK_CUR);
          while((fpos = ftell(f)) < endp){
            fread(packet, (int)fileh.packetsize, 1, f);
            if(packet[0] == 0x82){
              unsigned char flags = packet[3];
              unsigned char* p = &packet[5];
              unsigned long time;
              unsigned short duration;
              int segs = 1;
              int seg;
              int padding=0;
              if(flags & 8){
                padding = p[0];
                ++p;
              } else
              if(flags & 16){
                padding = p[0] | (p[1] << 8);
                p += 2;
              }
              time = *((unsigned long*)p);
              p += 4;
              duration = *((unsigned short*)p);
              p += 2;
              if(flags & 1){
                segs = p[0] - 0x80;
                ++p;
              }
              printf("%08X:  flag=%02X  segs=%d  pad=%d  time=%ld  dur=%d\n",
                     fpos, flags, segs, padding, time, duration);
              for(seg = 0; seg < segs; seg++){
                ASF_segmhdr_t* sh = (ASF_segmhdr_t*)p;
                int len = 0;
                p += sizeof(ASF_segmhdr_t);
                if(sh->flag & 8) p+=8;// else
                if(sh->flag & 1) ++p;
                if(flags & 1){
                  len = *((unsigned short*)p);
                  p += 2;
                }
                printf("  seg #%d: streamno=%d  seq=%d  flag=%02X  len=%d\n",
                       seg, sh->streamno&0x7F, sh->seq, sh->flag, len);
  #ifdef SAVE_STREAMS
                if(!streams[sh->streamno & 0x7F]){
                  char name[256];
                  snprintf(name, 256, "stream%02X.dat", sh->streamno & 0x7F);
                  streams[sh->streamno & 0x7F] = fopen(name, "wb");
                }
                fwrite(p, len, 1, streams[sh->streamno & 0x7F]);
  #endif
                p += len;
              }
            } else
              printf("%08X:  UNKNOWN  %02X %02X %02X %02X %02X...\n", fpos,
                     packet[0], packet[1], packet[2], packet[3], packet[4]);
          }
        }
        break;

        //case 0x33000890:
        //  return "guid_index_chunk";

    }
    fseek(f, pos + objh.size - sizeof(objh), SEEK_SET);
  }

  fclose(f);
  return 0;
}