示例#1
0
bool DumpIconGroup( uint_32 offset, uint_32 length, FILE *fp )
/************************************************************/
{
    IconCurDirHeader    head;
    IconDirEntry        entry;
    bool                error;
    int                 currentry;

    length = length;

    RESSEEK( fp, offset, SEEK_SET );

    error = ResReadIconCurDirHeader( &(head), fp );
    PrintIconCurDirHeader( &head );

    for( currentry = 0; !error && currentry < head.ResCount; currentry++ ) {
        error = ResReadIconDirEntry( &entry, fp );
        if( !error ) {
            PrintIconDirEntry( &entry, currentry + 1 );
        }
    }

    RESSEEK( fp, offset, SEEK_SET );

    return( error );
}
示例#2
0
bool WRCopyResFromFileToFile( WResFileID src_fid, uint_32 offset, uint_32 length, WResFileID dst_fid )
{
    uint_32     size;
    uint_8      *buf;
    bool        ok;

    size = 0;
    buf = NULL;

    ok = (src_fid != WRES_NIL_HANDLE && dst_fid != WRES_NIL_HANDLE);

    ok = (ok && (buf = (uint_8 *)MemAlloc( CHUNK_SIZE )) != NULL);

    ok = (ok && RESSEEK( src_fid, offset, SEEK_SET ) != -1);

    while( ok && length - size > CHUNK_SIZE ) {
        ok = ok && WRReadResData( src_fid, (BYTE *)buf, CHUNK_SIZE );
        ok = ok && WRWriteResData( dst_fid, (BYTE *)buf, CHUNK_SIZE );
        size += CHUNK_SIZE;
    }
    ok = ok && WRReadResData( src_fid, (BYTE *)buf, length - size );
    ok = ok && WRWriteResData( dst_fid, (BYTE *)buf, length - size );

    if( buf != NULL ) {
        MemFree( buf );
    }

    return( ok );
}
示例#3
0
static void * readString( FILE *fp, long offset, ReadStrErrInfo *err )
/********************************************************************/
{
    char    *retstr;


    if( RESSEEK( fp, offset, SEEK_SET ) ) {
        err->status = RS_READ_ERROR;
        err->err_code = errno;
        return( NULL );
    } else {
        retstr = ResReadString( fp, NULL );
        if( retstr == NULL ) {
            if( LastWresStatus() == WRS_READ_INCOMPLETE ) {
                err->status = RS_READ_INCMPLT;
            } else {
                err->status = RS_READ_ERROR;
                err->err_code = LastWresErr();
            }
            return( NULL );
        } else {
            return( retstr );
        }
    }
}
示例#4
0
static bool ChangeTmpToOutFile( FILE *tmpfile, const char *out_name )
/*******************************************************************/
{
    RcStatus    status;      /* error while deleting or renaming */
    FILE        *outfile;
    size_t      numread;
    char        *buffer;

    buffer = RESALLOC( BUFFER_SIZE );

    status = RS_OK;
    RESSEEK( tmpfile, 0, SEEK_SET );
    outfile = ResOpenFileRW( out_name );
    while( (numread = RESREAD( tmpfile, buffer, BUFFER_SIZE )) != 0 ) {
        if( numread != BUFFER_SIZE && RESIOERR( tmpfile, numread ) ) {
            status = RS_READ_ERROR;
            break;
        }
        if( RESWRITE( outfile, buffer, numread ) != numread ) {
            status = RS_WRITE_ERROR;
            break;
        }
    }
    ResCloseFile( outfile );

    RESFREE( buffer );
    return( status == RS_OK );

} /* ChangeTmpToOutFile */
示例#5
0
static bool ConvertMResources( FILE *in_fp, FILE *out_fp, WResDir outdir )
/************************************************************************/
{
    MResResourceHeader *    mheader;
    WResID *                name;
    WResID *                type;
    bool                    error;
    bool                    lastheader; /* true if lastheader has been read */
    uint_32                 offset;
    bool                    duplicate;

    mheader = MResReadResourceHeader( in_fp );
    /* assume that any error reading here means end of file */
    lastheader = ( mheader == NULL );
    error = false;

    while( !lastheader && !error ) {
        name = ConvertNameOrOrdToID( mheader->Name );
        type = ConvertNameOrOrdToID( mheader->Type );
        offset = RESTELL( out_fp );

        /* copy the resource if it isn't a name table or if the user */
        /* requested that name tables be copied */
        if( type->IsName || type->ID.Num != RESOURCE2INT( RT_NAMETABLE ) ||
                        CmdLineParms.KeepNameTable ) {
            error = WResAddResource( type, name, mheader->MemoryFlags, offset,
                        mheader->Size, outdir, NULL, &duplicate );
            if( duplicate ) {
                /* print message and continue */
                puts( "Error: duplicate entry" );
                error = false;
            } else {
                error = BinaryCopy( in_fp, out_fp, mheader->Size );
            }
        } else {
            RESSEEK( in_fp, mheader->Size, SEEK_CUR );
        }

        WResIDFree( name );
        WResIDFree( type );
        MResFreeResourceHeader( mheader );

        mheader = MResReadResourceHeader( in_fp );
        /* assume that any error reading here means end of file */
        lastheader = ( mheader == NULL );
    }

    return( error );
} /* ConvertMResources */
示例#6
0
static RcStatus copyOneCursor( const CurFileDirEntry *entry, WResFileID fid,
                void *buffer, unsigned buffer_size, BitmapInfoHeader *dibhead,
                int *err_code )
