📄 tcpiptrcdlg.cpp
字号:
// TCPIPTrcDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TCPIPTrc.h"
#include "TCPIPTrcDlg.h"
#include "DlgProxy.h"
#include <atlconv.h>
#include <atlbase.h>
#include <stddef.h>
#include <winsock.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
VOID ReaderThread(LPVOID lpvParam);
static char ADI_TOOLS_TCPIP_RegistryKey[] = "Software\\Analog Devices\\VisualDSP++\\TCPIPTrace";
static char ADI_TOOLS_TCPIPTraceFile[] = TEXT("TraceFile");
void SaveTraceFileIntoRegistry(char *in_filename)
{
HKEY hTCPIPKey;
DWORD dwResult;
if(RegCreateKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,"REG_SZ",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hTCPIPKey,&dwResult) != ERROR_SUCCESS)
{
// creating registry entry failed..returning.
return;
}
if(in_filename != NULL)
RegSetValueEx(hTCPIPKey,ADI_TOOLS_TCPIPTraceFile,0,REG_SZ,(unsigned char*)in_filename,strlen(in_filename));
RegCloseKey(hTCPIPKey);
}
void SaveDWORDIntoRegistry(char *name, DWORD vl)
{
HKEY hTCPIPKey;
DWORD dwResult;
if(RegCreateKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,"REG_SZ",REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hTCPIPKey,&dwResult) != ERROR_SUCCESS)
{
// creating registry entry failed..returning.
return;
}
RegSetValueEx(hTCPIPKey,name,0,REG_DWORD,(unsigned char*)&vl,sizeof(vl));
RegCloseKey(hTCPIPKey);
}
// Copies the last file form registry to the path supplied
//
bool GetTraceFileFromRegistry(char *out_filename)
{
BYTE temp_filename[512];
HKEY hTCPIPKey;
DWORD dwType;
DWORD dwRead;
if((RegOpenKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,KEY_ALL_ACCESS | KEY_QUERY_VALUE
,&hTCPIPKey) != ERROR_SUCCESS))
{
// nothing to load..copy null and return..
*out_filename = '\0';
return false;
}
if(out_filename != NULL)
{
dwRead = sizeof(temp_filename);
if((RegQueryValueExA(hTCPIPKey,ADI_TOOLS_TCPIPTraceFile,NULL,&dwType,temp_filename,&dwRead) != ERROR_SUCCESS))
{
*out_filename = '\0';
return false;
}
strcpy(out_filename,(char*)temp_filename);
}
RegCloseKey(hTCPIPKey);
return true;
}
bool GetDWORDFromRegistry(char *name, DWORD *vl)
{
HKEY hTCPIPKey;
DWORD dwType;
DWORD dwRead,tvl;
if((RegOpenKeyEx(HKEY_CURRENT_USER,ADI_TOOLS_TCPIP_RegistryKey,0,KEY_ALL_ACCESS | KEY_QUERY_VALUE
,&hTCPIPKey) != ERROR_SUCCESS))
{
// nothing to load..copy null and return..
return false;
} else {
dwRead = sizeof(tvl);
if((RegQueryValueExA(hTCPIPKey,name,NULL,&dwType,(unsigned char *)&tvl,&dwRead) != ERROR_SUCCESS))
{
return false;
}
if (dwType == REG_DWORD) *vl = tvl;
}
RegCloseKey(hTCPIPKey);
return true;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTCPIPTrcDlg dialog
IMPLEMENT_DYNAMIC(CTCPIPTrcDlg, CDialog);
CTCPIPTrcDlg::CTCPIPTrcDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTCPIPTrcDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTCPIPTrcDlg)
m_FileName = _T("");
m_SaveAll = FALSE;
m_Channel = 0;
m_NoEvents = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pAutoProxy = NULL;
m_Stopped = true;
m_Listen = m_Client = INVALID_SOCKET;
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err =WSAStartup( wVersionRequested, &wsaData );
}
CTCPIPTrcDlg::~CTCPIPTrcDlg()
{
// If there is an automation proxy for this dialog, set
// its back pointer to this dialog to NULL, so it knows
// the dialog has been deleted.
if (m_pAutoProxy != NULL)
m_pAutoProxy->m_pDialog = NULL;
}
void CTCPIPTrcDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTCPIPTrcDlg)
DDX_Control(pDX, IDC_REPORT, m_ReportCtrl);
DDX_Control(pDX, IDC_LOCALIP, m_LocalIPCtrl);
DDX_Control(pDX, IDC_CHANNEL, m_ChannelCtrl);
DDX_Control(pDX, IDC_STOPACQ, m_StopAcqCtrl);
DDX_Control(pDX, IDC_STARTACQ, m_StartAcqCtrl);
DDX_Control(pDX, IDC_SAVECUR, m_SaveCurCtrl);
DDX_Control(pDX, IDC_SAVEALL, m_SaveAllCtrl);
DDX_Control(pDX, IDC_PAUSE, m_PauseCtrl);
DDX_Control(pDX, IDC_NOEVENTS, m_NoEventsCtrl);
DDX_Control(pDX, IDC_FILENAME, m_FileNameCtrl);
DDX_Control(pDX, IDC_EVENTLIST, m_EventListCtrl);
DDX_Text(pDX, IDC_FILENAME, m_FileName);
DDX_Check(pDX, IDC_SAVEALL, m_SaveAll);
DDX_Text(pDX, IDC_CHANNEL, m_Channel);
DDX_Text(pDX, IDC_NOEVENTS, m_NoEvents);
DDV_MinMaxLong(pDX, m_NoEvents, 0, 1000000000);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTCPIPTrcDlg, CDialog)
//{{AFX_MSG_MAP(CTCPIPTrcDlg)
ON_WM_SYSCOMMAND()
ON_WM_DESTROY()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
ON_BN_CLICKED(ID_HELP, OnHelp)
ON_EN_CHANGE(IDC_FILENAME, OnChangeFilename)
ON_EN_CHANGE(IDC_NOEVENTS, OnChangeNoevents)
ON_BN_CLICKED(IDC_PAUSE, OnPause)
ON_BN_CLICKED(IDC_SAVECUR, OnSavecur)
ON_BN_CLICKED(IDC_SAVEFILE, OnSavefile)
ON_BN_CLICKED(IDC_STARTACQ, OnStartacq)
ON_BN_CLICKED(IDC_STOPACQ, OnStopacq)
ON_BN_CLICKED(IDC_BROWSE, OnBrowse)
ON_EN_CHANGE(IDC_CHANNEL, OnChangeChannel)
ON_BN_CLICKED(IDC_SAVEALL, OnSaveall)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*
* This function converts the given 32 bit value to host byte order.
*/
static unsigned long dsp_ntohl(unsigned long value)
{
unsigned long ret_value;
ret_value = (((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) |
((value & 0x00FF0000) >> 8) | ((value & 0xFF000000) >> 24));
return(ret_value);}
/*
* This function converts the given 16 bit value to host byte order.
*/
static short dsp_ntohs(short value)
{
short ret_value;
ret_value = ((value & 0x000000FF) << 8) | ((value & 0x0000FF00) >> 8);
return(ret_value);
}
char * CTCPIPTrcDlg::FindHostName(int IpAddrs, char *bf)
{
int i;
unsigned char *ic;
for (i=0; i<m_NoHostNames; i++) {
if (IpAddrs == m_HostMap[i].IpAddrs) {
return (char *)m_HostMap[i].HostName;
}
}
// generate 1.2.3.4
ic = (unsigned char *)&IpAddrs;
sprintf(bf,"%u.%u.%u.%u",ic[0],ic[1],ic[2],ic[3]);
return bf;
}
static GetMac(unsigned char *mac, char *buf)
{
sprintf(buf,"%2.2x%2.2x%2.2x%2.2x%2.2x%2.2x",
mac[0],mac[1],mac[2],
mac[3],mac[4],mac[5]);
}
void CTCPIPTrcDlg::DumpIPTraceEntry(
unsigned char id, int nbytes, unsigned short clk,
unsigned char *hdr)
{
int rcvd = (id=='R');
if (nbytes>0) {
// we have to format the buffer
char adr1[20],adr2[20],adr3[4];
char *src,*dst,*prot;
char line[128],codes[32];
int cnext=0;
datagram dd;
datagram *d;
udp uu;
udp *u;
tcp tt;
tcp *t;
icmp iicm;
icmp *icm;
int hdrlen = nbytes;
int data=0;
static char *ctext[] = {"FIN ","SYN ","RST ","PSH ","ACK ","URG ",0};
int ic=0;
int ndata;
memcpy(&dd,hdr,sizeof(dd));
d = ⅆ // get fields aligned
// format the IP header first
src = FindHostName(d->Source,adr1);
dst = FindHostName(d->Dest,adr2);
switch(d->Protocol) {
case ICMP_PROTOCOL:
prot = "ICMP";
break;
case TCP_PROTOCOL:
prot = "TCP";
break;
case UDP_PROTOCOL:
prot = "UDP";
break;
default:
sprintf(adr3,"%d",d->Protocol);
prot = adr3;
break;
}
sprintf(m_StrBuffer,"%4.4x %cX src=%s, dest=%s, prot=%s,frag=%u, length=%u",
clk,(rcvd?'R':'T'),src,dst,prot,d->FlagsFragOffset&0x1fff,dsp_ntohs(d->TotalLnth));
AppendLine();
data = ((d->VersHlen&0x0f)*4); /* start of any data */
switch (d->Protocol) {
case ICMP_PROTOCOL:
memcpy(&iicm,(icmp *)(hdr+(d->VersHlen&0x0f)*4),sizeof(iicm));
icm = &iicm;
sprintf(m_StrBuffer,"\t icmp type=%u, qual=%u",
icm->Type,icm->Qual);
data += sizeof(iicm);
AppendLine();
break;
case TCP_PROTOCOL:
memcpy(&tt,(tcp *)(hdr+(d->VersHlen&0x0f)*4),sizeof(tt));
t = &tt;
for (ic=0;ic<6;ic++) {
if ((t->Code>>ic)&1) {
memcpy(codes+cnext,ctext[ic],4);
cnext+=4;
}
}
codes[cnext] = 0;
sprintf(m_StrBuffer,"\t sport=0x%x, dport=0x%4.4x, seq=%x, ack=0x%x, win=%u code=%s",
dsp_ntohs(t->SrcPort),dsp_ntohs(t->DstPort),dsp_ntohl(t->SeqNo),dsp_ntohl(t->AckNo),dsp_ntohs(t->Window),codes);
data += ((tt.Hlen>>4)*4);
AppendLine();
break;
case UDP_PROTOCOL:
memcpy(&uu,(udp *)(hdr+(d->VersHlen&0x0f)*4),sizeof(uu));
u = &uu;
sprintf(m_StrBuffer,"\t sport=0x%x, dport=0x%4.4x, msg length=%u",
dsp_ntohs(u->SrcPort),dsp_ntohs(u->DstPort),dsp_ntohs(u->MsgLnth));
data += sizeof(uu);
AppendLine();
break;
default:
break;
}
ndata = hdrlen - data;
if (ndata>0) {
int nxt=3;
int mx=sizeof(line)-2;
int inl=0;
char *ch=line+53;
strcpy(m_StrBuffer,"\t");
memset(line,' ',72);
while (ndata>0) {
sprintf(line+nxt,"%2.2x ",hdr[data]);
if ((33<=hdr[data]) && (hdr[data]<=126)) {
*ch = hdr[data];
} else {
*ch = '.';
}
ch++;
nxt += 3;
data++;
inl++;
if (inl>15) {
line[nxt] = ' ';
*ch = 0;
strcat(m_StrBuffer,line);
AppendLine();
strcpy(m_StrBuffer,"\t");
memset(line,' ',72);
nxt = 3;
inl = 0;
ch=line+53;
}
ndata--;
}
if (nxt>3) {
line[nxt] = ' ';
*ch = 0;
strcat(m_StrBuffer,line);
AppendLine();
}
}
} else {
sprintf(m_StrBuffer,"%4.4x %cX empty IP packet",
clk,(rcvd?'R':'T'));
AppendLine();
}
}
void CTCPIPTrcDlg::DumpArpTraceEntry(
unsigned char id, int nbytes, unsigned short clk,
unsigned char *hdr)
{
int rcvd = (id=='R');
if (nbytes>0) {
// we have to format the buffer
unsigned short oper;
char adr1[20],adr2[20],adr3[20],adr4[20];
char *src,*dst,*prot;
int ip;
oper = dsp_ntohs(*((unsigned short *)(hdr+6)));
switch (oper) {
case 1:
prot = "AREQ";
break;
case 2:
prot = "ARSP";
break;
case 3:
prot = "RREQ";
break;
case 4:
prot = "RRSP";
break;
default:
sprintf(adr3,"%2.2x",oper);
prot = adr3;
break;
}
// format the IP header first
memcpy(&ip,hdr+14,4);
src = FindHostName(ip,adr1);
GetMac(hdr+8,adr3);
memcpy(&ip,hdr+24,4);
dst = FindHostName(ip,adr2);
GetMac(hdr+18,adr4);
sprintf(m_StrBuffer,"%4.4x %cX ARP OPER=%s Snd MAC=%s Snd IP=%s Tgt MAC=%s Tgt IP=%s",
clk,(rcvd?'R':'T'),prot,adr3,src,adr4,dst);
} else {
sprintf(m_StrBuffer,"%4.4x %cX empty ARP packet",
clk,(rcvd?'R':'T'));
}
AppendLine();
}
void CTCPIPTrcDlg::DumpDefTraceEntry(
unsigned char id, int nbytes, unsigned short clk,
unsigned char *hdr)
{
char pid[32];
int i;
if ((' '<=id) && (id<=126)) {
pid[0] = id;
pid[1] = 0;
} else {
sprintf(pid,"0x%2.2x",id);
}
sprintf(m_StrBuffer,"%4.4x ID=%s nbytes=%d ",clk,pid,nbytes);
if (nbytes>0) {
if (nbytes>8) nbytes = 8;
for (i=0;i<nbytes;i++) {
sprintf(pid,"%2.2x ",hdr[i]);
strcat(m_StrBuffer,pid);
}
}
AppendLine();
}
void CTCPIPTrcDlg::DumpTraceEntry(
unsigned char *hdr)
{
unsigned short frame;
int nbytes = hdr[1];
unsigned short clk,frm;
int def=0;
m_TrcIndex++;
if (!m_Paused) m_NoEntries++;
InterlockedIncrement(&m_TraceListSize);
if (m_TrcIndex>200) {
int jj=5;
}
if ((hdr[0]=='T') || (hdr[0]=='R')) {
m_LastNdx = -1;
memcpy(&clk,hdr+2,2);
memcpy(&frm,hdr+16,2);
if (nbytes>13) {
frame = dsp_ntohs(frm);
if (frame == 0x0800) {
DumpIPTraceEntry(hdr[0],nbytes, clk,hdr+18);
} else if (frame == 0x0806) {
DumpArpTraceEntry(hdr[0],nbytes, clk,hdr+18);
} else {
// dump nothing
def = 1;
}
} else {
def = 1;
}
if (def) {
DumpDefTraceEntry(hdr[0],nbytes,clk,hdr+4);
}
if (m_LastNdx>=0) {
m_EventListCtrl.SetCurSel(m_LastNdx);
}
}
}
void CTCPIPTrcDlg::AppendLine(void)
{
TraceLine *lin;
if (m_Trc) {
fprintf(m_Trc,"%s\n",m_StrBuffer);
}
lin = (TraceLine *)malloc(sizeof(TraceLine));
if (lin!=NULL) {
EnterCriticalSection(&m_Critical);
lin->Next = NULL;
lin->Mark = m_TrcIndex;
lin->Data = (char *)malloc(strlen(m_StrBuffer)+1);
if (lin->Data) {
strcpy(lin->Data,m_StrBuffer);
} else {
free(lin);
lin = NULL;
}
if (lin!=NULL) {
// append it to the tail
if (m_TraceTail) {
m_TraceTail->Next = lin;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -