示例#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 );
}
示例#2
0
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 );
}