/*****************************************************************************/
/* NOTE: this routine fills in dibhead as it copies the data */
{
    RcStatus        ret;
    WResFileOffset  curpos;

    ret = RS_OK;
    if( RESSEEK( fid, entry->Offset, SEEK_SET ) == -1 ) {
        ret = RS_READ_ERROR;
        *err_code = errno;
    }

    if( ret == RS_OK ) {
        ret = ReadBitmapInfoHeader( dibhead, fid );
        *err_code = errno;
    }
    if( ret == RS_OK ) {
        if( ResWriteBitmapInfoHeader( dibhead, CurrResFile.fid ) ) {
            ret = RS_WRITE_ERROR;
            *err_code = LastWresErr();
        }
    }
    if( ret == RS_OK ) {
        curpos = RESTELL( fid );
        if( curpos == -1 ) {
            ret = RS_READ_ERROR;
            *err_code = errno;
        } else {
            ret = CopyData( curpos,
                              entry->Length - sizeof(BitmapInfoHeader),
                              fid, buffer, buffer_size, err_code );
        }
    }

    return( ret );
}
示例#7
0
RcStatus SemCopyDataUntilEOF( WResFileOffset offset, WResFileID fid,
                         void *buff, unsigned buffsize, int *err_code )
/*********************************************************************/
{
    WResFileSSize   numread;

    if( RESSEEK( fid, offset, SEEK_SET ) == -1 ) {
        *err_code = errno;
        return( RS_READ_ERROR );
    }

    while( (numread = RESREAD( fid, buff, buffsize )) != 0 ) {
        if( RESIOERR( fid, numread ) ) {
            *err_code = errno;
            return( RS_READ_ERROR );
        }
        if( RESWRITE( CurrResFile.fid, buff, numread ) != numread ) {
            *err_code = errno;
            return( RS_WRITE_ERROR );
        }
    }

    return( RS_OK );
}
示例#8
0
static bool openExeFileInfoRO( const char *filename, ExeFileInfo *info )
/**********************************************************************/
{
    RcStatus        status;
    exe_pe_header   *pehdr;

    info->fp = ResOpenFileRO( filename );
    if( info->fp == NULL ) {
        RcError( ERR_CANT_OPEN_FILE, filename, strerror( errno ) );
        return( false );
    }
    info->IsOpen = true;
    info->Type = FindNEPELXHeader( info->fp, &info->WinHeadOffset );
    info->name = filename;
    switch( info->Type ) {
    case EXE_TYPE_NE_WIN:
    case EXE_TYPE_NE_OS2:
        status = SeekRead( info->fp, info->WinHeadOffset, &info->u.NEInfo.WinHead, sizeof( os2_exe_header ) );
        if( status != RS_OK ) {
            RcError( ERR_NOT_VALID_EXE, filename );
            return( false );
        } else {
            info->DebugOffset = info->WinHeadOffset + sizeof( os2_exe_header );
        }
        break;
    case EXE_TYPE_PE:
        pehdr = &info->u.PEInfo.WinHeadData;
        info->u.PEInfo.WinHead = pehdr;
        status = SeekRead( info->fp, info->WinHeadOffset, &PE32( *pehdr ), sizeof( pe_header ) );
        if( status != RS_OK ) {
            RcError( ERR_NOT_VALID_EXE, filename );
            return( false );
        }
        if( IS_PE64( *pehdr ) ) {
            status = SeekRead( info->fp, info->WinHeadOffset, &PE64( *pehdr ), sizeof( pe_header64 ) );
            if( status != RS_OK ) {
                RcError( ERR_NOT_VALID_EXE, filename );
                return( false );
            }
            info->DebugOffset = info->WinHeadOffset + sizeof( pe_header64 );
        } else {
            info->DebugOffset = info->WinHeadOffset + sizeof( pe_header );
        }
        break;
    case EXE_TYPE_LX:
        status = SeekRead( info->fp, info->WinHeadOffset, &info->u.LXInfo.OS2Head, sizeof( os2_flat_header ) );
        if( status != RS_OK ) {
            RcError( ERR_NOT_VALID_EXE, filename );
            return( false );
        } else {
            info->DebugOffset = info->WinHeadOffset + sizeof( os2_flat_header );
        }
        break;
    default:
        RcError( ERR_NOT_VALID_EXE, filename );
        return( false );
        break;
    }

    return( !RESSEEK( info->fp, 0, SEEK_SET ) );
} /* openExeFileInfoRO */