void SaveOrigVectors( void ) { rm_data *p; unsigned i; unsigned old; #ifdef FULL_SAVE for( i = 0; i < INT_VECT_COUNT; ++i ) PMVectSaveList[i]=i; for( i = 0; i < EXCEPT_COUNT; ++i ) PMExceptSaveList[i]=i; #endif old = D32NullPtrCheck( 0 ); /* haven't moved things yet, so PMData isn't set up */ p = (rm_data *)RMDataStart; for( i = 0; i < NUM_VECTS; ++i ) { p->orig_vects[i].a = MyGetRMVector( i ); } D32NullPtrCheck( old ); for( i = 0; i < NUM_PM_SAVE_VECTS; ++i ) { OrigPMVects[i] = DPMIGetPMInterruptVector( PMVectSaveList[i] ); } for( i = 0; i < NUM_PM_SAVE_EXCEPTS; ++i ) { OrigPMExcepts[i] = DPMIGetPMExceptionVector( PMExceptSaveList[i] ); } memcpy( p->vecttable1, p->orig_vects, sizeof( p->vecttable1 ) ); memcpy( p->vecttable2, p->orig_vects, sizeof( p->vecttable2 ) ); memcpy( SavePMVects, OrigPMVects, sizeof( SavePMVects ) ); memcpy( SavePMExcepts, OrigPMExcepts, sizeof( SavePMExcepts ) ); }
static void GoToRealMode( void *rm_func ) { unsigned i; PMData->rm_func = RM_OFF( rm_func ); if( IntrState == IS_DPMI ) { for( i = 0; i < NUM_PM_SAVE_VECTS; ++i ) { DPMISetPMInterruptVector( PMVectSaveList[i], SavePMVects[i] ); } for( i = 0; i < NUM_PM_SAVE_EXCEPTS; ++i ) { DPMISetPMExceptionVector( PMExceptSaveList[i], SavePMExcepts[i] ); } DoRawSwitchToRM( RMData.segm.rm, offsetof( rm_data, stack ) + STACK_SIZE, RM_OFF( RawSwitchHandler ) ); for( i = 0; i < NUM_PM_SAVE_EXCEPTS; ++i ) { SavePMExcepts[i] = DPMIGetPMExceptionVector(PMExceptSaveList[i]); DPMISetPMExceptionVector( PMExceptSaveList[i], OrigPMExcepts[i] ); } for( i = 0; i < NUM_PM_SAVE_VECTS; ++i ) { SavePMVects[i] = DPMIGetPMInterruptVector( PMVectSaveList[i] ); DPMISetPMInterruptVector( PMVectSaveList[i], OrigPMVects[i] ); } } else { DoIntSwitchToRM(); } }
void __grab_int_ctrl_break( void ) { if( __old_int_ctrl_break == 0 ) { #if defined(__WINDOWS_386__) __old_int_ctrl_break = _dos_getvect( CTRL_BRK_VEC ); TinySetVect( CTRL_BRK_VEC, (void (_WCNEAR *)(void))__int_ctrl_break_handler ); #elif defined( __386__ ) if( _IsPharLap() ) { __old_int_ctrl_break = pharlap_rm_getvect( CTRL_BRK_VEC ); __old_pm_int_ctrl_break = pharlap_pm_getvect( CTRL_BRK_VEC ); pharlap_setvect( CTRL_BRK_VEC, (pfun) (void (_WCNEAR *)(void))__int_ctrl_break_handler ); } else if( __DPMI_hosted() == 1 ) { DPMILockLinearRegion((long)__int_ctrl_break_handler, ((long)__restore_int23 - (long)__int_ctrl_break_handler)); __old_int_ctrl_break = DPMIGetRealModeInterruptVector( CTRL_BRK_VEC ); __old_pm_int_ctrl_break = DPMIGetPMInterruptVector( CTRL_BRK_VEC ); DPMISetPMInterruptVector( CTRL_BRK_VEC, __int_ctrl_break_handler ); } else { /* what it used to do */ __old_int_ctrl_break = _dos_getvect( CTRL_BRK_VEC ); _dos_setvect( CTRL_BRK_VEC, __int_ctrl_break_handler ); } #else __old_int_ctrl_break = _dos_getvect( CTRL_BRK_VEC ); _dos_setvect( CTRL_BRK_VEC, __int_ctrl_break_handler ); #endif if( __int23_exit == __null_int23_exit ) { __int23_exit = __restore_int_ctrl_break; } else if( __int23_exit == __restore_int23 ) { __int23_exit = __restore_int; } } }