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 ); }
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' ); }
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 ); } }
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 ); }