예제 #1
1
파일: myint21.c 프로젝트: Michael82/gp2lap
void *install_int21_hook(void)
// Rueckgabe: ptr to allocated realmode mem
{
  if ( GetLogDpmiInfo() )
    LogLine("- Now installing rm hook\n");

  //--- allocatore low memory for the new int21 handler ---
  rm21ptr = (struct rmcode *) dpmi_real_malloc(2048, &Hook21Sel);

  if (rm21ptr != NULL) {

    //--- lock this low memory region ---
    if (!dpmi_lock_region(rm21ptr, 2048)) {  // locking failed?
      dpmi_real_free(Hook21Sel);
      return NULL;
    }

    OrgRmInt21 = ahf_dpmi_get_rmint(0x21);   // get the org int21 vector

    //--- now patch the raw code of my new handler ---
    memcpy(rm21ptr, &rm21code, sizeof(rm21code));
    *(unsigned long*)(rm21ptr->oldintofs) = OrgRmInt21;
    *(unsigned long*)(rm21ptr->LammCallAdr) = FP_OFF(RcvGP2Call);

    //--- now set my new handler ---
    _disable();
    ahf_dpmi_set_rmint(0x21, ((unsigned long)DPMI_real_segment(rm21ptr) << 16) + DPMI_real_offset(rm21ptr));
    _enable();

    //--- make sure it's getting restored at exit ---
    atexit( remove_int21_hook );

  }

  return rm21ptr;

} // install_int21_hook()
예제 #2
0
void key_init()
{
	// Initialize queue

	Status1= *(ubyte*)0x417;
	Status2= *(ubyte*)0x418;
 
	keyd_time_when_last_pressed = timer_get_fixed_seconds();
	keyd_buffer_type = 1;
	keyd_repeat = 1;
	key_data.in_key_handler = 0;
	key_data.E0Flag = 0;
	key_data.E1Flag = 0;

	// Clear the keyboard array
	key_flush();

	if (Installed) return;
	Installed = 1;

	//--------------- lock everything for the virtal memory ----------------------------------
	if (!dpmi_lock_region ((void near *)key_handler, (char *)key_handler_end - (char near *)key_handler))	{
		Error( "Can't lock keyboard handler!\n" );
	}
	if (!dpmi_lock_region (&key_data, sizeof(keyboard)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_buffer_type, sizeof(char)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_repeat, sizeof(char)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_editor_mode, sizeof(char)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_last_pressed, sizeof(char)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_last_released, sizeof(char)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_pressed, sizeof(char)*256))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}
	if (!dpmi_lock_region (&keyd_time_when_last_pressed, sizeof(int)))	{
		Error( "Can't lock keyboard handler's data!\n" );
	}

	key_data.prev_int_9 = _dos_getvect( 9 );
	_dos_setvect( 9, key_handler );

	atexit( key_close );
}
예제 #3
0
파일: IPX.C 프로젝트: devint1/descent-win
int ipx_init( int socket_number, int show_address )
{
	dpmi_real_regs rregs;
	ubyte *ipx_real_buffer;
	int i;

	atexit(ipx_close);

	ipx_packetnum = 0;

	// init packet buffers.
	for (i=0; i<MAX_PACKETS; i++ )	{
		packet_buffers[i].packetnum = -1;
		packet_free_list[i] = i;
	}
	num_packets = 0;
	largest_packet_index = 0;

	// Get the IPX vector
	memset(&rregs,0,sizeof(dpmi_real_regs));
	rregs.eax=0x00007a00;
	dpmi_real_int386x( 0x2f, &rregs );

	if ( (rregs.eax & 0xFF) != 0xFF )	{
		return 3;   
	}
	ipx_vector_offset = rregs.edi & 0xFFFF;
	ipx_vector_segment = rregs.es;
	//printf( "IPX entry point at %.4x:%.4x\n", ipx_vector_segment, ipx_vector_offset );

	// Open a socket for IPX

	memset(&rregs,0,sizeof(dpmi_real_regs));
	swab( (char *)&socket_number,(char *)&ipx_socket, 2 );
	rregs.edx = ipx_socket;
	rregs.eax = ipx_socket_life;
	rregs.ebx = 0;	// Open socket
	dpmi_real_int386x( 0x7A, &rregs );
	
	ipx_socket = rregs.edx & 0xFFFF;
	
	if ( rregs.eax & 0xFF )	{
		//mprintf( (1, "IPX error opening channel %d\n", socket_number-IPX_DEFAULT_SOCKET ));
		return -2;
	}
	
	ipx_installed = 1;

	// Find our internetwork address
	ipx_real_buffer = dpmi_get_temp_low_buffer( 1024 );	// 1k block
	if ( ipx_real_buffer == NULL )	{
		//printf( "Error allocation realmode memory\n" );
		return -4;
	}

	memset(&rregs,0,sizeof(dpmi_real_regs));
	rregs.ebx = 9;		// Get internetwork address
	rregs.esi = DPMI_real_offset(ipx_real_buffer);
	rregs.es = DPMI_real_segment(ipx_real_buffer);
	dpmi_real_int386x( 0x7A, &rregs );

	if ( rregs.eax & 0xFF )	{
		//printf( "Error getting internetwork address!\n" );
		return -2;
	}

	memcpy( &ipx_network, ipx_real_buffer, 4 );
	memcpy( &ipx_my_node, &ipx_real_buffer[4], 6 );

	Ipx_num_networks = 0;
	memcpy( &Ipx_networks[Ipx_num_networks++], &ipx_network, 4 );

	if ( show_address )	{
		printf( "My IPX addresss is " );
		printf( "%02X%02X%02X%02X/", ipx_real_buffer[0],ipx_real_buffer[1],ipx_real_buffer[2],ipx_real_buffer[3] );
		printf( "%02X%02X%02X%02X%02X%02X\n", ipx_real_buffer[4],ipx_real_buffer[5],ipx_real_buffer[6],ipx_real_buffer[7],ipx_real_buffer[8],ipx_real_buffer[9] );
		printf( "\n" );
	}

	packets = dpmi_real_malloc( sizeof(ipx_packet)*ipx_num_packets, &ipx_packets_selector );
	if ( packets == NULL )	{
		//printf( "Couldn't allocate real memory for %d packets\n", ipx_num_packets );
		return -4;
	}
	if (!dpmi_lock_region( packets, sizeof(ipx_packet)*ipx_num_packets ))	{
		//printf( "Couldn't lock real memory for %d packets\n", ipx_num_packets );
		return -4;
	}
	memset( packets, 0, sizeof(ipx_packet)*ipx_num_packets );

	for (i=1; i<ipx_num_packets; i++ )	{
		packets[i].ecb.in_use = 0x1d;
		//packets[i].ecb.in_use = 0;
		packets[i].ecb.socket_id = ipx_socket;
		packets[i].ecb.fragment_count = 1;
		packets[i].ecb.fragment_pointer[0] = DPMI_real_offset(&packets[i].ipx);
		packets[i].ecb.fragment_pointer[1] = DPMI_real_segment(&packets[i].ipx);
		packets[i].ecb.fragment_size = sizeof(ipx_packet)-sizeof(ecb_header);			//-sizeof(ecb_header);

		ipx_listen_for_packet(&packets[i].ecb);
	}

	packets[0].ecb.socket_id = ipx_socket;
	packets[0].ecb.fragment_count = 1;
	packets[0].ecb.fragment_pointer[0] = DPMI_real_offset(&packets[0].ipx);
	packets[0].ecb.fragment_pointer[1] = DPMI_real_segment(&packets[0].ipx);
	packets[0].ipx.packet_type = 4;		// IPX packet
	packets[0].ipx.destination.socket_id = ipx_socket;
//	memcpy( packets[0].ipx.destination.network_id, &ipx_network, 4 );
	memset( packets[0].ipx.destination.network_id, 0, 4 );

	return 0;
}
예제 #4
0
파일: dpmi.c 프로젝트: gameplayer22/d1x
int dpmi_init(int verbose)
{
    union REGS regs;
    struct SREGS sregs;
    mem_data mi;

    dpmi_dos_memory = dpmi_find_dos_memory();

    dpmi_dos_buffer = dpmi_real_malloc( 1024, &dpmi_dos_selector);
    if (!dpmi_dos_buffer) {
        dpmi_dos_selector = 0;
        printf( "Error allocating 1K of DOS memory\n" );
        exit(1);
    }
    atexit(dpmi_close);

    // Check dpmi
    memset(&regs,0,sizeof(regs));
    regs.x.eax = 0x400;							// DPMI Get Memory Info
    int386( 0x31, &regs, &regs );
    if (!regs.w.cflag)	{
        if (verbose) printf( "V%d.%d, CPU:%d, VMM:", regs.h.ah, regs.h.al, regs.h.cl );
        if (regs.w.bx & 4)	{
            if (verbose) printf( "1" );
            dpmi_virtual_memory = 1;
        } else {
            if (verbose) printf( "0" );
        }
    }

    //--------- Find available memory
    memset(&regs,0,sizeof(regs));
    memset(&sregs,0,sizeof(sregs));
    regs.x.eax = 0x500;							// DPMI Get Memory Info
    sregs.es = FP_SEG(&mi);
    regs.x.edi = FP_OFF(&mi);
    int386x( 0x31, &regs, &regs, &sregs );
    if (!regs.w.cflag)	{
        if (verbose) printf( ", P:%dK", mi.largest_lockable_pages*4 );
        if (dpmi_virtual_memory)
            if (verbose) printf( ", A:%dK", mi.largest_block_bytes/1024 );
        //dpmi_physical_memory = mi.largest_lockable_pages*4096;
        //dpmi_available_memory = mi.largest_block_bytes;
        dpmi_physical_memory = mi.total_physical_pages*4096;
        dpmi_available_memory = mi.total_pages * 4096;
    } else {
        if (verbose) printf( "MemInfo failed!" );
        dpmi_physical_memory = 16*1024*1024;		// Assume 16 MB
        dpmi_available_memory = 16*1024*1024;		// Assume 16 MB
    }

#ifdef __WATCOMC__
    if (!dpmi_lock_region( _GETDS, 4096 ))	{
        printf( "Error locking _GETDS" );
        exit(1);
    }
    if (!dpmi_lock_region( cstart_, 4096 )) {
        printf( "Error locking cstart" );
        exit(1);
    }
    if (!dpmi_lock_region( _chain_intr, 4096 ))	{
        printf( "Error locking _chain_intr" );
        exit(1);
    }
#endif
    return 1;
}
예제 #5
0
파일: gp2lap.c 프로젝트: Michael82/gp2lap
int main(int argc, const char *argv[])
// return values:
//  1 == error init dpmi / couldn't lock
//  2 == error initing log buffers
//  3 == error installing lammcall rmcode
//  4 == useipxlink requested, but couldn't install
//  5 == error while linking
//  6 == error loading gp2.exe
{
	char *fullname = NULL;
	DWORD *pULongCfg = NULL;
	char *pStrCfg = NULL;
	char cfgnamebuf[_MAX_PATH];
	char *cfgname = NULL;
	char *gp2exename = GP2_EXE_FILENAME;
	char *gp2logname = GP2LOG_DEBUG_FILENAME;
	DWORD dpmicode;
	ubyte log_flags = 0, i /* count var */;
	char tmpbuf[128];


#ifndef TEST
			//----- invoked by our own stub? --------
			// ACHTUNG: "GP2LINT" muss ungerade Anzahl Buchstaben haben (wegen updown & gamma)
	if (strcmp(getenv(updown("GP2LINT")), updown("GAMMA")) != 0) {
							//--- it's not defined, so leave quiet ---
#ifdef TEST
		fprintf(stderr, "GP2LINT not defined!\n");
#endif
		return 140;
	}
#endif

	printf(GP2LAP_BANNER_STR);
#ifdef SOCKCLNT
	printf("This version of GP2Lap was compiled as a socket client.\n");
#endif
#ifndef AUTH
	printf("This version of GP2Lap cannot be used for online leagues that require authentication.\n");
#endif
	//------- Init configuration
	if (GetConfigFileNameOpt(cfgnamebuf, _MAX_PATH, argc, (void*)argv)) {
		cfgname = cfgnamebuf;
		if (!strchr(cfgname, '.'))
			strcat(cfgname, ".cfg");
	} else
		cfgname = GP2LAP_CFG_FILENAME;

	switch (InitCfgValues(cfgname, &paths_to_check, &items, &fullname)) {
		case 0: printf("- Configuration read from: %s\n", fullname); break;
		case 1: fprintf(stderr, "*** can't open %s\n", fullname); break;
		case 2: fprintf(stderr, "*** can't locate %s\n", fullname); break;
	}

	pULongCfg = GetCfgULong("logDebug");
	if (pULongCfg)
		setbits(log_flags, BLF_DISABLED, !*pULongCfg);
	pULongCfg = GetCfgULong("logDebugFlush");
	if (pULongCfg)
		setbits(log_flags, BLF_FLUSHALWAYS, *pULongCfg);
	pStrCfg = GetCfgString("logDebugName");
	if (pStrCfg && strlen(pStrCfg) > 0)     // strlen doesn't seem to do nullptr chk
		gp2logname = pStrCfg;
	if (isoff(log_flags, BLF_DISABLED))
		printf("- Logging debug output to: %s\n", gp2logname);
	pULongCfg = GetCfgULong("hof25Enable");
	if (pULongCfg)
		opt_hof25 = *pULongCfg;
	if (opt_hof25)
		printf("- HOF2.5 mode enabled\n");
	pULongCfg = GetCfgULong("logPerf");
	if (pULongCfg)
		opt_log_perf = *pULongCfg;
	if (opt_log_perf)
		printf("- Extended perfing enabled\n");
	pULongCfg = GetCfgULong("logGLX");
	if (pULongCfg)
		opt_log_glx = *pULongCfg;
	if (opt_log_glx) {
		printf("- GLX log file enabled\n");
		// only enable opt_log_cc if opt_log_glx is TRUE
		pULongCfg = GetCfgULong("logCC");
		if (pULongCfg)
			opt_log_cc = *pULongCfg;
		if (opt_log_cc)
			printf("- Computer car logging enabled\n");
	}
	pULongCfg = GetCfgULong("Spa98");
	if (pULongCfg)
		opt_spa98 = *pULongCfg;
	if (opt_spa98)
		printf("- Spa '98 enabled\n");

	if (!LogStart(log_flags, gp2logname) && isoff(log_flags, BLF_DISABLED))
		fprintf(stderr, "*** error opening logfile '%s'\n", gp2logname);
	atexit(LogEnd);

#ifdef SOCKCLNT
	sockInit();
	atexit(sockExit);
#endif

	//--- init Frank's stuff ------
	init_new_gp2strings();  // init our strings
	FrankSoftInit();  // atexit'ed

	//---- init dpmi before all other stuff now ------
	dpmicode = dpmi_init(0 /* no verbose */); // atexit'ed
	if (dpmicode) {
		fprintf(stderr, "*** dpmi: error %04u\n", dpmicode);
		return 1;
	}

	initvesa();
 
	//---- lock my int9 handler ------
	if (!dpmi_lock_region((void near *)(MyInt9), 4096)) {  // should be enough
		 if (GetLogDpmiInfo())
			 LogLine("- dpmi: error: MI9 can't be locked!\n");
	} else {
		 if (GetLogDpmiInfo())
			 LogLine("- dpmis: MI9 locked\n");
	}

	//============================================
	//======== the complete logging stuff ========
	//============================================
	// Warning: don't change options after starting the log system!
	if (!Log_Create()) {
		fprintf(stderr, "*** error initing log buffers\n");
		return 2;
	}
	atexit(Log_Kill);

	if (!PrfLog_Create()) {
		fprintf(stderr, "*** error initing perf log buffers\n");
		return 2;
	}
	atexit(PrfLog_Kill);

	//=================================================
	//======== RM-Code fuer int21h vorbereiten =========
	//=================================================
	if ( !install_int21_hook() ) { // atexit'ed
		fprintf(stderr, "*** lowp: error e004");
		return 3;
	}

	//============================================
	//======== the complete network stuff ========
	//============================================
	if ( UseIpxLink ) {
		if ( !ipx_basic_init(0) ) // init the ipx  // atexit'ed
			return 4;
		if ( !start_ipx_link() )  // init the link
			return 5;
	}

	CloserInit();   // atexit'ed  // the very last

	//---- ok, send alive to logfile -----------
	_strdate(&tmpbuf);
	sprintf(strbuf,"\n"GP2LAP_NAME" started on %s ", tmpbuf);
	_strtime(&tmpbuf);
	strcat(strbuf, tmpbuf);
	strcat(strbuf, "\n");
	LogLine(strbuf);

	sprintf(strbuf, "- Code start at 0x%08x\n", &__begtext);
	LogLine(strbuf);

	//----- 08/99  for solving the int2F prob---------------
	InitFixInt2F();

	//----- Fremdapplikation starten -------
	putenv("DOS4G=QUIET");
	sprintf(strbuf, "Loading %s...\n", gp2exename);
	LogLine(strbuf);
	printf(strbuf);
	argv[0] = gp2exename;
	if (spawnv(P_WAIT, gp2exename, (void*)argv) < 0) {      // cast to void* to avoid warning about double indirection constness
		sprintf(strbuf, "*** error loading %s: %s\n", gp2exename, strerror(errno));
		LogLine(strbuf);
		fprintf(stderr, strbuf);
	}

#ifdef TEST
	sprintf(strbuf, "flagfield = 0x%08x\n", flagfield);
	LogLine(strbuf);
	if (GP2_Found && ((flagfield & 0xFFF) != 0x7))
		printf("\nflags == 0x%08X\n*** error flag field incorrect\n", flagfield);
#endif

	//--- saying bye now ------
	_strdate(&tmpbuf);
	sprintf(strbuf, GP2LAP_NAME" exiting on %s ", tmpbuf);
	_strtime(&tmpbuf);
	strcat(strbuf, tmpbuf);
	strcat(strbuf, "\n");
	LogLine(strbuf);

	return 0;
}
예제 #6
0
파일: mouse.c 프로젝트: gameplayer22/d2x-1
//--------------------------------------------------------
// returns 0 if no mouse
//           else number of buttons
int mouse_init(int enable_cyberman)
{
	dpmi_real_regs rr;
	cyberman_info *ci;
	struct SREGS sregs;
	union REGS inregs, outregs;
	ubyte *Mouse_dos_mem;

	if (Mouse_installed)
		return Mouse.num_buttons;

   if (_dos_getvect(0x33) == NULL) {
      // No mouse driver loaded
      return 0;
   }

	// Reset the mouse driver
	memset( &inregs, 0, sizeof(inregs) );
	inregs.w.ax = 0;
	int386(0x33, &inregs, &outregs);
	if (outregs.w.ax != 0xffff)
		return 0;

	Mouse.num_buttons = outregs.w.bx;
	Mouse.cyberman = 0;

	// Enable mouse driver
	memset( &inregs, 0, sizeof(inregs) );
	inregs.w.ax = 0x0020;
	int386(0x33, &inregs, &outregs);
	if (outregs.w.ax != 0xffff )
		return 0;

	if ( enable_cyberman )	{
		Mouse_dos_mem = dpmi_get_temp_low_buffer( 64 );
		if (Mouse_dos_mem==NULL)	{
			printf( "Unable to allocate DOS buffer in mouse.c\n" );
		} else {
			// Check for Cyberman...	
			memset( &rr, 0, sizeof(dpmi_real_regs) );
			rr.es = DPMI_real_segment(Mouse_dos_mem);
			rr.edx = DPMI_real_offset(Mouse_dos_mem);
			rr.eax = 0x53c1;
			dpmi_real_int386x( 0x33, &rr );
			if (rr.eax==1)	{
				// SWIFT functions supported
				ci	= (cyberman_info *)Mouse_dos_mem;
				if (ci->device_type==1)	{	// Cyberman	
					Mouse.cyberman = 1;
					//printf( "Cyberman mouse detected\n" );
					Mouse.num_buttons = 11;
				}
			}
		}
	}

	if (!dpmi_lock_region(&Mouse,sizeof(mouse_info)))	{
		Error( "Unable to lock mouse data region" );
	}
	if (!dpmi_lock_region((void near *)mouse_handler,(char *)mouse_handler_end - (char near *)mouse_handler))	{
		Error( "Unable to lock mouse handler" );
	}

	// Install mouse handler
	memset( &inregs, 0, sizeof(inregs));
	memset( &sregs, 0, sizeof(sregs));
	inregs.w.ax 	= 0xC;
	inregs.w.cx 	= ME_LB_P|ME_LB_R|ME_RB_P|ME_RB_R|ME_MB_P|ME_MB_R;	// watch all 3 button ups/downs
	if (Mouse.cyberman)
		inregs.w.cx 	|= ME_Z_C| ME_P_C| ME_B_C| ME_H_C;	// if using a cyberman, also watch z, pitch, bank, heading.
	inregs.x.edx	= FP_OFF(mouse_handler);
	sregs.es 		= FP_SEG(mouse_handler);
	int386x(0x33, &inregs, &outregs, &sregs);

	Mouse_installed = 1;

	atexit( mouse_close );

	mouse_flush();

	return Mouse.num_buttons;
}