uchar * installCallback(void (PMAPI *pmCB)(),uint *rseg, uint *roff) { CONFIG_INF config; REALPTR realBufAdr,callProtp; ULONG bufSize; FARPTR protBufAdr; uchar *p; /* Get address of real mode routine to call up to protected mode */ _dx_rmlink_get(&callProtp, &realBufAdr, &bufSize, &protBufAdr); _dx_config_inf(&config, (UCHAR*)&config); /* Fill in the values in the real mode code segment so that it will * call the correct routine. */ *((REALPTR*)&realHandler[0]) = callProtp; *((USHORT*)&realHandler[4]) = config.c_cs_sel; *((ULONG*)&realHandler[6]) = (ULONG)pmCB; /* Copy the real mode handler to real mode memory */ if ((p = PM_allocRealSeg(sizeof(realHandler),rseg,roff)) == NULL) return NULL; memcpy(p,realHandler,sizeof(realHandler)); /* Skip past global variabls in real mode code segment */ *roff += 0x0A; return p; }
int dpmi_exists(void) { CONFIG_INF config; /* for DPMI config info */ UCHAR vmmname[256]; _dx_config_inf(&config, vmmname); /* arg2 not really used here */ return(config.c_dpmif); }
int PMAPI PM_unlockCodePages(void (*p)(),uint len,PM_lockHandle *lh) { CONFIG_INF config; FARPTR fp; _dx_config_inf(&config, (UCHAR*)&config); FP_SET(fp,p,config.c_cs_sel); return (_dx_ulock_pgs(fp,len) == 0); }
void PMAPI PM_setPMvect(int intno, PM_intHandler isr) { CONFIG_INF config; FARPTR ph; PM_saveDS(); _dx_config_inf(&config, (UCHAR*)&config); FP_SET(ph,(uint)isr,config.c_cs_sel); _dx_pmiv_set(intno,ph); }
static void setISR(int intno, void (PMAPI *isr)()) { CONFIG_INF config; FARPTR ph; lockPMHandlers(); /* Ensure our handlers are locked */ _dx_config_inf(&config, (UCHAR*)&config); FP_SET(ph,(uint)isr,config.c_cs_sel); _dx_apmiv_set(intno,ph); }
static const char *getlogname (void) { const char *name; #if (DOSX & PHARLAP) extern char *GetArg0 (USHORT sel); CONFIG_INF cnf; char *arg0; _dx_config_inf (&cnf, (UCHAR*)&cnf); /* get config block */ arg0 = GetArg0 (cnf.c_env_sel); /* in exc_??.lib */ if (arg0) name = strdup (arg0); else name = NULL; #elif defined (__DJGPP__) extern char **__crt0_argv; name = strdup (__crt0_argv[0]); #elif defined (_MSC_VER) extern char **__argv; name = strdup (__argv[0]); #else extern char **_argv; name = strdup (_argv[0]); #endif if (name) { char *exe = strrchr (name, '.'); /* ".exe" or ".exp" */ if (exe) { strcpy (exe, ".log"); return (name); } } return ("$unknown.log"); }
const char *RemoteLink( const char *parms, bool server ) { #ifdef SERVER unsigned long link; #if defined(ACAD) { XVersion = 2; if( GetCS() & 3 ) { Meg1 = 0x37; } else { Meg1 = 0x60; } } #elif defined(PHARLAP) { CONFIG_INF config; static unsigned char buff[256]; _dx_config_inf(&config, buff ); XVersion = config.c_major; if( XVersion >= 3 ) { Meg1 = config.c_dos_sel; } else { Meg1 = 0x60; } } #elif defined(CAUSEWAY) Meg1 = GetZeroSel(); #endif parms = parms; link = GetDosLong( LINK_VECTOR * 4 ); if( link >= (1024UL * 1024UL) || GetDosLong( link ) != LINK_SIGNATURE ) { return( TRP_ERR_not_from_command ); } RMBuffPtr = RMLinToPM( GetDosLong( link + 4 ), 0 ); RMProcAddr = GetDosLong( link + 8 ); PutDosLong( LINK_VECTOR * 4, GetDosLong( link + 12 ) ); #else static char fullpath[256]; /* static because ss != ds */ static char buff[256]; static char *endname; char *name; char *buffp; char *endparm; void __far *link[4]; void __far * __far * link_ptr; unsigned len; #if defined(PHARLAP) const char *exe_name; #endif _DBG_EnterFunc( "RemoteLink()" ); BackFromFork = 0; link_ptr = (void __far *)(LINK_VECTOR * 4); link[ 3 ] = *link_ptr; link[ 2 ] = MK_FP( GetCS(), (unsigned )BackFromProtMode ); link[ 1 ] = (void __far *)MK_LINEAR( &Buff ); link[ 0 ] = (void __far *)LINK_SIGNATURE; *link_ptr = (void __far *)MK_LINEAR( &link ); // parms has following format // "trap parameters string"+"\0"+"command line string"+"\0" _DBG_Write( "Parms: " ); _DBG_NoTabWriteln( parms ); while( *parms == ' ' ) ++parms; if( *parms == '`' ) { ++parms; buffp = buff; while( *parms != '\0' ) { if( *parms == '`' ) { ++parms; break; } *buffp++ = *parms++; } *buffp = '\0'; } while( *parms == ' ' ) ++parms; if( setjmp( RealModeState ) == 0 ) { name = FindExtender( fullpath, &endname ); if( name == NULL ) { _DBG_ExitFunc( "RemoteLink(), unable to find extender" ); return( TRP_ERR_no_extender ); } _DBG_Write( "Extender name: " ); _DBG_NoTabWriteln( name ); while( *endname++ != '\0' ) {} // skip after extender name + '\0' #if defined(ACAD) buffp = buff; *buffp = '\0'; #else { static char *endhelp; const char *help_name; #if defined(PHARLAP) exe_name = parms; while( *exe_name++ != '\0' ) {} // skip to command line help_name = GetHelpName( exe_name ); #else help_name = HELPNAME; #endif buffp = SearchPath( DOSEnvFind( "PATH" ), help_name, buff, &endhelp ); if( *buffp == '\0' ) { _DBG_ExitFunc( "RemoteLink(), unable to find extender help file" ); return( TRP_ERR_no_extender ); } } #endif _DBG_Write( "Extender help name: " ); _DBG_NoTabWriteln( buffp ); endparm = CopyStr( parms, endname + 1 ); // reserve length byte endparm = CopyStr( buffp, CopyStr( " ", endparm ) ); #if defined(PHARLAP) endparm = CopyStr( " ", endparm ); endparm = CopyStr( exe_name, endparm ); // add extra executable name #endif len = endparm - ( endname + 1 ); if( len > 126 ) len = 126; *endname = len; // setup length byte endparm = endname + len + 1; endparm[0] = '\r'; endparm[1] = '\0'; _DBG_Write( "Extender Cmd line: " ); _DBG_NoTabWriteln( endname + 1 ); _DBG_Writeln( "calling _fork() to start extender/debugee" ); if( _fork( name, endname ) != 0 ) { _DBG_ExitFunc( "RemoteLink(), unable to start extender" ); return( TRP_ERR_cant_start_extender ); } } else if( BackFromFork || !BeenToProtMode ) { _DBG_ExitFunc( "RemoteLink(), extender could not start extender help file" ); return( TRP_ERR_cant_start_extender ); } #endif server = server; _DBG_ExitFunc( "RemoteLink()" ); return( NULL ); }