www.pudn.com > AcquireEthernetCode.rar > GetPacketListView.cpp


// GetPacketListView.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "GetPacket.h" 
#include "GetPacketListView.h" 
#include "mainfrm.h" 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
//global variables 
CONTROL_BLOCK cbAdapter; 
PVOID    pPacket; 
BOOL     bSniff=FALSE; 
 
GetPacketListView* pThreadParam; 
DWORD WINAPI GetPacketThread(LPVOID param) 
{ 
	unsigned int j; 
	ADAPTER_DESC adapterDescs[5]; 
 
	if(PacketGetAdapterNames(adapterDescs, 5, &j)==FALSE) 
		MessageBox(NULL,"PacketGetAdapterNames","error",MB_OK); 
	 
	cbAdapter.hFile = (LPADAPTER)PacketOpenAdapter(adapterDescs[0].szAdapterName); 
	cbAdapter.hMem=GlobalAlloc(GMEM_MOVEABLE,1514); 
	cbAdapter.BufferSize=1514; 
	cbAdapter.lpMem=(LPBYTE)GlobalLock(cbAdapter.hMem); 
	//PacketAdapterDesc(cbAdapter.hFile, uBuffer, sizeof(uBuffer), &i); 
	/* 
	if(cbAdapter.hMem==NULL) 
	{ 
		MessageBox(NULL,"GlobalAlloc","Error",MB_OK); 
		return -1; 
	} 
	*/ 
    //open adapter 
	/*cbAdapter.hFile=PacketOpenAdapter(cbAdapter.AdapterName); 
    if (cbAdapter.hFile == NULL) 
	{ 
		MessageBox(NULL,"PacketOpenAdapter","Error",MB_OK); 
		return -1; 
	}*/ 
 
	//set NIC to PROMISCUOUS status 
	PacketSetFilter((LPADAPTER)cbAdapter.hFile,NDIS_PACKET_TYPE_PROMISCUOUS); 
 
	//allocate packet 
    pPacket=PacketAllocatePacket((LPADAPTER)cbAdapter.hFile); 
	if(!pPacket) 
	{ 
		MessageBox(NULL,"PacketAllocatePacket","Error",MB_OK); 
		return -1; 
	} 
 
	PacketInitPacket((LPPACKET)pPacket,cbAdapter.lpMem,1514); 
 
	bSniff=TRUE; 
	while(bSniff) 
	{ 
		PacketReceivePacket((LPADAPTER)cbAdapter.hFile,(LPPACKET)pPacket,TRUE,&cbAdapter.PacketLength); 
		//the packet is valid***total frame size should exceeds 14+20+20=54 
		if (cbAdapter.PacketLength > (sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER))) 
		{ 
			ETHER_PACKET   *pEthPkt = (ETHER_PACKET *) cbAdapter.lpMem; 
			 
			ETH_HEADER     *pEthHdr = (ETH_HEADER *) cbAdapter.lpMem; 
			IP_HEADER      *pIpHdr = (IP_HEADER *) ((char *) pEthPkt + sizeof(ETH_HEADER)); 
			TCP_HEADER     *pTcpHdr = (TCP_HEADER *) ((char *) pIpHdr + sizeof(IP_HEADER)); 
			int             i_IPH_Size = pIpHdr->ihl * 4; 
			int             i_TCPH_Size = pTcpHdr->doff * 4; 
			 
			//determine if this is a valid IP packet 
			if(pEthPkt->ETH.h_proto!=8) 
				continue; 
			if (pIpHdr->protocol != 6) 
				continue; 
 
			int  iDataSize = ((int) ntohs(pIpHdr->tot_len) -  i_IPH_Size - i_TCPH_Size); 
			if(!iDataSize) 
				continue; 
			BYTE *pPktData = (BYTE *) pTcpHdr + i_TCPH_Size; 
			*(pPktData+iDataSize)='\0'; 
			pThreadParam->SetData(pIpHdr->saddr,pTcpHdr->source,pIpHdr->daddr,pTcpHdr->dest,pPktData,iDataSize); 
		} 
	}//end while 
 
	PacketFreePacket((LPPACKET)pPacket); 
	PacketCloseAdapter((LPADAPTER)cbAdapter.hFile); 
	GlobalUnlock(cbAdapter.hMem); 
	GlobalFree(cbAdapter.hMem); 
	WSACleanup(); 
	return 0; 
} 
///////////////////////////////////////////////////////////////////////////// 
// GetPacketListView 
 
