bool Session( void ) { unsigned req; bool want_return; for( ;; ) { In[0].len = GetPacket(); In[0].ptr = GetPacketBuffPtr(); _DBG(("Session got request ")); req = TRP_REQUEST( In ); TRP_REQUEST( In ) &= ~0x80; if( req & 0x80 ) { req &= ~0x80; want_return = FALSE; } else { want_return = TRUE; } switch( req ) { case REQ_PROG_KILL: _DBG(("REQ_KILL_PROG\n")); AccTrap( TRUE ); return( TRUE ); default: _DBG(("AccTrap\n")); AccTrap( want_return ); _DBG(("Done AccTrap\n")); break; } } }
bool Session( void ) { unsigned req; bool want_return; Out[0].len = sizeof( RWBuff ); Out[0].ptr = RWBuff; for( ;; ) { #ifdef __WINDOWS__ NothingToDo(); #endif In[0].len = GetPacket(); In[0].ptr = GetPacketBuffPtr(); In_Mx_Ptr = &In[0]; Out_Mx_Ptr = &Out[0]; In_Mx_Num = 1; Out_Mx_Num = 1; req = TRP_REQUEST( In ); TRP_REQUEST( In ) &= ~0x80; if( req & 0x80 ) { req &= ~0x80; want_return = false; } else { want_return = true; } switch( req ) { case REQ_CONNECT: if( !AccConnect() ) return( true ); break; case REQ_DISCONNECT: AccTrap( false ); return( true ); case REQ_SUSPEND: AccTrap( false ); RemoteDisco(); for(;;) { while( !RemoteConnect() ) ; if( !Session() ) break; RemoteDisco(); } break; case REQ_RESUME: AccTrap( false ); return( false ); case REQ_PROG_LOAD: AccLoadProg(); break; default: AccTrap( want_return ); break; } } }
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 trap_elen DoAccess( void ) { trap_elen left; trap_elen len; trap_elen i; trap_elen piece; _DBG_EnterFunc( "DoAccess()" ); _DBG_Writeln( "StartPacket" ); StartPacket(); if( Out_Mx_Num == 0 ) { /* Tell the server we're not expecting anything back */ TRP_REQUEST( In_Mx_Ptr ) |= 0x80; } for( i = 0; i < In_Mx_Num; ++i ) { _DBG_Writeln( "AddPacket" ); AddPacket( In_Mx_Ptr[i].ptr, In_Mx_Ptr[i].len ); } TRP_REQUEST( In_Mx_Ptr ) &= ~0x80; _DBG_Writeln( "PutPacket" ); PutPacket(); if( Out_Mx_Num != 0 ) { _DBG_Writeln( "GetPacket" ); len = GetPacket(); left = len; for( i = 0; i < Out_Mx_Num && left > 0; ++i ) { if( left > Out_Mx_Ptr[i].len ) { piece = Out_Mx_Ptr[i].len; } else { piece = left; } _DBG_Writeln( "RemovePacket" ); RemovePacket( Out_Mx_Ptr[i].ptr, piece ); left -= piece; } } else { len = 0; left = 0; } _DBG_ExitFunc( "DoAccess()" ); return( len - left ); }
trap_retval TRAPENTRY TrapRequest( trap_elen num_in_mx, in_mx_entry_p mx_in, trap_elen num_out_mx, mx_entry_p mx_out ) { trap_retval result; In_Mx_Num = num_in_mx; Out_Mx_Num = num_out_mx; In_Mx_Ptr = mx_in; Out_Mx_Ptr = mx_out; #if defined( WIN16 ) DisableHookEvents(); #endif /* The first item must be the request! */ result = CoreRequests[TRP_REQUEST( mx_in )](); #if defined( WIN16 ) EnableHookEvents(); #endif return( result ); }