226 lines
11 KiB
C
226 lines
11 KiB
C
// COMM MONITOR CODE
|
|
// 2/11/95 JosephJ Created
|
|
//
|
|
// The functions MonInit, MonDeInit, MonPut and MonDump may be used
|
|
// to timestamp and log all reads from/writes using the comm apis.
|
|
// MonDump creates two files, one a byte buffer, and the 2nd
|
|
// an array of MONREC structures, each structure containing a timestamp
|
|
// and an offset into the first file that points to the actual comm data.
|
|
|
|
|
|
|
|
|
|
// Following two macros to be called before each write attempt
|
|
// and after each non-zero read.
|
|
# define INMON(pTG, lpb, cb) \
|
|
(pTG->gMonInfo.fInited && MonPutComm(pTG, fMON_COMM_IN, lpb,cb))
|
|
# define OUTMON(pTG, lpb, cb) \
|
|
(pTG->gMonInfo.fInited && MonPutComm(pTG, fMON_COMM_OUT, lpb,cb))
|
|
# define PUTEVENT(pTG, wFlags, ID, SubID, dw0, dw1, lpsz)\
|
|
(pTG->gMonInfo.fInited && MonPutEvent(pTG, wFlags, ID, SubID, dw0, dw1, lpsz))
|
|
|
|
//File extensions for the mon-file
|
|
#define szMON_EXT "mon"
|
|
|
|
|
|
// Min and Max sizes of internal buffers allocated for monitoring.
|
|
// MonInit will enforce that the sizes fall within this range.
|
|
#define MIN_MRBUFSIZE (65536L>>2)
|
|
#define MIN_DATABUFSIZE 65536L
|
|
|
|
#define MAX_MRBUFSIZE 1000000L
|
|
#define MAX_DATABUFSIZE 1000000L
|
|
|
|
// Following structure records time of each call to read/write
|
|
// to comm. It also contains an offset into a circular buffer which
|
|
// contains all data writen to/read from comm port.
|
|
// wFlags is a word of information that was specified in the call to MonPut
|
|
// Currently it is a combination of the fMON_* flags above.
|
|
typedef struct
|
|
{
|
|
WORD wFlags; // One of fMON_* flags above. (A parameter to MonPut)
|
|
WORD wcb; // Number of bytes of variable-lenghth data
|
|
DWORD dwTickCount; // GetTickCount at time of MonPut call
|
|
DWORD dwOffset; // Offset into circular byte-buffer where data is.
|
|
} MONREC, FAR *LPMONREC;
|
|
|
|
|
|
#define MFR_COMMDATA 1
|
|
#define MFR_EVENT 2
|
|
|
|
// Following flags are specified in the wFlags param of MonPut. They
|
|
// are saved in the corresponding field of the MONREC structures.
|
|
#define fMON_COMM_RESERVED (0x1<<15) // Should never be used.
|
|
#define fMON_COMM_IN (0x1<<0) // Read operation
|
|
#define fMON_COMM_OUT (0x1<<1) // Write operation
|
|
#define fMON_COMM_CMDRESP (0x1<<3) // We believe modem is in command mode
|
|
#define fMON_COMM_DATA (0x1<<4) // We believe modem is in data mode
|
|
|
|
#define EVENT_ID_TXTMSG 1 // Generic text message.
|
|
#define EVENT_ID_MON 10 // Related to the monitoring processitself.
|
|
|
|
#define EVENT_ID_T30_BASE 100 // T30-protocol-stack related.
|
|
#define EVENT_ID_T30_CALLSTATE 100 // T30-protocol: call state related.
|
|
|
|
#define EVENT_ID_MODEM_BASE 200 // Modem-related
|
|
#define EVENT_ID_MODEM_STATE 200 // Initialize modem
|
|
|
|
#define EVENT_SubID_NULL 0 // Nothing.
|
|
|
|
#define EVENT_SubID_MON_DUMP 1 // Dump (write to file) of in-memory record
|
|
// TextID contains timestamp of start, as
|
|
// well as number of puts, and bytes written
|
|
// dwData0=dwData1=0
|
|
// SubID=0
|
|
|
|
#define EVENT_SubID_T30_CS_SEND_START 1 // Initiate T.30 Send
|
|
// Displayable phone number is embedded in
|
|
// TxtMessage.
|
|
// dwData0=dwData1=0;
|
|
#define EVENT_SubID_T30_CS_SEND_END 2 // End T.30 Send
|
|
// dwData0=result code
|
|
#define EVENT_SubID_T30_CS_RECV_START 11 // Initiate T.30 Recv
|
|
// dwData0=dwData1=0;
|
|
#define EVENT_SubID_T30_CS_RECV_END 12 // End T.30 Recv
|
|
// dwData0=result code
|
|
|
|
#define EVENT_SubID_MODEM_INIT_START 1 // About to issue commands to Init modem
|
|
#define EVENT_SubID_MODEM_INIT_END 2 // Done initing.
|
|
// dwData0=return code
|
|
|
|
|
|
#define EVENT_SubID_MODEM_DEINIT_START 11 // About to issue commands to deinit
|
|
#define EVENT_SubID_MODEM_DEINIT_END 12 // Done deiniting.
|
|
// dwData0=return code
|
|
|
|
#define EVENT_SubID_MODEM_SENDMODE_START 21 // About to issue commands to deinit
|
|
#define EVENT_SubID_MODEM_SENDMODE_END 22 // Done deiniting.
|
|
// dwData0=return code
|
|
|
|
#define EVENT_SubID_MODEM_RECVMODE_START 31 // About to issue commands to deinit
|
|
#define EVENT_SubID_MODEM_RECVMODE_END 32 // Done deiniting.
|
|
// dwData0=return code
|
|
|
|
#define EVENT_SubID_MODEM_DIAL_START 41 // About to issue commands to dial
|
|
// szTxtMsg contains dial string
|
|
// In retail, digits after first 4
|
|
// are zapped.
|
|
#define EVENT_SubID_MODEM_DIAL_END 42 // Done dialing
|
|
// dwData0=return code
|
|
|
|
#define EVENT_SubID_MODEM_ANSWER_START 51 // About to issue commands to answer
|
|
#define EVENT_SubID_MODEM_ANSWER_END 52 // Done with the answer command
|
|
// dwData0=return code
|
|
|
|
#define EVENT_SubID_MODEM_HANGUP_START 61 // About to issue commands to answer
|
|
#define EVENT_SubID_MODEM_HANGUP_END 62 // Done with the answer command
|
|
// dwData0=return code
|
|
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
WORD wTotalSize;
|
|
WORD wHeaderSize;
|
|
WORD wType; // One of the MFR_* defines
|
|
WORD wFlags; // type dependant
|
|
DWORD dwTickCount; // GetTickCount() at time of call to MonPut.
|
|
} MONFRAME_BASE, FAR *LPMONFRAME_BASE;
|
|
#pragma pack()
|
|
|
|
// Following inserted in mon file to document data structure.
|
|
// Make sure it matches above structure.
|
|
#define szMONFRM_DESC001\
|
|
"struct{WORD wcbTot; WORD wcbHdr; WORD wTyp; WORD wFlg; DWORD dwTick}"
|
|
// Update version when structure changes.
|
|
#define szMONFRM_VER001 "V.100"
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
WORD wTotalSize;
|
|
WORD wHeaderSize;
|
|
WORD wType; // One of the MFR_* defines
|
|
WORD wFlags; // One of the fMON_COMM_* values.
|
|
DWORD dwTickCount; // GetTickCount() at time of call to MonPut.
|
|
WORD wcb; // Count of bytes following.
|
|
BYTE rgb[]; // Actuall bytes of comm data.
|
|
} MONFRAME_COMM, FAR *LPMONFRAME_COMM;
|
|
#pragma pack()
|
|
|
|
#define fEVENT_ERROR_MASK 0x111
|
|
#define fEVENT_ERROR_NONE 0x000
|
|
#define fEVENT_ERROR_FATAL 0x001
|
|
#define fEVENT_ERROR_SERIOUS 0x010
|
|
#define fEVENT_ERROR_MSGFAIL 0x011
|
|
#define fEVENT_ERROR_OTHER 0x100
|
|
#define fEVENT_ERROR_WARNING 0x101
|
|
|
|
#define fEVENT_TRACELEVEL_MASK 0x11000
|
|
#define fEVENT_TRACELEVEL_0 0x00000 // Vital: MUST display
|
|
#define fEVENT_TRACELEVEL_1 0x01000 // Important
|
|
#define fEVENT_TRACELEVEL_2 0x10000 // Less important
|
|
#define fEVENT_TRACELEVEL_3 0x11000 // Least important
|
|
|
|
#define MAX_TXTMSG_SIZE 128 // Max size of text msg in a MONFRAME_EVENT structure.
|
|
|
|
#pragma pack(1)
|
|
typedef struct {
|
|
WORD wTotalSize;
|
|
WORD wHeaderSize;
|
|
WORD wType; // Should be MFR_EVENT
|
|
WORD wFlags; // One of the fEVENT_* flags.
|
|
DWORD dwTickCount; // GetTickCount() at time of call to MonPut.
|
|
WORD wID; // ID of event. One of the EVENT_ID_* defines
|
|
WORD wSubID; // Sub ID of event. One of the EVENT_SubID_* defines
|
|
DWORD dwInstanceID; // Instance ID of event within this file.
|
|
DWORD dwData0; // ID-specific data
|
|
DWORD dwData1; // ID-specific data
|
|
SYSTEMTIME st; // SystemTime at time of call to MonPut
|
|
WORD wTxtMsgOff;// Offset to null-terminated text message, if any
|
|
WORD wcbTxtMsg; // Size of null-terminated text message, if any
|
|
} MONFRAME_EVENT, FAR *LPMONFRAME_EVENT;
|
|
#pragma pack()
|
|
|
|
// Monitor Options -- passed into MonInit
|
|
typedef struct {
|
|
|
|
// Buffer options
|
|
DWORD dwMRBufSize; // preferred size -- actual size may be different
|
|
DWORD dwDataBufSize; // preferred size -- actual size may be different
|
|
|
|
// File options
|
|
DWORD dwMaxExistingSize;// If the size of the existing file
|
|
// is > this, we will rename the existing file
|
|
// and create a new one.
|
|
char rgchDir[64]; // Directory where fax0.mon is to be created.
|
|
|
|
} MONOPTIONS, FAR * LPMONOPTIONS;
|
|
|
|
// Global monitor state
|
|
typedef struct {
|
|
|
|
SYSTEMTIME stStart; // Set by MonInit.
|
|
SYSTEMTIME stDump; // Set by MonDump.
|
|
BOOL fFreeOnExit; // TRUE iff buffers must be freed on exit.
|
|
BOOL fInited; // Set in MonInit. Cleared in MonDeInit.
|
|
|
|
DWORD dwNumPuts; // Number of calls to MonPut
|
|
DWORD dwNumBytes; // Cumulative number of bytes specified to MonPut
|
|
UINT uRefCount; // Incremented each time MonDump is called
|
|
// Used to new file for each MonDump
|
|
// Cleared in MonInit and MonDeInit
|
|
DWORD dwEventInstanceID; // ID which is supposed to uniquely identify
|
|
// each event within a file.
|
|
|
|
LPMONREC lpmrBuf; // Pointer to MONREC circular buffer
|
|
DWORD dwcmrBuf; // Size (in units of MONREC) if circular buffer
|
|
LPMONREC lpmrNext; // Pointer to next available MR
|
|
|
|
LPBYTE lpbBuf; // Pointer to circular byte buffer.
|
|
DWORD dwcbBuf; // Size (in bytes) of above buffer.
|
|
LPBYTE lpbNext; // Pointer to next place to write bytes in this buf.
|
|
|
|
MONOPTIONS mo; // Passed in to MonInit();
|
|
|
|
} MONINFO;
|
|
|