static void register_header_check_gz(file_stat_t *file_stat) { register_header_check(0, gz_header_magic,sizeof(gz_header_magic), &header_check_gz, file_stat); }
static void register_header_check_mrw(file_stat_t *file_stat) { static const unsigned char mrw_header[4]= { 0x00,'M','R','M'}; /* Minolta Raw */ register_header_check(0, mrw_header,sizeof(mrw_header), &header_check_mrw, file_stat); }
static void register_header_check_dex(file_stat_t *file_stat) { static const unsigned char dex_header[4]= {'d','e','x','\n'}; register_header_check(0, dex_header,sizeof(dex_header), &header_check_dex, file_stat); }
static void register_header_check_all(file_stat_t *file_stat) { register_header_check(0, all_header,sizeof(all_header), &header_check_all, file_stat); }
static void register_header_check_amd(file_stat_t *file_stat) { register_header_check(0, amd_header,sizeof(amd_header), &header_check_amd, file_stat); register_header_check(0, amt_header,sizeof(amt_header), &header_check_amt, file_stat); }
static void register_header_check_fit(file_stat_t *file_stat) { static const unsigned char fits_header[4]= { '.', 'F', 'I', 'T' }; register_header_check(8, fits_header, sizeof(fits_header), &header_check_fit, file_stat); }
static void register_header_check_fat(file_stat_t *file_stat) { register_header_check(0x1fe, fat_sign, sizeof(fat_sign), &header_check_fat, file_stat); }
static void register_header_check_a(file_stat_t *file_stat) { register_header_check(0, a_header,sizeof(a_header), &header_check_a, file_stat); }
static void register_header_check_wpd(file_stat_t *file_stat) { register_header_check(0, wpd_header,sizeof(wpd_header), &header_check_wpd, file_stat); }
static void register_header_check_axx(file_stat_t *file_stat) { register_header_check(0, axx_header, sizeof(axx_header), &header_check_axx, file_stat); }
static void register_header_check_psf(file_stat_t *file_stat) { register_header_check(12, "PSD5RDOC", 8, &header_check_psf, file_stat); }
static void register_header_check_ts(file_stat_t *file_stat) { register_header_check(0, "G", 1, &header_check_m2t, file_stat); register_header_check(4, "G", 1, &header_check_m2ts, file_stat); }
static void register_header_check_fs(file_stat_t *file_stat) { static const unsigned char fs_header[4]={ 'F', 'S','2','1' }; register_header_check(0, fs_header,sizeof(fs_header), &header_check_fs, file_stat); }
static void register_header_check_dad(file_stat_t *file_stat) { register_header_check(0, "DHAV", 4, &header_check_dad, file_stat); }
static void register_header_check_ra(file_stat_t *file_stat) { static const unsigned char ra_header[4] = { '.', 'r', 'a', 0xfd}; register_header_check(0, ra_header,sizeof(ra_header), &header_check_ra, file_stat); }
static void register_header_check_x3f(file_stat_t *file_stat) { register_header_check(0, x3f_header,sizeof(x3f_header), &header_check_x3f, file_stat); }
static void register_header_check_ptb(file_stat_t *file_stat) { static const unsigned char ptb_header[4]= {'p', 't', 'a', 'b'}; register_header_check(0, ptb_header,sizeof(ptb_header), &header_check_ptb, file_stat); }
static void register_header_check_djv(file_stat_t *file_stat) { register_header_check(0, djv_header,sizeof(djv_header), &header_check_djv, file_stat); }
static void register_header_check_res(file_stat_t *file_stat) { static const unsigned char MS_res_header[14]= {0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0, 0, 0xFF, 0xFF}; register_header_check(0, MS_res_header,sizeof(MS_res_header), &header_check_res, file_stat); }
static void register_header_check_win(file_stat_t *file_stat) { register_header_check(0, win_header, sizeof(win_header), &header_check_win, file_stat); }
static void register_header_check_3dm(file_stat_t *file_stat) { register_header_check(0, "3D Geometry File Format ", 24, &header_check_3dm, file_stat); }
static void register_header_check_pdf(file_stat_t *file_stat) { register_header_check(0, pdf_header,sizeof(pdf_header), &header_check_pdf, file_stat); }
static void register_header_check_ab(file_stat_t *file_stat) { static const unsigned char ab_header[2]={ 'L', 'J' }; register_header_check(0, ab_header,sizeof(ab_header), &header_check_addressbook, file_stat); }
static void register_header_check_prc(file_stat_t *file_stat) { register_header_check(0x30, prc_header,sizeof(prc_header), &header_check_prc, file_stat); }
static void register_header_check_torrent(file_stat_t *file_stat) { register_header_check(0, torrent_header, sizeof(torrent_header), &header_check_torrent, file_stat); }
static void register_header_check_it(file_stat_t *file_stat) { register_header_check(0, it_header, sizeof(it_header), &header_check_it, file_stat); }
static void register_header_check_gm6(file_stat_t *file_stat) { /* These are the headers that identify Game Maker files for 8.1 and earlier. First set of 4 bytes: Little-endian, constant 1234321 (decimal) Second set of 4 bytes: Little-endian, Version identifier Source: "Binary Format of GameMaker Save Files (gmd, gm6, gmk)" by IsmAvatar URL: http://ismavatar.com/lgm/formats/gmformat7.txt */ //Version 8.1 (.gm81) static const unsigned char gm81_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0x2a, 0x03, 0x00, 0x00 }; //Version 8.0 (.gmk) static const unsigned char gm80_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0x20, 0x03, 0x00, 0x00 }; //Version 7.0 variant 2 (.gmk) static const unsigned char gm72_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0xbe, 0x02, 0x00, 0x00 }; //Version 7.0 variant 1 (.gmk) static const unsigned char gm71_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0xbd, 0x02, 0x00, 0x00 }; //Version 7.0 early variant (.gmk) static const unsigned char gm62_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0x6c, 0x02, 0x00, 0x00 }; //Version 6.0-6.1 (.gm6) static const unsigned char gm60_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0x58, 0x02, 0x00, 0x00 }; //Version 5.3 (.gmd) static const unsigned char gm53_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0x12, 0x02, 0x00, 0x00 }; //Version 5.2 (.gmd) static const unsigned char gm52_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0x08, 0x02, 0x00, 0x00 }; //Version 5.1 (.gmd) static const unsigned char gm51_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0xfe, 0x01, 0x00, 0x00 }; //Version 5.0 (.gmd) static const unsigned char gm50_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0xf4, 0x01, 0x00, 0x00 }; //Version 4.3 (.gmd) static const unsigned char gm43_header[8] = { 0x91, 0xd5, 0x12, 0x00, 0xae, 0x01, 0x00, 0x00 }; //Register all variant header signatures with respective extensions register_header_check(0, gm81_header, sizeof(gm81_header), &header_check_gm81, file_stat); register_header_check(0, gm80_header, sizeof(gm80_header), &header_check_gmk, file_stat); register_header_check(0, gm72_header, sizeof(gm72_header), &header_check_gmk, file_stat); register_header_check(0, gm71_header, sizeof(gm71_header), &header_check_gmk, file_stat); register_header_check(0, gm62_header, sizeof(gm62_header), &header_check_gmk, file_stat); register_header_check(0, gm60_header, sizeof(gm60_header), &header_check_gm6, file_stat); register_header_check(0, gm53_header, sizeof(gm53_header), &header_check_gmd, file_stat); register_header_check(0, gm52_header, sizeof(gm52_header), &header_check_gmd, file_stat); register_header_check(0, gm51_header, sizeof(gm51_header), &header_check_gmd, file_stat); register_header_check(0, gm50_header, sizeof(gm50_header), &header_check_gmd, file_stat); register_header_check(0, gm43_header, sizeof(gm43_header), &header_check_gmd, file_stat); }
static char *parse_signature_file(file_stat_t *file_stat, char *pos) { while(*pos!='\0') { /* skip comments */ while(*pos=='#') { while(*pos!='\0' && *pos!='\n') pos++; if(*pos=='\0') return pos; pos++; } /* each line is composed of "extension offset signature" */ { char *extension; unsigned int offset=0; unsigned char *tmp=NULL; unsigned int signature_max_size=512; unsigned int signature_size=0; { const char *extension_start=pos; while(*pos!='\0' && !isspace(*pos)) pos++; if(*pos=='\0') return pos; *pos='\0'; extension=strdup(extension_start); pos++; } /* skip space */ while(isspace(*pos)) pos++; /* read offset */ pos=str_uint(pos, &offset); /* read signature */ tmp=(unsigned char *)MALLOC(signature_max_size); while(*pos!='\n' && *pos!='\0') { if(signature_size==signature_max_size) { unsigned char *tmp_old=tmp; signature_max_size*=2; tmp=(unsigned char *)realloc(tmp, signature_max_size); if(tmp==NULL) { free(extension); free(tmp_old); return pos; } } if(isspace(*pos) || *pos=='\r' || *pos==',') pos++; else if(*pos== '\'') { pos++; if(*pos=='\0') { free(extension); free(tmp); return pos; } else if(*pos=='\\') { pos++; if(*pos=='\0') { free(extension); free(tmp); return pos; } else if(*pos=='b') tmp[signature_size++]='\b'; else if(*pos=='n') tmp[signature_size++]='\n'; else if(*pos=='t') tmp[signature_size++]='\t'; else if(*pos=='r') tmp[signature_size++]='\r'; else if(*pos=='0') tmp[signature_size++]='\0'; else tmp[signature_size++]=*pos; pos++; } else { tmp[signature_size++]=*pos; pos++; } if(*pos!='\'') { free(extension); free(tmp); return pos; } pos++; } else if(*pos=='"') { pos++; for(; *pos!='"' && *pos!='\0'; pos++) { if(signature_size==signature_max_size) { unsigned char *tmp_old=tmp; signature_max_size*=2; tmp=(unsigned char *)realloc(tmp, signature_max_size); if(tmp==NULL) { free(extension); free(tmp_old); return pos; } } if(*pos=='\\') { pos++; if(*pos=='\0') { free(extension); free(tmp); return pos; } else if(*pos=='b') tmp[signature_size++]='\b'; else if(*pos=='n') tmp[signature_size++]='\n'; else if(*pos=='r') tmp[signature_size++]='\r'; else if(*pos=='t') tmp[signature_size++]='\t'; else if(*pos=='0') tmp[signature_size++]='\0'; else tmp[signature_size++]=*pos; } else tmp[signature_size++]=*pos;; } if(*pos!='"') { free(extension); free(tmp); return pos; } pos++; } else if(*pos=='0' && (*(pos+1)=='x' || *(pos+1)=='X')) { pos+=2; while(isxdigit(*pos) && isxdigit(*(pos+1))) { unsigned int val=(*pos); if(*pos>='0' && *pos<='9') val-='0'; else if(*pos>='A' && *pos<='F') val=val-'A'+10; else if(*pos>='a' && *pos<='f') val=val-'a'+10; pos++; val*=16; val+=(*pos); if(*pos>='0' && *pos<='9') val-='0'; else if(*pos>='A' && *pos<='F') val=val-'A'+10; else if(*pos>='a' && *pos<='f') val=val-'a'+10; pos++; tmp[signature_size++]=val; } } else { free(extension); free(tmp); return pos; } } if(*pos=='\n') pos++; if(signature_size>0) { /* FIXME: Small memory leak */ unsigned char *signature=(unsigned char *)MALLOC(signature_size); log_info("register a signature for %s\n", extension); memcpy(signature, tmp, signature_size); register_header_check(offset, signature, signature_size, &header_check_sig, file_stat); signature_insert(extension, offset, signature, signature_size); } else { free(extension); } free(tmp); } } return pos; }
static void register_header_check_ess(file_stat_t *file_stat) { register_header_check(0, "TESV_SAVEGAME", 13, &header_check_ess, file_stat); }
static void register_header_check_cab(file_stat_t *file_stat) { static const unsigned char cab_header[4] = { 'M','S','C','F'}; register_header_check(0, cab_header,sizeof(cab_header), &header_check_cab, file_stat); }