Skip to content
Snippets Groups Projects
Commit 717592bc authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
Browse files

Remove the last remnants of Win9x/Me support

Allow "FOSSIL Only" as a configuration option for external programs in SCFG. This is a much easier method of disabling the virtual UART support in the Virtual UART/FOSSIL device driver (if/when necessary) than editing the sbbsexec.ini file (which is still supported).
parent 18bcbeb7
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #2501 passed
/* dosxtrn.c */
/* Synchronet External DOS Program Launcher (16-bit MSVC 1.52c project) */ /* Synchronet External DOS Program Launcher (16-bit MSVC 1.52c project) */
/* $Id: dosxtrn.c,v 1.25 2020/04/15 08:22:33 rswindell Exp $ */
/**************************************************************************** /****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
...@@ -42,7 +38,6 @@ ...@@ -42,7 +38,6 @@
#include <dos.h> /* _dos_set/getvect() */ #include <dos.h> /* _dos_set/getvect() */
#include <windows.h> /* BOOL, etc. */ #include <windows.h> /* BOOL, etc. */
#include "vdd_func.h" #include "vdd_func.h"
#include "execvxd.h"
#include "isvbop.h" /* ddk\inc */ #include "isvbop.h" /* ddk\inc */
#include "fossdefs.h" #include "fossdefs.h"
#include "../git_branch.h" #include "../git_branch.h"
...@@ -65,7 +60,6 @@ static void truncsp(char *str) ...@@ -65,7 +60,6 @@ static void truncsp(char *str)
} }
short vdd=0; short vdd=0;
BYTE node_num=0; BYTE node_num=0;
int mode=0;
char id_string[128]; char id_string[128];
#ifdef DEBUG_INT_CALLS #ifdef DEBUG_INT_CALLS
ulong int14calls=0; ulong int14calls=0;
...@@ -137,48 +131,6 @@ static int vdd_op(BYTE op) ...@@ -137,48 +131,6 @@ static int vdd_op(BYTE op)
return(retval); return(retval);
} }
union REGS inregs;
struct SREGS sregs;
BOOL inside_int14=FALSE;
/* This function is only necessary for naughty programs that call the vector
directly instead of issuing an interrupt
*/
void interrupt win95int14(
unsigned _es, unsigned _ds,
unsigned _di, unsigned _si,
unsigned _bp, unsigned _sp,
unsigned _bx, unsigned _dx,
unsigned _cx, unsigned _ax,
unsigned flags )
{
union REGS outregs;
/* prevent recursion, just incase the VXD isn't handling int14h */
if(inside_int14)
return;
inside_int14=TRUE;
inregs.x.ax=_ax;
inregs.x.bx=_bx;
inregs.x.cx=_cx;
inregs.x.dx=_dx;
inregs.x.si=_si;
inregs.x.di=_di;
inregs.x.cflag=flags;
sregs.es=_es;
sregs.ds=_ds;
int86x(0x14,&inregs,&outregs,&sregs);
/* FOSSIL driver only touches these AX and BX */
_ax= outregs.x.ax;
_bx= outregs.x.bx;
inside_int14=FALSE;
}
void vdd_getstatus(vdd_status_t* status) void vdd_getstatus(vdd_status_t* status)
{ {
...@@ -500,8 +452,8 @@ int main(int argc, char **argv) ...@@ -500,8 +452,8 @@ int main(int argc, char **argv)
char* envvar[MAX_ENVVARS]; char* envvar[MAX_ENVVARS];
char* arg[MAX_ARGS]; char* arg[MAX_ARGS];
int i,c,d,envnum=0; int i,c,d,envnum=0;
int mode = SBBSEXEC_MODE_UNSPECIFIED;
FILE* fp; FILE* fp;
BOOL NT=FALSE;
BOOL x64=FALSE; BOOL x64=FALSE;
BOOL success=FALSE; BOOL success=FALSE;
WORD buf_seg; WORD buf_seg;
...@@ -513,7 +465,7 @@ int main(int argc, char **argv) ...@@ -513,7 +465,7 @@ int main(int argc, char **argv)
,"%s - Copyright %s Rob Swindell\n" ,"%s - Copyright %s Rob Swindell\n"
,id_string, __DATE__+7); ,id_string, __DATE__+7);
fprintf(stderr fprintf(stderr
,"usage: dosxtrn <path/dosxtrn.env> [NT|95|x64] [node_num] [mode]\n"); ,"usage: dosxtrn <path/dosxtrn.env> [NT|x64] [node_num] [mode]\n");
return(1); return(1);
} }
...@@ -524,16 +476,17 @@ int main(int argc, char **argv) ...@@ -524,16 +476,17 @@ int main(int argc, char **argv)
DllName=dll; DllName=dll;
if(argc>2) { if(argc>2) {
if(strcmp(argv[2],"NT") == 0) if(strcmp(argv[2],"x64") == 0)
NT=TRUE; x64=TRUE;
else if(strcmp(argv[2],"x64") == 0)
NT=TRUE, x64=TRUE;
} }
if(argc>3) if(argc>3)
node_num=atoi(argv[3]); node_num=atoi(argv[3]);
if(argc>4) if(argc>4)
mode=atoi(argv[4]); mode=atoi(argv[4]);
if(mode == SBBSEXEC_MODE_UNSPECIFIED)
mode = SBBSEXEC_MODE_DEFAULT;
if((fp=fopen(argv[1],"r"))==NULL) { if((fp=fopen(argv[1],"r"))==NULL) {
fprintf(stderr,"!Error opening %s\n",argv[1]); fprintf(stderr,"!Error opening %s\n",argv[1]);
return(2); return(2);
...@@ -574,8 +527,6 @@ int main(int argc, char **argv) ...@@ -574,8 +527,6 @@ int main(int argc, char **argv)
((BYTE*)int14stub)[7] = FOSSIL_SIGNATURE>>8; /* FOSSIL sig (MSB) */ ((BYTE*)int14stub)[7] = FOSSIL_SIGNATURE>>8; /* FOSSIL sig (MSB) */
((BYTE*)int14stub)[8] = FOSSIL_FUNC_HIGHEST; /* FOSSIL highest func supported */ ((BYTE*)int14stub)[8] = FOSSIL_FUNC_HIGHEST; /* FOSSIL highest func supported */
if(NT) { /* Windows NT/2000 */
for(i=0;i<2;i++) { for(i=0;i<2;i++) {
/* Register VDD */ /* Register VDD */
...@@ -621,6 +572,8 @@ int main(int argc, char **argv) ...@@ -621,6 +572,8 @@ int main(int argc, char **argv)
sprintf(str,"%s, rev %u %s/%s, %s %s mode=%u", __FILE__, DOSXTRN_REVISION, GIT_BRANCH, GIT_HASH, __DATE__, __TIME__, mode); sprintf(str,"%s, rev %u %s/%s, %s %s mode=%u", __FILE__, DOSXTRN_REVISION, GIT_BRANCH, GIT_HASH, __DATE__, __TIME__, mode);
vdd_str(VDD_DEBUG_OUTPUT, str); vdd_str(VDD_DEBUG_OUTPUT, str);
if(mode & SBBSEXEC_MODE_UART)
vdd_op(VDD_VIRTUALIZE_UART);
i=vdd_op(VDD_OPEN); i=vdd_op(VDD_OPEN);
if(i) { if(i) {
fprintf(stderr,"!VDD_OPEN ERROR: %d\n",i); fprintf(stderr,"!VDD_OPEN ERROR: %d\n",i);
...@@ -630,7 +583,7 @@ int main(int argc, char **argv) ...@@ -630,7 +583,7 @@ int main(int argc, char **argv)
oldint16=_dos_getvect(0x16); oldint16=_dos_getvect(0x16);
oldint21=_dos_getvect(0x21); oldint21=_dos_getvect(0x21);
oldint29=_dos_getvect(0x29); oldint29=_dos_getvect(0x29);
if(mode==SBBSEXEC_MODE_FOSSIL) { if(mode & SBBSEXEC_MODE_FOSSIL) {
*(WORD*)((BYTE*)int14stub+1) = (WORD)winNTint14 - (WORD)&int14stub - 3; /* jmp offset */ *(WORD*)((BYTE*)int14stub+1) = (WORD)winNTint14 - (WORD)&int14stub - 3; /* jmp offset */
_dos_setvect(0x14,(void(interrupt *)())int14stub); _dos_setvect(0x14,(void(interrupt *)())int14stub);
} }
...@@ -639,11 +592,6 @@ int main(int argc, char **argv) ...@@ -639,11 +592,6 @@ int main(int argc, char **argv)
_dos_setvect(0x16,winNTint16); _dos_setvect(0x16,winNTint16);
if(mode&SBBSEXEC_MODE_DOS_OUT) if(mode&SBBSEXEC_MODE_DOS_OUT)
_dos_setvect(0x29,winNTint29); _dos_setvect(0x29,winNTint29);
}
else if(mode==SBBSEXEC_MODE_FOSSIL) { /* Windows 95/98/Millennium */
*(WORD*)((BYTE*)int14stub+1) = (WORD)win95int14 - (WORD)&int14stub - 3; /* jmp offset */
_dos_setvect(0x14,(void(interrupt *)())int14stub);
}
_heapmin(); _heapmin();
i=_spawnvp(_P_WAIT, arg[0], arg); i=_spawnvp(_P_WAIT, arg[0], arg);
...@@ -659,7 +607,6 @@ int main(int argc, char **argv) ...@@ -659,7 +607,6 @@ int main(int argc, char **argv)
/* Restore original ISRs */ /* Restore original ISRs */
_dos_setvect(0x14,oldint14); _dos_setvect(0x14,oldint14);
if(NT) {
vdd_op(VDD_CLOSE); vdd_op(VDD_CLOSE);
_dos_setvect(0x16,oldint16); _dos_setvect(0x16,oldint16);
...@@ -698,7 +645,5 @@ int main(int argc, char **argv) ...@@ -698,7 +645,5 @@ int main(int argc, char **argv)
_asm mov ax, vdd; _asm mov ax, vdd;
UnRegisterModule(); UnRegisterModule();
}
return(i); return(i);
} }
/* execvxd.h */
/* Synchronet FOSSIL driver (VxD) for Windows 9x API */
/* $Id: execvxd.h,v 1.1.1.1 2000/10/10 11:26:23 rswindell Exp $ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#define SBBSEXEC_VXD "sbbsexec.vxd"
#define SBBSEXEC_IOCTL_START 0x8001
#define SBBSEXEC_IOCTL_COMPLETE 0x8002
#define SBBSEXEC_IOCTL_READ 0x8003
#define SBBSEXEC_IOCTL_WRITE 0x8004
#define SBBSEXEC_IOCTL_DISCONNECT 0x8005
#define SBBSEXEC_IOCTL_STOP 0x8006
#define SBBSEXEC_MODE_FOSSIL (0)
#define SBBSEXEC_MODE_DOS_IN (1<<0)
#define SBBSEXEC_MODE_DOS_OUT (1<<1)
#define SBBSEXEC_MODE_UART (1<<2)
enum {
SBBSEXEC_ERROR_INUSE=1
,SBBSEXEC_ERROR_INBUF
,SBBSEXEC_ERROR_INDATA
,SBBSEXEC_ERROR_IOCTL
,SBBSEXEC_ERROR_OUTBUF
};
typedef struct {
DWORD mode;
HANDLE event;
} sbbsexec_start_t;
extern HANDLE exec_mutex;
@echo off
xcopy sbbsexec.vxd c:\sbbs\exec
/* DEBUGOUT.H */
/* $Id: debugout.h,v 1.1.1.1 2000/10/10 11:27:22 rswindell Exp $ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
#ifndef _DEBUGOUT_H_
#define _DEBUGOUT_H_
#ifndef DEBUG_VAR // Pre-define to use different/dynamic debug enable var
#define DEBUG_VAR 0x1
#endif
#ifndef DEVICENAME // Pre-define to display devicename on output
#define DEVICENAME "DBTRACE"
#endif
#ifndef DBTRACEDPF // Pre-define if using other printf type function
#define DBTRACEDPF dprintf
#endif
#ifndef DBTFILEOFF // Pre-define if __FILE__ offset required != 2
#define DBTFILEOFF 2
#endif
#ifndef TEXT // Windows Unicode support
#define TEXT(x) x
#endif
#ifndef DBTRACENL // Pre-define if \n required
#define DBTRACENL TEXT("")
#endif
#if !defined(DBG) && !defined(DEBUG)
#define DBTRACE(b,s); { /* DBTRACE */ }
#define DBTRACEd(b,s,d); { /* DBTRACE */ }
#define DBTRACEs(b,s,t); { /* DBTRACE */ }
#define DBTRACEx(b,s,x); { /* DBTRACE */ }
#define DBTRACEdd(b,s,x,y); { /* DBTRACE */ }
#define DBTRACEds(b,s,x,y); { /* DBTRACE */ }
#define DBTRACEsd(b,s,x,y); { /* DBTRACE */ }
#define DBTRACEdx(b,s,x,y); { /* DBTRACE */ }
#define DBTRACExd(b,s,x,y); { /* DBTRACE */ }
#define DBTRACExx(b,s,x,y); { /* DBTRACE */ }
#define DBTRACEsx(b,s,x,y); { /* DBTRACE */ }
#define DBTRACExs(b,s,x,y); { /* DBTRACE */ }
#define DBTRACEss(b,s,x,y); { /* DBTRACE */ }
#define DBTRACExxd(b,s,x,y,z); { /* DBTRACE */ }
#define DBTRACEddx(b,s,x,y,z); { /* DBTRACE */ }
#define DBTRACEdds(b,s,x,y,z); { /* DBTRACE */ }
#define DBTRACExdd(b,s,x,y,z); { /* DBTRACE */ }
#define DBTRACExxx(b,s,x,y,z); { /* DBTRACE */ }
#define DBTRACExsx(b,s,x,y,z); { /* DBTRACE */ }
#else /* DBG or DEBUG */
#define DBTRACE(b,s); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s) \
,DBTRACENL); } }
#define DBTRACEd(b,s,d); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ") \
TEXT("%d%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),d \
,DBTRACENL); } }
#define DBTRACEs(b,s,t); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%s%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),t \
,DBTRACENL); } }
#define DBTRACEx(b,s,x); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%02X%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x \
,DBTRACENL); } }
#define DBTRACEdd(b,s,x,y); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%d %d%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,y \
,DBTRACENL); } }
#define DBTRACEds(b,s,x,y); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%d %s%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,y \
,DBTRACENL); } }
#define DBTRACEsd(b,s,x,y); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%s %d%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,y \
,DBTRACENL); } }
#define DBTRACEdx(b,s,x,y); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%d %X%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,y \
,DBTRACENL); } }
#define DBTRACExd(b,s,x,y); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %d%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,y \
,DBTRACENL); } }
#define DBTRACExx(b,s,x,y); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %X%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,y \
,DBTRACENL); } }
#define DBTRACEsx(b,s,t,x); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%s %X%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),t,x \
,DBTRACENL); } }
#define DBTRACExs(b,s,x,t); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %s%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,t \
,DBTRACENL); } }
#define DBTRACEss(b,s,x,t); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%s %s%s") \
,DEVICENAME,TEXT(__FILE__+DBTFILEOFF) \
,__LINE__,TEXT(s),x,t \
,DBTRACENL); } }
#define DBTRACEddx(b,s,x,y,z); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%d %d %X%s") \
,DEVICENAME \
,TEXT(__FILE__+DBTFILEOFF),__LINE__ \
,TEXT(s),x,y,z \
,DBTRACENL); } }
#define DBTRACEdds(b,s,x,y,z); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%d %d %s%s") \
,DEVICENAME \
,TEXT(__FILE__+DBTFILEOFF),__LINE__ \
,TEXT(s),x,y,z \
,DBTRACENL); } }
#define DBTRACExdd(b,s,x,y,z); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %d %d%s") \
,DEVICENAME \
,TEXT(__FILE__+DBTFILEOFF),__LINE__ \
,TEXT(s),x,y,z \
,DBTRACENL); } }
#define DBTRACExxd(b,s,x,y,z); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %X %d%s") \
,DEVICENAME \
,TEXT(__FILE__+DBTFILEOFF),__LINE__ \
,TEXT(s),x,y,z \
,DBTRACENL); } }
#define DBTRACExxx(b,s,x,y,z); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %X %X%s") \
,DEVICENAME \
,TEXT(__FILE__+DBTFILEOFF),__LINE__ \
,TEXT(s),x,y,z \
,DBTRACENL); } }
#define DBTRACExsx(b,s,x,t,z); { if(DEBUG_VAR&(1<<b)) { \
DBTRACEDPF(TEXT("%-8s (%-12.12s %4d): %s: ")\
TEXT("%X %s %X%s") \
,DEVICENAME \
,TEXT(__FILE__+DBTFILEOFF),__LINE__ \
,TEXT(s),x,t,z \
,DBTRACENL); } }
#endif
#endif // Don't add anything after this line
# makefile for SBBSEXEC.VXD
DEVICENAME = SBBSEXEC
FRAMEWORK = CPP
XFLAGS = -I..
OBJECTS = sbbsexec.obj ringbuf.obj
SOURCEINCPATH = ..
DEBUG = 0
DYNAMIC = 1
!include $(VTOOLSD)\include\vtoolsd.mak
!include $(VTOOLSD)\include\vxdtarg.mak
sbbsexec.obj: sbbsexec.cpp makefile
ringbuf.obj: ..\ringbuf.c ..\ringbuf.h
This diff is collapsed.
// sbbsexec.h - include file for SBBSEXEC
/* Synchronet Windows 9X FOSSIL driver (requires VtoolsD C++ framework) */
/* $Id: sbbsexec.h,v 1.2 2001/05/02 01:58:31 rswindell Exp $ */
/****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
* *
* Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 *
* of the License, or (at your option) any later version. *
* See the GNU General Public License for more details: gpl.txt or *
* http://www.fsf.org/copyleft/gpl.html *
* *
* Anonymous FTP access to the most recent released source is available at *
* ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
* *
* Anonymous CVS access to the development source and modification history *
* is available at cvs.synchro.net:/cvsroot/sbbs, example: *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login *
* (just hit return, no password is necessary) *
* cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src *
* *
* For Synchronet coding style and modification guidelines, see *
* http://www.synchro.net/source.html *
* *
* You are encouraged to submit any modifications (preferably in Unix diff *
* format) via e-mail to mods@synchro.net *
* *
* Note: If this box doesn't appear square, then you need to fix your tabs. *
****************************************************************************/
////////////////////////////////////////////////////////////////////////
// Basic defintions for VToolsD framework
#include <vtoolscp.h>
#define DEVICE_CLASS SBBSExec
#define SBBSExec_DeviceID UNDEFINED_DEVICE_ID
#define SBBSExec_Major 1
#define SBBSExec_Minor 1
#define SBBSExec_Init_Order UNDEFINED_INIT_ORDER
#include "..\execvxd.h" // sbbsexec_start_t definition
#include "..\ringbuf.h" // RingBuf/RingBuffer
////////////////////////////////////////////////////////////////////////
class SBBSExec : public VDevice
{
public:
virtual BOOL OnDeviceInit(VMHANDLE hSysVM, PCHAR pszCmdTail);
virtual BOOL OnSysDynamicDeviceInit();
virtual void OnSystemExit(VMHANDLE hSysVM);
virtual BOOL OnSysDynamicDeviceExit();
virtual BOOL OnCreateVM(VMHANDLE hVM);
virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pIOCTL);
void UnhookInts(void);
// Variables
class SBBSExecInt29* pInt29;
class SBBSExecInt21* pInt21;
class SBBSExecInt16* pInt16;
class SBBSExecInt14* pInt14;
class SBBSExecInt10* pInt10;
};
class SBBSExecInt29 : public VPreChainV86Int
{
public:
SBBSExecInt29();
virtual BOOL handler(VMHANDLE, CLIENT_STRUCT*, DWORD);
};
class SBBSExecInt21 : public VPreChainV86Int
{
public:
SBBSExecInt21();
virtual BOOL handler(VMHANDLE, CLIENT_STRUCT*, DWORD);
};
class SBBSExecInt16 : public VPreChainV86Int
{
public:
SBBSExecInt16();
virtual BOOL handler(VMHANDLE, CLIENT_STRUCT*, DWORD);
};
class SBBSExecInt14 : public VPreChainV86Int
{
public:
SBBSExecInt14();
virtual BOOL handler(VMHANDLE, CLIENT_STRUCT*, DWORD);
};
class SBBSExecInt10 : public VPreChainV86Int
{
public:
SBBSExecInt10();
virtual BOOL handler(VMHANDLE, CLIENT_STRUCT*, DWORD);
};
CompanyName = "Company Name"
FileDescription = "VxD File Description"
FileVersion = "Version 1.00"
InternalName = "DEVNAME"
LegalCopyright = "Copyright \251 1995, Company Name. "
OriginalFilename = "device.vxd"
ProductName = "Product Name"
ProductVersion = "Version 1.00"
Translation = 0x409, 0x4E4
...@@ -395,12 +395,10 @@ typedef enum { /* Values for xtrn_t.event */ ...@@ -395,12 +395,10 @@ typedef enum { /* Values for xtrn_t.event */
#define SAVECOLUMNS (1<<22) /* Save/share current terminal width */ #define SAVECOLUMNS (1<<22) /* Save/share current terminal width */
#define XTRN_UTF8 (1<<23) /* External program supports UTF-8 */ #define XTRN_UTF8 (1<<23) /* External program supports UTF-8 */
#define XTRN_TEMP_DIR (1<<24) /* Place drop files in temp dir */ #define XTRN_TEMP_DIR (1<<24) /* Place drop files in temp dir */
#define XTRN_UART (1<<25) /* Disable the int14h/FOSSIL driver */ #define XTRN_UART (1<<25) /* Enable the virtual UART driver */
#define XTRN_FOSSIL (1<<26) /* Enable the int14h/FOSSIL driver */
#define XTRN_CONIO (1<<31) /* Intercept Windows Console I/O (Drwy) */ #define XTRN_CONIO (1<<31) /* Intercept Windows Console I/O (Drwy) */
/* Bits in cfg.xtrn_misc */
#define XTRN_NO_MUTEX (1<<0) /* Do not use exec_mutex for FOSSIL VXD */
/* Bits in user.qwk */ /* Bits in user.qwk */
#define QWK_FILES (1L<<0) /* Include new files list */ #define QWK_FILES (1L<<0) /* Include new files list */
#define QWK_EMAIL (1L<<1) /* Include unread e-mail */ #define QWK_EMAIL (1L<<1) /* Include unread e-mail */
...@@ -812,6 +810,7 @@ enum { /* readmail and delmailidx which types */ ...@@ -812,6 +810,7 @@ enum { /* readmail and delmailidx which types */
#define EX_NOECHO XTRN_NOECHO /* Don't echo stdin to stdout */ #define EX_NOECHO XTRN_NOECHO /* Don't echo stdin to stdout */
#define EX_STDIO (EX_STDIN|EX_STDOUT) #define EX_STDIO (EX_STDIN|EX_STDOUT)
#define EX_UART XTRN_UART #define EX_UART XTRN_UART
#define EX_FOSSIL XTRN_FOSSIL
#define EX_NOLOG (1<<30) /* Don't log intercepted stdio */ #define EX_NOLOG (1<<30) /* Don't log intercepted stdio */
#define EX_CONIO (1<<31) /* Intercept Windows console I/O (doorway) */ #define EX_CONIO (1<<31) /* Intercept Windows console I/O (doorway) */
#define EX_UNSPECIFIED -1 #define EX_UNSPECIFIED -1
......
...@@ -68,7 +68,7 @@ BYTE uart_divisor_latch_msb = 0x00; ...@@ -68,7 +68,7 @@ BYTE uart_divisor_latch_msb = 0x00;
int log_level = LOG_WARNING; int log_level = LOG_WARNING;
#endif #endif
BOOL virtualize_uart=TRUE; BOOL virtualize_uart=FALSE;
double yield_interval=1.0; double yield_interval=1.0;
BOOL hangup_supported=TRUE; BOOL hangup_supported=TRUE;
HANDLE hangup_event=NULL; HANDLE hangup_event=NULL;
...@@ -799,6 +799,10 @@ __declspec(dllexport) void __cdecl VDDDispatch(void) ...@@ -799,6 +799,10 @@ __declspec(dllexport) void __cdecl VDDDispatch(void)
hangup(); hangup();
break; break;
case VDD_VIRTUALIZE_UART:
virtualize_uart = TRUE;
break;
default: default:
lprintf(LOG_ERR,"!UNKNOWN VDD_OP: %d",getBL()); lprintf(LOG_ERR,"!UNKNOWN VDD_OP: %d",getBL());
break; break;
......
...@@ -880,7 +880,7 @@ const char* io_method(uint32_t mode) ...@@ -880,7 +880,7 @@ const char* io_method(uint32_t mode)
static char str[128]; static char str[128];
sprintf(str,"%s%s%s" sprintf(str,"%s%s%s"
,mode & XTRN_UART ? "UART" ,mode & XTRN_UART ? "UART" : (mode & XTRN_FOSSIL) ? "FOSSIL"
: (mode & XTRN_STDIO ? "Standard" : (mode & XTRN_STDIO ? "Standard"
: mode & XTRN_CONIO ? "Console": (mode & XTRN_NATIVE ? "Socket" : "FOSSIL or UART")) : mode & XTRN_CONIO ? "Console": (mode & XTRN_NATIVE ? "Socket" : "FOSSIL or UART"))
,(mode & (XTRN_STDIO|WWIVCOLOR)) == (XTRN_STDIO|WWIVCOLOR) ? ", WWIV Color" : "" ,(mode & (XTRN_STDIO|WWIVCOLOR)) == (XTRN_STDIO|WWIVCOLOR) ? ", WWIV Color" : ""
...@@ -892,13 +892,16 @@ void choose_io_method(uint32_t* misc) ...@@ -892,13 +892,16 @@ void choose_io_method(uint32_t* misc)
{ {
int k; int k;
switch((*misc) & (XTRN_STDIO|XTRN_UART)) { switch((*misc) & (XTRN_STDIO|XTRN_UART|XTRN_FOSSIL)) {
case XTRN_STDIO: case XTRN_STDIO:
k=0; k=0;
break; break;
case XTRN_UART: case XTRN_UART:
k=2; k=2;
break; break;
case XTRN_FOSSIL:
k=3;
break;
default: default:
k=1; k=1;
break; break;
...@@ -952,15 +955,16 @@ void choose_io_method(uint32_t* misc) ...@@ -952,15 +955,16 @@ void choose_io_method(uint32_t* misc)
" This setting is not applied when invoking Baja or JavaScript modules.\n" " This setting is not applied when invoking Baja or JavaScript modules.\n"
; ;
strcpy(opt[1], "FOSSIL or UART"); strcpy(opt[1], "FOSSIL or UART");
strcpy(opt[2], "UART"); strcpy(opt[2], "UART Only");
opt[3][0] = '\0'; strcpy(opt[3], "FOSSIL Only");
opt[4][0] = '\0';
} }
switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"I/O Method" switch(uifc.list(WIN_MID|WIN_SAV,0,0,0,&k,0,"I/O Method"
,opt)) { ,opt)) {
case 0: /* Standard I/O */ case 0: /* Standard I/O */
if(((*misc) & (XTRN_STDIO|XTRN_UART)) != XTRN_STDIO) { if(((*misc) & (XTRN_STDIO|XTRN_UART|XTRN_FOSSIL)) != XTRN_STDIO) {
(*misc) |=XTRN_STDIO; (*misc) |=XTRN_STDIO;
(*misc) &=~XTRN_UART; (*misc) &=~XTRN_UART|XTRN_FOSSIL;
uifc.changes = TRUE; uifc.changes = TRUE;
} }
k=((*misc) & WWIVCOLOR) ? 0:1; k=((*misc) & WWIVCOLOR) ? 0:1;
...@@ -999,16 +1003,23 @@ void choose_io_method(uint32_t* misc) ...@@ -999,16 +1003,23 @@ void choose_io_method(uint32_t* misc)
uifc.changes=TRUE; uifc.changes=TRUE;
} }
break; break;
case 1: /* FOSSIL or Socket */ case 1: /* FOSSIL or UART or Socket */
if(((*misc) & (XTRN_STDIO|XTRN_UART)) != 0) { if(((*misc) & (XTRN_STDIO|XTRN_UART|XTRN_FOSSIL)) != 0) {
(*misc) &= ~(XTRN_UART|XTRN_STDIO|WWIVCOLOR|XTRN_NOECHO); (*misc) &= ~(XTRN_UART|XTRN_FOSSIL|XTRN_STDIO|WWIVCOLOR|XTRN_NOECHO);
uifc.changes=TRUE; uifc.changes=TRUE;
} }
break; break;
case 2: /* UART */ case 2: /* UART */
if(((*misc) & (XTRN_STDIO|XTRN_UART)) != XTRN_UART) { if(((*misc) & (XTRN_STDIO|XTRN_UART|XTRN_FOSSIL)) != XTRN_UART) {
(*misc) |= XTRN_UART; (*misc) |= XTRN_UART;
(*misc) &= ~(XTRN_STDIO|WWIVCOLOR|XTRN_NOECHO); (*misc) &= ~(XTRN_FOSSIL|XTRN_STDIO|WWIVCOLOR|XTRN_NOECHO);
uifc.changes=TRUE;
}
break;
case 3: /* FOSSIL */
if(((*misc) & (XTRN_STDIO|XTRN_UART|XTRN_FOSSIL)) != XTRN_FOSSIL) {
(*misc) |= XTRN_FOSSIL;
(*misc) &= ~(XTRN_UART|XTRN_STDIO|WWIVCOLOR|XTRN_NOECHO);
uifc.changes=TRUE; uifc.changes=TRUE;
} }
break; break;
......
/* VDD_FUNC.H */
/* Synchronet WinNT VDD FOSSIL constant/type definitions */ /* Synchronet WinNT VDD FOSSIL constant/type definitions */
/* $Id: vdd_func.h,v 1.10 2018/07/24 01:11:08 rswindell Exp $ */
/**************************************************************************** /****************************************************************************
* @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.tab-size 4 (Plain Text/Source Code File Header) *
* @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
...@@ -56,6 +52,7 @@ enum { ...@@ -56,6 +52,7 @@ enum {
,VDD_LOAD_INI_SECTION =16 ,VDD_LOAD_INI_SECTION =16
,VDD_DEBUG_OUTPUT =17 ,VDD_DEBUG_OUTPUT =17
,VDD_HANGUP =18 ,VDD_HANGUP =18
,VDD_VIRTUALIZE_UART =19
}; };
typedef struct { typedef struct {
...@@ -65,3 +62,10 @@ typedef struct { ...@@ -65,3 +62,10 @@ typedef struct {
DWORD outbuf_size; DWORD outbuf_size;
DWORD outbuf_full; DWORD outbuf_full;
} vdd_status_t; } vdd_status_t;
#define SBBSEXEC_MODE_UNSPECIFIED 0
#define SBBSEXEC_MODE_DOS_IN (1<<0)
#define SBBSEXEC_MODE_DOS_OUT (1<<1)
#define SBBSEXEC_MODE_UART (1<<2)
#define SBBSEXEC_MODE_FOSSIL (1<<3)
#define SBBSEXEC_MODE_DEFAULT (SBBSEXEC_MODE_UART | SBBSEXEC_MODE_FOSSIL)
...@@ -261,7 +261,7 @@ static bool native_executable(scfg_t* cfg, const char* cmdline, long mode) ...@@ -261,7 +261,7 @@ static bool native_executable(scfg_t* cfg, const char* cmdline, long mode)
#ifdef _WIN32 #ifdef _WIN32
#include "execvxd.h" /* DOSXTRN.EXE API */ #include "vdd_func.h" /* DOSXTRN.EXE API */
extern SOCKET node_socket[]; extern SOCKET node_socket[];
...@@ -292,7 +292,6 @@ static void add_env_var(str_list_t* list, const char* var, const char* val) ...@@ -292,7 +292,6 @@ static void add_env_var(str_list_t* list, const char* var, const char* val)
/* Clean-up resources while preserving current LastError value */ /* Clean-up resources while preserving current LastError value */
#define XTRN_CLEANUP \ #define XTRN_CLEANUP \
last_error=GetLastError(); \ last_error=GetLastError(); \
if(vxd!=INVALID_HANDLE_VALUE) CloseHandle(vxd); \
if(rdslot!=INVALID_HANDLE_VALUE) CloseHandle(rdslot); \ if(rdslot!=INVALID_HANDLE_VALUE) CloseHandle(rdslot); \
if(wrslot!=INVALID_HANDLE_VALUE) CloseHandle(wrslot); \ if(wrslot!=INVALID_HANDLE_VALUE) CloseHandle(wrslot); \
if(start_event!=NULL) CloseHandle(start_event); \ if(start_event!=NULL) CloseHandle(start_event); \
...@@ -327,7 +326,6 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -327,7 +326,6 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
BOOL processTerminated=false; BOOL processTerminated=false;
uint i; uint i;
time_t hungup=0; time_t hungup=0;
HANDLE vxd=INVALID_HANDLE_VALUE;
HANDLE rdslot=INVALID_HANDLE_VALUE; HANDLE rdslot=INVALID_HANDLE_VALUE;
HANDLE wrslot=INVALID_HANDLE_VALUE; HANDLE wrslot=INVALID_HANDLE_VALUE;
HANDLE start_event=NULL; HANDLE start_event=NULL;
...@@ -478,15 +476,15 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -478,15 +476,15 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
SAFEPRINTF2(fullcmdline, "%sDOSXTRN.EXE %s", cfg.exec_dir, path); SAFEPRINTF2(fullcmdline, "%sDOSXTRN.EXE %s", cfg.exec_dir, path);
if(!(mode&EX_OFFLINE)) { if(!(mode&EX_OFFLINE)) {
i = SBBSEXEC_MODE_UNSPECIFIED;
if(mode & EX_UART) if(mode & EX_UART)
i=SBBSEXEC_MODE_UART; i |= SBBSEXEC_MODE_UART;
else { if(mode & EX_FOSSIL)
i=SBBSEXEC_MODE_FOSSIL; i |= SBBSEXEC_MODE_FOSSIL;
if(mode & EX_STDIN) if(mode & EX_STDIN)
i |= SBBSEXEC_MODE_DOS_IN; i |= SBBSEXEC_MODE_DOS_IN;
if(mode & EX_STDOUT) if(mode & EX_STDOUT)
i |= SBBSEXEC_MODE_DOS_OUT; i |= SBBSEXEC_MODE_DOS_OUT;
}
BOOL x64 = FALSE; BOOL x64 = FALSE;
IsWow64Process(GetCurrentProcess(), &x64); IsWow64Process(GetCurrentProcess(), &x64);
sprintf(str," %s %u %u" sprintf(str," %s %u %u"
...@@ -646,7 +644,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir) ...@@ -646,7 +644,7 @@ int sbbs_t::external(const char* cmdline, long mode, const char* startup_dir)
while(!(mode&EX_BG)) { while(!(mode&EX_BG)) {
if(mode&EX_CHKTIME) if(mode&EX_CHKTIME)
gettimeleft(); gettimeleft();
if(!online && !(mode&EX_OFFLINE)) { // Tell VXD/VDD and external that user hung-up if(!online && !(mode&EX_OFFLINE)) { // Tell VDD and external that user hung-up
if(was_online) { if(was_online) {
logline(LOG_NOTICE,"X!","hung-up in external program"); logline(LOG_NOTICE,"X!","hung-up in external program");
hungup=time(NULL); hungup=time(NULL);
......
...@@ -1587,6 +1587,8 @@ bool sbbs_t::exec_xtrn(uint xtrnnum) ...@@ -1587,6 +1587,8 @@ bool sbbs_t::exec_xtrn(uint xtrnnum)
mode|=EX_CONIO; mode|=EX_CONIO;
else if(cfg.xtrn[xtrnnum]->misc&XTRN_UART) else if(cfg.xtrn[xtrnnum]->misc&XTRN_UART)
mode|=EX_UART; mode|=EX_UART;
else if(cfg.xtrn[xtrnnum]->misc&XTRN_FOSSIL)
mode|=EX_FOSSIL;
mode|=(cfg.xtrn[xtrnnum]->misc&(XTRN_CHKTIME|XTRN_NATIVE|XTRN_NOECHO|WWIVCOLOR)); mode|=(cfg.xtrn[xtrnnum]->misc&(XTRN_CHKTIME|XTRN_NATIVE|XTRN_NOECHO|WWIVCOLOR));
if(cfg.xtrn[xtrnnum]->misc&MODUSERDAT) { /* Delete MODUSER.DAT */ if(cfg.xtrn[xtrnnum]->misc&MODUSERDAT) { /* Delete MODUSER.DAT */
SAFEPRINTF(str,"%sMODUSER.DAT",dropdir); /* if for some weird */ SAFEPRINTF(str,"%sMODUSER.DAT",dropdir); /* if for some weird */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment