Exemple #1
0
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 );
}
Exemple #2
0
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 );
}