From: Eric Pouech epouech@codeweavers.com
Signed-off-by: Eric Pouech epouech@codeweavers.com --- tools/winedump/dump.c | 30 +++++++++++++++++++++++------- tools/winedump/emf.c | 8 ++++---- tools/winedump/emfspool.c | 8 ++++---- tools/winedump/font.c | 10 ++++++---- tools/winedump/lib.c | 8 +++++--- tools/winedump/lnk.c | 10 +++++----- tools/winedump/mf.c | 12 ++++++------ tools/winedump/minidump.c | 10 ++++------ tools/winedump/nls.c | 2 +- tools/winedump/pdb.c | 12 +++++------- tools/winedump/pe.c | 39 +++++++++++++++------------------------ tools/winedump/reg.c | 9 +++++---- tools/winedump/tlb.c | 9 ++++++--- tools/winedump/winedump.h | 26 +++++++++++++------------- 14 files changed, 102 insertions(+), 91 deletions(-)
diff --git a/tools/winedump/dump.c b/tools/winedump/dump.c index fb8e248729f..39007603cc4 100644 --- a/tools/winedump/dump.c +++ b/tools/winedump/dump.c @@ -222,7 +222,7 @@ unsigned long Offset(const void* ptr) static const struct dumper { enum FileSig kind; - enum FileSig (*get_kind)(void); + enum FileSig (*get_kind)( int fd ); file_dumper dumper; /* default dump tool */ } dumpers[] = @@ -248,22 +248,36 @@ dumpers[] =
BOOL dump_analysis(const char *name, file_dumper fn, enum FileSig wanted_sig) { - BOOL ret = TRUE; + int fd; + struct stat st; + BOOL ret = TRUE; const struct dumper *dpr;
setbuf(stdout, NULL);
- if (!(dump_base = read_file( name, &dump_total_len ))) fatal( "Cannot read file" ); + if ((fd = open( name, O_RDONLY | O_BINARY )) == -1 || + fstat( fd, &st ) == -1) + { + fatal( "Cannot open file\n"); + return FALSE; + }
- printf("Contents of %s: %zu bytes\n\n", name, dump_total_len); + printf("Contents of %s: %lu bytes\n\n", name, (unsigned long)st.st_size);
for (dpr = dumpers; dpr->kind != SIG_UNKNOWN; dpr++) { - if (dpr->get_kind() == dpr->kind && + enum FileSig kind = dpr->get_kind( fd ); + lseek( fd, 0, SEEK_SET ); + if (kind == dpr->kind && (wanted_sig == SIG_UNKNOWN || wanted_sig == dpr->kind)) { - if (fn) fn(); else dpr->dumper(); - break; + dump_base = xmalloc( st.st_size ); + if (read( fd, dump_base, st.st_size ) == st.st_size) + { + dump_total_len = st.st_size; + if (fn) fn(); else dpr->dumper(); + break; + } } } if (dpr->kind == SIG_UNKNOWN) @@ -274,6 +288,8 @@ BOOL dump_analysis(const char *name, file_dumper fn, enum FileSig wanted_sig)
if (ret) printf("Done dumping %s\n", name); free( dump_base ); + dump_base = NULL; + close( fd );
return ret; } diff --git a/tools/winedump/emf.c b/tools/winedump/emf.c index 253e7c658c2..bb6b7804f04 100644 --- a/tools/winedump/emf.c +++ b/tools/winedump/emf.c @@ -494,12 +494,12 @@ unsigned long dump_emfrecord(const char *pfx, unsigned long offset) return offset; }
-enum FileSig get_kind_emf(void) +enum FileSig get_kind_emf(int fd) { - const ENHMETAHEADER* hdr; + ENHMETAHEADER hdr;
- hdr = PRD(0, sizeof(*hdr)); - if (hdr && hdr->iType == EMR_HEADER && hdr->dSignature == ENHMETA_SIGNATURE) + if (read(fd, &hdr, sizeof(hdr)) == sizeof(hdr) && + hdr.iType == EMR_HEADER && hdr.dSignature == ENHMETA_SIGNATURE) return SIG_EMF; return SIG_UNKNOWN; } diff --git a/tools/winedump/emfspool.c b/tools/winedump/emfspool.c index d0c90b2236b..f4b44700229 100644 --- a/tools/winedump/emfspool.c +++ b/tools/winedump/emfspool.c @@ -164,12 +164,12 @@ static unsigned long dump_emfspool_record(unsigned long off) return off + sizeof(*hdr) + hdr->cjSize; }
-enum FileSig get_kind_emfspool(void) +enum FileSig get_kind_emfspool(int fd) { - const header *hdr; + header hdr;
- hdr = PRD(0, sizeof(*hdr)); - if (hdr && hdr->dwVersion == EMFSPOOL_VERSION) + if (read(fd, &hdr, sizeof(hdr)) == sizeof(hdr) && + hdr.dwVersion == EMFSPOOL_VERSION) return SIG_EMFSPOOL; return SIG_UNKNOWN; } diff --git a/tools/winedump/font.c b/tools/winedump/font.c index ca4065340c3..9d69e3a94c8 100644 --- a/tools/winedump/font.c +++ b/tools/winedump/font.c @@ -81,11 +81,13 @@ typedef struct
/* FIXME: recognize and dump also NE/PE wrapped fonts */
-enum FileSig get_kind_fnt(void) +enum FileSig get_kind_fnt(int fd) { - const WINFNT *fnt = PRD(0, sizeof(WINFNT)); - if (fnt && (fnt->dfVersion == 0x200 || fnt->dfVersion == 0x300) && - PRD(0, fnt->dfSize) != NULL) + WINFNT fnt; + + if (read(fd, &fnt, sizeof(fnt)) == sizeof(fnt) && + (fnt.dfVersion == 0x200 || fnt.dfVersion == 0x300) && + fnt.dfSize <= lseek(fd, 0, SEEK_END)) return SIG_FNT; return SIG_UNKNOWN; } diff --git a/tools/winedump/lib.c b/tools/winedump/lib.c index 0b94adb9b33..f40cd879dbd 100644 --- a/tools/winedump/lib.c +++ b/tools/winedump/lib.c @@ -130,10 +130,12 @@ static void dump_long_import(const void *base, const IMAGE_SECTION_HEADER *ish, } }
-enum FileSig get_kind_lib(void) +enum FileSig get_kind_lib( int fd ) { - const char* arch = PRD(0, IMAGE_ARCHIVE_START_SIZE); - if (arch && !strncmp(arch, IMAGE_ARCHIVE_START, IMAGE_ARCHIVE_START_SIZE)) + char tmp[IMAGE_ARCHIVE_START_SIZE]; + + if (read( fd, tmp, sizeof(tmp) ) == sizeof(tmp) && + !strncmp( tmp, IMAGE_ARCHIVE_START, IMAGE_ARCHIVE_START_SIZE )) return SIG_COFFLIB; return SIG_UNKNOWN; } diff --git a/tools/winedump/lnk.c b/tools/winedump/lnk.c index 194b6b40403..5427eec3f49 100644 --- a/tools/winedump/lnk.c +++ b/tools/winedump/lnk.c @@ -514,13 +514,13 @@ static void dump_raw_block(const DATABLOCK_HEADER* bhdr)
static const GUID CLSID_ShellLink = {0x00021401L, 0, 0, {0xC0,0,0,0,0,0,0,0x46}};
-enum FileSig get_kind_lnk(void) +enum FileSig get_kind_lnk( int fd ) { - const LINK_HEADER* hdr; + LINK_HEADER hdr;
- hdr = PRD(0, sizeof(*hdr)); - if (hdr && hdr->dwSize == sizeof(LINK_HEADER) && - !memcmp(&hdr->MagicGuid, &CLSID_ShellLink, sizeof(GUID))) + if (read( fd, &hdr, sizeof(hdr) ) == sizeof(hdr) && + hdr.dwSize == sizeof(LINK_HEADER) && + !memcmp( &hdr.MagicGuid, &CLSID_ShellLink, sizeof(GUID) )) return SIG_LNK; return SIG_UNKNOWN; } diff --git a/tools/winedump/mf.c b/tools/winedump/mf.c index dac8be200af..d264ddf3d89 100644 --- a/tools/winedump/mf.c +++ b/tools/winedump/mf.c @@ -198,14 +198,14 @@ static int dump_mfrecord(void) return 0; }
-enum FileSig get_kind_mf(void) +enum FileSig get_kind_mf(int fd) { - const METAHEADER *hdr; + METAHEADER hdr;
- hdr = PRD(0, sizeof(*hdr)); - if (hdr && (hdr->mtType == METAFILE_MEMORY || hdr->mtType == METAFILE_DISK) - && hdr->mtHeaderSize == sizeof(METAHEADER) / sizeof(WORD) - && (hdr->mtVersion == 0x0100 || hdr->mtVersion == 0x0300)) + if (read(fd, &hdr, sizeof(hdr)) == sizeof(hdr) + && (hdr.mtType == METAFILE_MEMORY || hdr.mtType == METAFILE_DISK) + && hdr.mtHeaderSize == sizeof(METAHEADER) / sizeof(WORD) + && (hdr.mtVersion == 0x0100 || hdr.mtVersion == 0x0300)) return SIG_MF; return SIG_UNKNOWN; } diff --git a/tools/winedump/minidump.c b/tools/winedump/minidump.c index d8010ea0159..dfda36c719a 100644 --- a/tools/winedump/minidump.c +++ b/tools/winedump/minidump.c @@ -42,14 +42,12 @@ static const char *get_mdmp_str(DWORD rva) return "<<?>>"; }
-enum FileSig get_kind_mdmp(void) +enum FileSig get_kind_mdmp(int fd) { - const DWORD* pdw; + DWORD dw;
- pdw = PRD(0, sizeof(DWORD)); - if (!pdw) {printf("Can't get main signature, aborting\n"); return SIG_UNKNOWN;} - - if (*pdw == 0x504D444D /* "MDMP" */) return SIG_MDMP; + if (read(fd, &dw, sizeof(dw)) == sizeof(dw) && dw == 0x504D444D /* "MDMP" */) + return SIG_MDMP; return SIG_UNKNOWN; }
diff --git a/tools/winedump/nls.c b/tools/winedump/nls.c index b52518604c8..4225666076e 100644 --- a/tools/winedump/nls.c +++ b/tools/winedump/nls.c @@ -1278,7 +1278,7 @@ void nls_dump(void) fprintf( stderr, "Unrecognized file name '%s'\n", globals.input_name ); }
-enum FileSig get_kind_nls(void) +enum FileSig get_kind_nls( int fd ) { if (strlen( globals.input_name ) < 5) return SIG_UNKNOWN; if (strcasecmp( globals.input_name + strlen(globals.input_name) - 4, ".nls" )) return SIG_UNKNOWN; diff --git a/tools/winedump/pdb.c b/tools/winedump/pdb.c index 718356ed207..2d56c7b8a21 100644 --- a/tools/winedump/pdb.c +++ b/tools/winedump/pdb.c @@ -1346,15 +1346,13 @@ static void pdb_ds_dump_header_root(struct pdb_reader* reader) } }
-enum FileSig get_kind_pdb(void) +enum FileSig get_kind_pdb( int fd ) { - const char* head; + char tmp[max(sizeof(pdb7), sizeof(pdb2)) - 1];
- head = PRD(0, sizeof(pdb2) - 1); - if (head && !memcmp(head, pdb2, sizeof(pdb2) - 1)) - return SIG_PDB; - head = PRD(0, sizeof(pdb7) - 1); - if (head && !memcmp(head, pdb7, sizeof(pdb7) - 1)) + if (read(fd, tmp, sizeof(tmp)) == sizeof(tmp) && + (!memcmp(tmp, pdb2, sizeof(pdb2) - 1) || + !memcmp(tmp, pdb7, sizeof(pdb7) - 1))) return SIG_PDB; return SIG_UNKNOWN; } diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c index 96830fd5d3b..9c8fd613c7c 100644 --- a/tools/winedump/pe.c +++ b/tools/winedump/pe.c @@ -4131,14 +4131,12 @@ static void dump_dir_tls(void) printf(" }\n\n"); }
-enum FileSig get_kind_dbg(void) +enum FileSig get_kind_dbg( int fd ) { - const WORD* pw; + WORD w;
- pw = PRD(0, sizeof(WORD)); - if (!pw) {printf("Can't get main signature, aborting\n"); return 0;} - - if (*pw == 0x4944 /* "DI" */) return SIG_DBG; + if (read( fd, &w, sizeof(w) ) == sizeof(w) && w == 0x4944 /* "DI" */) + return SIG_DBG; return SIG_UNKNOWN; }
@@ -4770,27 +4768,20 @@ static void dump_symbol_table(void) dump_coff_symbol_table(sym, numsym, IMAGE_FIRST_SECTION(PE_nt_headers)); }
-enum FileSig get_kind_exec(void) +enum FileSig get_kind_exec( int fd ) { - const WORD* pw; - const DWORD* pdw; - const IMAGE_DOS_HEADER* dh; - - pw = PRD(0, sizeof(WORD)); - if (!pw) {printf("Can't get main signature, aborting\n"); return 0;} - - if (*pw != IMAGE_DOS_SIGNATURE) return SIG_UNKNOWN; + IMAGE_DOS_HEADER dos_hdr; + DWORD pe_sig;
- if ((dh = PRD(0, sizeof(IMAGE_DOS_HEADER)))) + if (read( fd, &dos_hdr, sizeof(dos_hdr) ) != sizeof(dos_hdr) || + dos_hdr.e_magic != IMAGE_DOS_SIGNATURE) + return SIG_UNKNOWN; + /* the signature is the first DWORD */ + if (pread( fd, &pe_sig, sizeof(pe_sig), dos_hdr.e_lfanew ) == sizeof(pe_sig)) { - /* the signature is the first DWORD */ - pdw = PRD(dh->e_lfanew, sizeof(DWORD)); - if (pdw) - { - if (*pdw == IMAGE_NT_SIGNATURE) return SIG_PE; - if (*(const WORD *)pdw == IMAGE_OS2_SIGNATURE) return SIG_NE; - if (*(const WORD *)pdw == IMAGE_VXD_SIGNATURE) return SIG_LE; - } + if (pe_sig == IMAGE_NT_SIGNATURE) return SIG_PE; + if (LOWORD(pe_sig) == IMAGE_OS2_SIGNATURE) return SIG_NE; + if (LOWORD(pe_sig) == IMAGE_VXD_SIGNATURE) return SIG_LE; return SIG_DOS; } return SIG_UNKNOWN; diff --git a/tools/winedump/reg.c b/tools/winedump/reg.c index 29478e06592..885ca359be8 100644 --- a/tools/winedump/reg.c +++ b/tools/winedump/reg.c @@ -134,12 +134,13 @@ static unsigned int header_checksum(const header *h) return checksum; }
-enum FileSig get_kind_reg(void) +enum FileSig get_kind_reg( int fd ) { - const header *hdr; + header hdr;
- hdr = PRD(0, BLOCK_SIZE); - if (hdr && !memcmp(&hdr->signature, "regf", sizeof(hdr->signature))) + if (read( fd, &hdr, sizeof(hdr) ) == sizeof(hdr) && + BLOCK_SIZE <= lseek( fd, 0, SEEK_END ) && + !memcmp(&hdr.signature, "regf", sizeof(hdr.signature))) return SIG_REG; return SIG_UNKNOWN; } diff --git a/tools/winedump/tlb.c b/tools/winedump/tlb.c index 3c795162f0e..62d3c7410c8 100644 --- a/tools/winedump/tlb.c +++ b/tools/winedump/tlb.c @@ -2132,9 +2132,12 @@ void tlb_dump_resource( void *ptr, size_t size, const char *prefix ) dump_total_len = prev_dump_total_len; }
-enum FileSig get_kind_tlb(void) +enum FileSig get_kind_tlb( int fd ) { - const DWORD *sig = PRD(0, sizeof(DWORD)); - if (sig && (*sig == MSFT_MAGIC || *sig == SLTG_MAGIC)) return SIG_TLB; + DWORD sig; + + if (read( fd, &sig, sizeof(sig) ) == sizeof(sig) && + (sig == MSFT_MAGIC || sig == SLTG_MAGIC)) + return SIG_TLB; return SIG_UNKNOWN; } diff --git a/tools/winedump/winedump.h b/tools/winedump/winedump.h index d15eacf2971..3ee4906553b 100644 --- a/tools/winedump/winedump.h +++ b/tools/winedump/winedump.h @@ -240,35 +240,35 @@ void dump_optional_header(const IMAGE_OPTIONAL_HEADER32 *); void dump_section(const IMAGE_SECTION_HEADER *, const char* strtable); void dump_section_characteristics(DWORD characteristics, const char* sep);
-enum FileSig get_kind_exec(void); +enum FileSig get_kind_exec( int fd ); void dos_dump( void ); void pe_dump( void ); void ne_dump( void ); void le_dump( void ); -enum FileSig get_kind_mdmp(void); +enum FileSig get_kind_mdmp( int fd ); void mdmp_dump( void ); -enum FileSig get_kind_lib(void); +enum FileSig get_kind_lib( int fd ); void lib_dump( void ); -enum FileSig get_kind_dbg(void); +enum FileSig get_kind_dbg( int fd ); void dbg_dump( void ); -enum FileSig get_kind_lnk(void); +enum FileSig get_kind_lnk( int fd ); void lnk_dump( void ); -enum FileSig get_kind_emf(void); +enum FileSig get_kind_emf( int fd ); unsigned long dump_emfrecord(const char *pfx, unsigned long offset); void emf_dump( void ); -enum FileSig get_kind_emfspool(void); +enum FileSig get_kind_emfspool( int fd ); void emfspool_dump(void); -enum FileSig get_kind_mf(void); +enum FileSig get_kind_mf( int fd ); void mf_dump(void); -enum FileSig get_kind_pdb(void); +enum FileSig get_kind_pdb( int fd ); void pdb_dump(void); -enum FileSig get_kind_fnt(void); +enum FileSig get_kind_fnt( int fd ); void fnt_dump( void ); -enum FileSig get_kind_tlb(void); +enum FileSig get_kind_tlb( int fd ); void tlb_dump(void); -enum FileSig get_kind_nls(void); +enum FileSig get_kind_nls( int fd ); void nls_dump(void); -enum FileSig get_kind_reg(void); +enum FileSig get_kind_reg( int fd ); void reg_dump(void);
extern void tlb_dump_resource( void *ptr, size_t size, const char *prefix );