Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

104 lines
5.1 KiB

/***************************************************************************
Name : COMDEVI.H
Comment : Controls Comm interface used by Fax Modem Driver. There are
4 choices.
(a) If UCOM is defined, it uses the WIN16 Comm API as exported
by USER.EXE (though eventually it gets to COMM.DRV)
(b) If UCOM is not defined and VC is defined, it uses the
COMM.DRV-like interface exported by DLLSCHED.DLL (which
merely serves as a front for VCOMM.386)
(c) If neither UCOM nor VC are defined, it uses Win3.1 COMM.DRV
export directly.
(d) If WIN32 is defined (neither UCOM or VC should be defined at
the same time), it uses the WIN32 Comm API
Functions: (see Prototypes just below)
Revision Log
Date Name Description
-------- ----- ---------------------------------------------------------
***************************************************************************/
#pragma optimize("e", off) // "e" is buggy
// must be 8K or less, dues to DEADCOMMTIMEOUT. See fcom.c!!
// maybe not...
// #define COM_INBUFSIZE 16384
// #define COM_OUTBUFSIZE 16384
#define COM_INBUFSIZE 4096
#define COM_OUTBUFSIZE 4096
// #define COM_INBUFSIZE 256
// #define COM_OUTBUFSIZE 256
// #define COM_INBUFSIZE 1024
// #define COM_OUTBUFSIZE 1024
#define BETWEENCALL_THRESH 50
#ifdef DEBUG
# define CALLTHRESH_CONST 50
# define CALLTHRESH_PERBYTE 1
# define BEFORECALL static DWORD t1, t2; t1=GetTickCount();
# define INTERCALL(sz)
/*
# define INTERCALL(sz) if((t1-t2) > BETWEENCALL_THRESH)\
ERRMSG(("!!!Inter API %s delay %ld!!!\r\n", (LPSTR)(sz), (t1-t2)));
*/
# define AFTERCALL(sz,n) \
t2=GetTickCount();\
if((t2-t1) > (CALLTHRESH_CONST+((DWORD)n)*CALLTHRESH_PERBYTE)) \
ERRMSG(("!!!API %s took %ld!!!\r\n", (LPSTR)(sz), (t2-t1)));
#else
# define BEFORECALL
# define AFTERCALL
# define INTERCALL
#endif
#if INVALID_HANDLE_VALUE >= 0 // must be <= 0
#error INVALID_HANDLE_VALUE is >=0. This won't work....
#endif
#define My2ndOpenComm(sz, ph) \
{ BEFORECALL; \
if((*((LPHANDLE)(ph)) = CreateFile((LPCTSTR)(sz), GENERIC_READ|GENERIC_WRITE, \
0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL)) != INVALID_HANDLE_VALUE) \
{ \
if(!SetupComm(*((LPHANDLE)(ph)), COM_INBUFSIZE, COM_OUTBUFSIZE)) \
{ \
CloseHandle(*((LPHANDLE)(ph))); \
*((LPHANDLE)(ph)) = INVALID_HANDLE_VALUE; \
} \
} \
AFTERCALL("Open", 0); \
} \
#define My2ndCloseComm(h, pn) { BEFORECALL; *(pn) = (!CloseHandle((HANDLE)h)); AFTERCALL("Close",0); }
#define MySetCommState(h,pdcb) (!SetCommState((HANDLE)(h), (pdcb)))
#define MyGetCommState(h,pdcb) (!GetCommState((HANDLE)(h), (pdcb)))
#define OVL_CLEAR(lpovl) \
{ \
if (lpovl) \
{ \
(lpovl)->Internal = (lpovl)->InternalHigh=\
(lpovl)->Offset = (lpovl)->OffsetHigh=0; \
if ((lpovl)->hEvent) ResetEvent((lpovl)->hEvent); \
} \
}
#define MySetCommMask(h,mask) (!SetCommMask((HANDLE)(h), (mask)))
#define MyFlushComm(h,q) (!PurgeComm((HANDLE)h, ((q)==0 ? PURGE_TXCLEAR : PURGE_RXCLEAR)))
#define MySetXON(h) (!EscapeCommFunction((HANDLE)(h), SETXON))