Beispiel #1
0
static trap_retval DoTrapAccess( trap_elen num_in_mx, in_mx_entry_p mx_in, trap_elen num_out_mx, mx_entry_p mx_out )
{
    uint_8              __far *msgptr;
    unsigned_8          j;
    struct {
        mx_entry16      in;
        mx_entry16      out;
        unsigned_16     retlen;
    }                   __far *callstruct;
    unsigned            len;
    unsigned            copy;

    callstruct = (void __far *)PMData->parmarea;
    msgptr = (void __far *)&callstruct[1];
    callstruct->in.ptr.s.segment = RMData.segm.rm;
    callstruct->in.ptr.s.offset = (unsigned)msgptr - (unsigned)PMData;
    callstruct->in.len = 0;
    for( j = 0; j < num_in_mx; ++j ) {
        _fmemcpy( msgptr, mx_in[j].ptr, mx_in[j].len );
        callstruct->in.len += mx_in[j].len;
        msgptr += mx_in[j].len;
    }

    callstruct->out.len = 0;
    if( mx_out != NULL ) {
        callstruct->out.ptr.s.segment = RMData.segm.rm;
        callstruct->out.ptr.s.offset = (unsigned)msgptr - (unsigned)PMData;
        for( j = 0; j < num_out_mx; ++j ) {
            callstruct->out.len += mx_out[j].len;
        }
    } else {
        callstruct->out.ptr.a = 0;
    }
    GoToRealMode( RMTrapAccess );
    if( callstruct->retlen == (unsigned_16)REQUEST_FAILED ) {
        return( REQUEST_FAILED );
    }
    if( mx_out != NULL ) {
        /* msgptr is pointing at the start of the output buffer */
        j = 0;
        for( len = callstruct->retlen; len != 0; len -= copy ) {
            copy = len;
            if( copy > mx_out[j].len )
                copy = mx_out[j].len;
            _fmemcpy( mx_out[j].ptr, msgptr, copy );
            ++j;
            msgptr += copy;
        }
    } else {
        callstruct->retlen = 0;
    }
    if( TRP_REQUEST( mx_in ) == REQ_CONNECT ) {
        if( ( (connect_ret *)mx_out->ptr )->max_msg_size > MAX_MSG_SIZE ) {
            ( (connect_ret *)mx_out->ptr )->max_msg_size = MAX_MSG_SIZE;
        }
    }
    return( callstruct->retlen );
}
Beispiel #2
0
static bool CallTrapInit( const char *parms, char *errmsg, trap_version *trap_ver )
{
    trap_init_struct    __far *callstruct;

    callstruct = (void __far *)PMData->parmarea;
    callstruct->remote = trap_ver->remote;
    _fstrcpy( (char __far *)&callstruct[1], parms );
    callstruct->errmsg_off = sizeof( *callstruct ) + strlen( parms ) + 1;
    GoToRealMode( RMTrapInit );
    *trap_ver = callstruct->version;
    _fstrcpy( errmsg, (char __far *)callstruct + callstruct->errmsg_off );
    return( *errmsg == '\0' );
}
Beispiel #3
0
void KillTrap( void )
{
    if( IntrState != IS_NONE ) {
        GoToRealMode( RMTrapFini );
        IntrState = IS_NONE;
    }
    if( TrapMem.segm.pm != 0 ) {
        DPMIFreeDOSMemoryBlock( TrapMem.segm.pm );
    }
    if( PMData->envseg.segm.pm != 0 ) {
        DPMIFreeDOSMemoryBlock( PMData->envseg.segm.pm );
    }
    if( PMData->saveseg.segm.pm != 0 ) {
        DPMIFreeDOSMemoryBlock( PMData->saveseg.segm.pm );
    }
}
Beispiel #4
0
static bool CallTrapInit( const char *parms, char *errmsg, trap_version *trap_ver )
{
    _Packed struct {
        unsigned_16     remote;
        unsigned_16     retcode;
        trap_version    version;
        addr32_off      errmsg_off;
    }                   __far *callstruct;

    callstruct = (void __far *)PMData->parmarea;
    callstruct->remote = trap_ver->remote;
    _fstrcpy( (char __far *)&callstruct[1], parms );
    callstruct->errmsg_off = sizeof( *callstruct ) + strlen( parms ) + 1;
    GoToRealMode( RMTrapInit );
    *trap_ver = callstruct->version;
    _fstrcpy( errmsg, (char __far *)callstruct + callstruct->errmsg_off );
    return( *errmsg == NULLCHAR );
}