WRFileType WRIdentifyEXEFile( int fh, int is_dll ) { os2_exe_header os2_hdr; pe_header pe_hdr; WRFileType ftype; ftype = WR_INVALID_FILE; if( WRReadWin16ExeHeader( fh, &os2_hdr ) != 0 ) { if( is_dll ) { ftype = WR_WIN16_DLL; } else { ftype = WR_WIN16_EXE; } } else { if( WRReadWinNTExeHeader( fh, &pe_hdr ) != 0 ) { if( is_dll ) { ftype = WR_WINNT_DLL; } else { ftype = WR_WINNT_EXE; } } } return( ftype ); }
bool WRLoadWResDirFromWinNTEXE( WResFileID file_handle, WResDir *dir ) { exe_pe_header nt_header; pe_object *otable; uint_32 physical_size; uint_32 physical_offset; int i; bool ok; unsigned_32 resource_rva; ok = (file_handle != -1); if( ok ) { ok = ((*dir = WResInitDir()) != NULL); } if( ok ) { ok = (WRReadWinNTExeHeader( file_handle, &nt_header ) != 0); } /* check if a resource table is present */ if( ok ) { ok = WRWinNTHeaderHasResourceTable( &nt_header ); if( !ok ) { WRDisplayErrorMsg( WR_EXENORES ); return( TRUE ); } } /* read NT object table */ otable = NULL; if( ok ) { ok = WRReadNTObjectTable( file_handle, &nt_header, &otable ); } /* find resource object in object table */ resource_rva = 0; if( ok ) { int num_objects; unsigned_32 file_align; physical_size = 0; physical_offset = 0; if( IS_PE64( nt_header ) ) { resource_rva = PE64( nt_header ).table[PE_TBL_RESOURCE].rva; num_objects = PE64( nt_header ).num_objects; file_align = PE64( nt_header ).file_align; } else { resource_rva = PE32( nt_header ).table[PE_TBL_RESOURCE].rva; num_objects = PE32( nt_header ).num_objects; file_align = PE32( nt_header ).file_align; } for( i = 0; i < num_objects; i++ ) { if( otable[i].rva == resource_rva ) { physical_size = otable[i].physical_size; physical_offset = otable[i].physical_offset; break; } } ok = (physical_size != 0 && physical_offset != 0 && physical_size % file_align == 0 && physical_offset % file_align == 0); } if( otable != NULL ) { MemFree( otable ); } /* read the resource information */ if( ok ) { res_offset = physical_offset; res_rva = resource_rva; ok = WRHandleWinNTTypeDir( file_handle, dir, physical_offset ); } return( ok ); }