static int32_t readResourceDirectory (FILE *fp, unsigned char **dta, size_t *length, size_t *resRVA) { long pe_header; int32_t be64; uImgHeader hdr; uint32_t res_size = 0; uint32_t sect_count; sImgSectionHdr sec; pe_header = genidl_ispe (fp, &be64); *dta = NULL; length[0]=0; if (!pe_header) return 0; fseek (fp, pe_header, SEEK_SET); if (be64) { fread (&hdr.hdr64, 1, sizeof (sImgNtHeaders64), fp); res_size = hdr.hdr64.OptionalHeader.DataDirectory[2].size; sect_count = hdr.hdr64.FileHeader.NumberOfSections; } else { fread (&hdr.hdr32, 1, sizeof (sImgNtHeaders32), fp); res_size = hdr.hdr32.OptionalHeader.DataDirectory[2].size; sect_count = hdr.hdr32.FileHeader.NumberOfSections; } if (!res_size) return 1; while (sect_count > 0) { fread (&sec, 1, sizeof (sImgSectionHdr),fp); if (!strcmp ((char *) sec.Name, ".rsrc")) { fseek (fp, (int32_t) sec.PointerToRawData, SEEK_SET); resRVA[0] = sec.VirtualAddress; dta[0] = (unsigned char *) malloc (res_size); fread (dta[0], 1, res_size, fp); length[0] = res_size; return 1; } sect_count--; } return 1; }
int main(int argc,char **argv) { FILE *fp,*gp; long p; int32_t be64; size_t len; size_t i; unsigned char *dta = NULL; genidl_read_config ("./genidl.conf"); if (scanArgs (--argc, ++argv) < 0) { show_usage (); } #ifdef REDIRECTOR doredirect(use_redirector); #endif for (i = 0; i < file_args_cnt; i++) { char s[1024], *idl_basename,*org_basename; int start, end; gp = fopen (file_args[i], "rb"); if (!gp) { fprintf (stderr, "Failed to open file ,%s'.\n", file_args[i]); continue; } p = genidl_ispe (gp, &be64); if (is_verbose) fprintf (stderr, "Found PE at %ld (%s bits)\n", p, !be64 ? "32" : "64"); end = genidl_pe_typelib_resource_count (gp); if (is_verbose) fprintf (stderr, "Contains %d typelib resource(s)\n", end); org_basename = get_idl_basename (file_args[i]); idl_basename = strdup (org_basename); if (strrchr (idl_basename, '.') != NULL) *strrchr (idl_basename, '.') = 0; for (start = 0; start < end; start++) { genidl_pe_typelib_resource_read (gp, start, &dta, &len); if (generate_header == 0) { if (end != 1) sprintf (s, "%s%s_%d.idl", idl_basename, basedumpname, start); else sprintf (s, "%s%s.idl", idl_basename, basedumpname); fp = fopen (s, "wb"); if (fp) { sTI2TypLib *tl = TI2_typlib_init (dta, (size_t) len); if (tl) { TI2_typlib_idl (fp, tl, org_basename); TI2_typlib_dest (tl); } if (show_dump_too) dumpInfo (fp, dta, len); fclose (fp); } } else if (generate_header == 1) { if (end != 1) sprintf (s, "%s%s_%d.h", idl_basename, basedumpname, start); else sprintf (s, "%s%s.h", idl_basename, basedumpname); fp = fopen (s, "wb"); if (fp) { sTI2TypLib *tl = TI2_typlib_init (dta, (size_t) len); if (tl) { TI2_typlib_hdr (fp, tl, org_basename); TI2_typlib_dest (tl); } fclose (fp); } } } free (idl_basename); free (org_basename); fclose (gp); } /* genidl_save_config_fp (stderr); */ genidl_save_config ("./genidl.conf"); return 0; }