IMPLEMENT_DYNCREATE(GetPacketListView, CListView) 
 
GetPacketListView::GetPacketListView() 
{ 
	pThreadParam=this; 
	//bIsSniffing=FALSE; 
} 
 
GetPacketListView::~GetPacketListView() 
{ 
} 
 
 
BEGIN_MESSAGE_MAP(GetPacketListView, CListView) 
	//{{AFX_MSG_MAP(GetPacketListView) 
	ON_COMMAND(ID_FILE_START, OnFileStart) 
	ON_COMMAND(ID_FILE_STOP, OnFileStop) 
	ON_COMMAND(ID_EDIT_FILTER, OnEditFilter) 
	ON_UPDATE_COMMAND_UI(ID_FILE_START, OnUpdateFileStart) 
	ON_UPDATE_COMMAND_UI(ID_FILE_STOP, OnUpdateFileStop) 
	ON_COMMAND(ID_EDIT_CLEARALL, OnEditClearall) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// GetPacketListView drawing 
 
void GetPacketListView::OnDraw(CDC* pDC) 
{ 
	CDocument* pDoc = GetDocument(); 
	// TODO: add draw code here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// GetPacketListView diagnostics 
 
#ifdef _DEBUG 
void GetPacketListView::AssertValid() const 
{ 
	CListView::AssertValid(); 
} 
 
void GetPacketListView::Dump(CDumpContext& dc) const 
{ 
	CListView::Dump(dc); 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// GetPacketListView message handlers 
 
void GetPacketListView::OnInitialUpdate()  
{ 
	CListView::OnInitialUpdate(); 
	/*CWnd *pmain; 
	pmain=AfxGetMainWnd(); 
	pmain->SetWindowText("GetPacket1.0");*/ 
	//set list control's style 
	LONG dwLong = GetWindowLong(GetListCtrl().m_hWnd, GWL_STYLE);	 
	dwLong ^= LVS_REPORT|LVS_SINGLESEL ; 
	LONG err=SetWindowLong(GetListCtrl().m_hWnd, GWL_STYLE, dwLong); 
	ListView_SetExtendedListViewStyle(GetListCtrl(), LVS_EX_FULLROWSELECT);  
	//insert 5 columns 
	LV_COLUMN lv_column; 
	lv_column.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM ; 
	lv_column.cx=110; 
	lv_column.pszText="  Source IP"; 
	GetListCtrl().InsertColumn( 0, &lv_column); 
 
	lv_column.cx=80; 
	lv_column.pszText="Source Port"; 
	GetListCtrl().InsertColumn( 1, &lv_column); 
 
	lv_column.cx=110; 
	lv_column.pszText="    Dest IP"; 
	GetListCtrl().InsertColumn( 2, &lv_column); 
 
	lv_column.cx=80; 
	lv_column.pszText="  Dest Port"; 
	GetListCtrl().InsertColumn( 3, &lv_column); 
 
	lv_column.cx=370; 
	lv_column.pszText="            packet content"; 
	GetListCtrl().InsertColumn( 4, &lv_column); 
} 
 
void GetPacketListView::OnFileStart()  
{ 
	iNetworkTraffic=0; 
 
	DWORD dwThreadID; 
	hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GetPacketThread, 
		                (LPVOID)NULL,(DWORD)0,&dwThreadID); 
	((CMainFrame*)AfxGetMainWnd())->m_wndStatusBar.SetPaneText( 0, "START RETRIEVING PACKETS...", TRUE ); 
 
	/*//if(bIsSniffing) 
	//	return; 
	//bIsSniffing=TRUE; 
	 
	//wsastartup , I don't know why 
	WORD   wVersionRequested = MAKEWORD(2, 0); 
    if (WSAStartup(wVersionRequested, &wsaData) != 0) 
	{ 
		MessageBox("WSAStartup error","",MB_OK); 
		return; 
	} 
 
	//get adapter's name 
	ULONG NameLength=64; 
	PacketGetAdapterNames(Adapter.AdapterName,&NameLength); 
	 
	Adapter.BufferSize=1514; 
	Adapter.hMem=GlobalAlloc(GMEM_MOVEABLE,1514); 
	Adapter.lpMem=(LPBYTE)GlobalLock(Adapter.hMem); 
 
    //open adapter 
	Adapter.hFile=PacketOpenAdapter(Adapter.AdapterName); 
    if (Adapter.hFile == NULL) 
	{ 
		MessageBox("PacketOpenAdapter error",Adapter.AdapterName,MB_OK); 
		return; 
	} 
 
	//set NIC to PROMISCUOUS status 
	PacketSetFilter((LPADAPTER)Adapter.hFile,NDIS_PACKET_TYPE_PROMISCUOUS); 
 
	//allocate packet 
    Packet=PacketAllocatePacket((LPADAPTER)Adapter.hFile); 
    if (Packet != NULL)  
	{ 
		PacketInitPacket((LPPACKET)Packet,Adapter.lpMem,1514); 
		 
		int i=0; 
		while(bIsSniffing) 
		{ 
			PacketReceivePacket((LPADAPTER)Adapter.hFile,(LPPACKET)Packet,TRUE,&Adapter.PacketLength); 
 
			//the packet is valid***total frame size should exceeds 14+20+20=54 
			if (Adapter.PacketLength > (sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER))) 
			{ 
				ETHER_PACKET   *pEthPkt = (ETHER_PACKET *) Adapter.lpMem; 
	             
				ETH_HEADER     *pEthHdr = (ETH_HEADER *) Adapter.lpMem; 
			    IP_HEADER      *pIpHdr = (IP_HEADER *) ((char *) pEthPkt + sizeof(ETH_HEADER)); 
				TCP_HEADER     *pTcpHdr = (TCP_HEADER *) ((char *) pIpHdr + sizeof(IP_HEADER)); 
				int             i_IPH_Size = pIpHdr->ihl * 4; 
				int             i_TCPH_Size = pTcpHdr->doff * 4; 
 
				//determine if this is a valid IP packet 
				if(pEthPkt->ETH.h_proto!=8) 
					continue; 
				if (pIpHdr->protocol != 6) 
			        continue; 
		        { 
			        int  iDataSize = ((int) ntohs(pIpHdr->tot_len) -  i_IPH_Size - i_TCPH_Size); 
					if(!iDataSize) 
						continue; 
				    BYTE *pPktData = (BYTE *) pTcpHdr + i_TCPH_Size; 
					*(pPktData+iDataSize)='\0'; 
					SetData(pIpHdr->saddr,pTcpHdr->source,pIpHdr->daddr,pTcpHdr->dest,pPktData,iDataSize); 
				} 
				i++; 
				if(i==1000) 
					return; 
			} 
		}//end while 
	}*/ 
 
} 
 
void GetPacketListView::OnFileStop()  
{ 
	bSniff=FALSE; 
	 
	char buffer[128]; 
	MessageBox(_itoa( iNetworkTraffic , buffer, 10 ) , "Total network traffic is" , MB_OK); 
	//TerminateThread(hThread,0); 
/*if(!bIsSniffing) 
		return; 
	bIsSniffing=FALSE; 
	WSACleanup();	 
    PacketCloseAdapter((LPADAPTER)Adapter.hFile); 
	if(Packet!=NULL) 
		PacketFreePacket((LPPACKET)Packet); 
	PacketSetFilter((LPADAPTER)Adapter.hFile,NDIS_PACKET_TYPE_DIRECTED);*/ 
} 
 
 
void GetPacketListView::SetData(__u32 saddr, __u16 source, __u32 daddr, __u16 dest, BYTE * pPktData, int iDataSize) 
{ 
	static char     SourceAddress[512] = ""; 
 	static char     DestAddress[512] = ""; 
	char buffer[1024],data[2048],temp[512],*dot; 
    struct in_addr  iaddr; 
	int iSourcePort,iDestPort,i; 
	CGetPacketApp *pApp; 
	pApp=(CGetPacketApp*)AfxGetApp(); 
 
	//save packet data 
	strcpy(data,(char*)pPktData); 
 
	memset(&iaddr,0,sizeof(struct in_addr)); 
    iaddr.s_addr = saddr; 
    strcpy(SourceAddress, inet_ntoa(iaddr));//source IP address 
 
	if(pApp->SourceIP.GetSize()>0) 
	{ 
		for(i=0;iSourceIP.GetSize();i++) 
			if(!strcmp(SourceAddress,pApp->SourceIP.GetAt(i))) 
				break; 
		if(i==pApp->SourceIP.GetSize()) 
			return; 
	} 
 
	memset(&iaddr,0,sizeof(struct in_addr)); 
    iaddr.s_addr = daddr; 
	strcpy(DestAddress,inet_ntoa(iaddr));   //dest IP address 
	if(pApp->DestIP.GetSize()>0) 
	{ 
		for(i=0;iDestIP.GetSize();i++) 
			if(!strcmp(DestAddress,pApp->DestIP.GetAt(i))) 
				break; 
		if(i==pApp->DestIP.GetSize()) 
			return; 
	} 
	 
	iSourcePort=(int) ntohs(source);   //source port no 
	if(pApp->SourcePort.GetSize()>0) 
	{ 
		for(i=0;iSourcePort.GetSize();i++) 
			if((unsigned int)iSourcePort==pApp->SourcePort.GetAt(i)) 
				break; 
		if(i==pApp->SourcePort.GetSize()) 
			return; 
	} 
	 
	iDestPort  =(int) ntohs(dest  );   //destination port no 
	if(pApp->DestPort.GetSize()>0) 
	{ 
		for(i=0;iDestPort.GetSize();i++) 
			if((unsigned int)iDestPort==pApp->DestPort.GetAt(i)) 
				break; 
		if(i==pApp->DestPort.GetSize()) 
			return; 
	} 
	//have been filtered, can be insert into listview. 
	int index; 
	index=GetListCtrl().InsertItem(0,SourceAddress); 
	if(index!=-1) 
	{ 
		GetListCtrl().SetItem( index, 1, LVIF_TEXT , _itoa( iSourcePort, buffer, 10 ), 0, 0, 0,0); 
		GetListCtrl().SetItem( index, 2, LVIF_TEXT , DestAddress     , 0, 0, 0,0); 
		GetListCtrl().SetItem( index, 3, LVIF_TEXT , _itoa( iDestPort, buffer, 10 ), 0, 0, 0,0); 
		GetListCtrl().SetItem( index, 4, LVIF_TEXT , data, 0, 0, 0,0); 
	} 
	 
	//caculate network traffic for xwang 
	if(data!=NULL) 
		iNetworkTraffic = iNetworkTraffic + strlen(data) + sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(TCP_HEADER); 
 
    return ; 
} 
 
void GetPacketListView::OnEditFilter()  
{ 
	CFileterDlg FilterDlg; 
	int ret=FilterDlg.DoModal(); 
	if(ret==IDOK) 
	{ 
		 
	} 
} 
 
void GetPacketListView::OnUpdateFileStart(CCmdUI* pCmdUI)  
{ 
	if(bSniff) 
		pCmdUI->Enable(FALSE); 
	else 
		pCmdUI->Enable(TRUE); 
} 
 
void GetPacketListView::OnUpdateFileStop(CCmdUI* pCmdUI)  
{ 
	if(!bSniff) 
		pCmdUI->Enable(FALSE); 
	else 
		pCmdUI->Enable(TRUE); 
} 
 
void GetPacketListView::OnEditClearall()  
{ 
	GetListCtrl().DeleteAllItems(); 
}