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 ); }
int WRLoadWResDirFromWin16EXE( WResFileID file_handle, WResDir *dir ) { os2_exe_header win_header; long int offset; uint_16 align_shift; uint_32 name_offset; WResTypeNode *type_node; uint_8 *name_table; uint_8 *leftover; uint_32 name_table_len; uint_32 num_leftover; int ok; ok = (file_handle != -1); if( ok ) { ok = ((*dir = WResInitDir()) != NULL); } if( ok ) { ok = ((offset = WRReadWin16ExeHeader( file_handle, &win_header )) != 0); } /* check if a resource table is present */ if( ok ) { ok = WRWin16HeaderHasResourceTable( &win_header ); if( !ok ) { return( TRUE ); } } if( ok ) { ok = (ResSeek( file_handle, offset, SEEK_SET ) != -1); } if( ok ) { ok = (ResSeek( file_handle, win_header.resource_off, SEEK_CUR ) != -1); } if( ok ) { ResReadUint16( &align_shift, file_handle ); ok = (align_shift <= 16); if( !ok ) { WRDisplayErrorMsg( WR_BADEXE ); } } if( ok ) { (*dir)->NumResources = 0; type_node = WRReadWResTypeNodeFromExe( file_handle, align_shift ); while( type_node != NULL ) { type_node->Next = NULL; type_node->Prev = (*dir)->Tail; if( (*dir)->Tail != NULL ) { (*dir)->Tail->Next = type_node; } if ( (*dir)->Head == NULL ) { (*dir)->Head = type_node; } (*dir)->Tail = type_node; (*dir)->NumTypes++; (*dir)->NumResources += type_node->Info.NumResources; type_node = WRReadWResTypeNodeFromExe ( file_handle, align_shift ); } name_offset = tell( file_handle ) - offset - win_header.resource_off; ok = WRReadResourceNames( *dir, file_handle, name_offset ); } if( ok && win_header.expver <= 0x300 ) { num_leftover = 0; leftover = NULL; name_table_len = WRReadNameTable( *dir, file_handle, &name_table, num_leftover, leftover ); while( name_table_len != 0 ) { num_leftover = WRUseNameTable( *dir, name_table, name_table_len, &leftover ); if( name_table != NULL ) { WRMemFree( name_table ); } name_table_len = WRReadNameTable( NULL, file_handle, &name_table, num_leftover, leftover ); if( leftover != NULL ) { WRMemFree( leftover ); leftover = NULL; } } } return( ok ); }