⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portmonview.cpp

📁 远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:

void CPortMonView::OnOperNext()
{
	m_mutexList.Lock();

	int nItem = 0;
	m_wndListExt.SetFocus();

	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos) // only one item can be select
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		m_wndListExt.SetItemState( nItem, ~LVIS_SELECTED, LVIS_SELECTED );
		nItem++;
	}

	m_wndListExt.SetItemState( nItem, LVIS_SELECTED, LVIS_SELECTED );

	m_mutexList.Unlock();
}

void CPortMonView::OnUpdateOperPrev(CCmdUI *pCmdUI)
{
	int nItem = 0;
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos) // only one item can be select
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
	}

	pCmdUI->Enable(nItem > 0);
}

void CPortMonView::OnUpdateOperNext(CCmdUI *pCmdUI)
{
	int nItem = 0;
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos) // only one item can be select
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
	}

	pCmdUI->Enable(nItem < (m_wndListExt.GetItemCount() - 1));
}

BOOL CPortMonView::PreTranslateMessage(MSG* pMsg)
{
	if(pMsg->message == WM_KEYDOWN)
	{
		int nItem = 0;
		POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
		if(pos) // only one item can be select
		{
			nItem = m_wndListExt.GetNextSelectedItem(pos);
		}

		switch( pMsg->wParam )
		{
		case VK_UP:	//up key
			if( nItem > 0 )
			{
				OnOperPrev();
			}
			return TRUE;

		case VK_DOWN:
			if( nItem < m_wndListExt.GetItemCount() - 1 )
			{
				OnOperNext();
			}
			return TRUE;

		default:
			break;
		}
	}

	return CViewExt::PreTranslateMessage(pMsg);
}

void CPortMonView::AddProcessCreated(DWORD dwProcID)
{
	// turn on debug privilege
	CProcessHelp::EnableDebugPrivilege(TRUE);

	// using toolhelp snapshot
	SYSPROC_S *pstSysProc;
	CProcessHelp procHelp( TH32CS_SNAPPROCESS );
	PROCESSENTRY32 pe32 = {0};
	pe32.dwSize = sizeof(PROCESSENTRY32);

	if( procHelp.ProcessFind( dwProcID, &pe32 ) )
	{
		pstSysProc = new SYSPROC_S;
		ZeroMemory( pstSysProc, sizeof(SYSPROC_S) );

		// process ID
		pstSysProc->dwPid = pe32.th32ProcessID;
		// process priority
		pstSysProc->wPriority = (WORD)pe32.pcPriClassBase;
		// threads
		pstSysProc->wThreads = (WORD)pe32.cntThreads;

		// using toolhelp snapshot
		BOOL bOK = FALSE;
		int nTryTimes = 0;
		do
		{
			::Sleep(100);
			CProcessHelp modHelp( TH32CS_SNAPMODULE, pe32.th32ProcessID );
			MODULEENTRY32 me32 = {0};
			me32.dwSize = sizeof(MODULEENTRY32);

			bOK = modHelp.ModuleFirst(&me32);
			if( bOK && (me32.th32ProcessID == pe32.th32ProcessID) )
			{
				// process size
				pstSysProc->dwMemUsage = me32.modBaseSize;

				// process full name
				//StringCbCopy( pstSysProc->szPath, MAX_PATH*sizeof(TCHAR), me32.szExePath );
				_tcscpy( pstSysProc->szPath, me32.szExePath );
				break;
			}

			nTryTimes++;
		} while( !bOK && (nTryTimes < 50) );

		if( !bOK )
		{
			CString sTemp = pe32.szExeFile;
			if( sTemp.IsEmpty() )
			{
				sTemp.Format( "PID = %u", pe32.th32ProcessID );
			}
			//StringCbCopy( pstSysProc->szPath, MAX_PATH*sizeof(TCHAR), sTemp );
			_tcscpy( pstSysProc->szPath, (LPCTSTR)sTemp );
		}

		InsertRow( (LPARAM)pstSysProc, COL_SYSMAX );
	}

	// turn off debug privilege
	CProcessHelp::EnableDebugPrivilege(FALSE);
}

void CPortMonView::RemoveProcByID(DWORD dwProcID)
{
	CString sPID;
	sPID.Format( "%u", dwProcID );

	int nItem;
	LVFINDINFO info;
	info.flags = LVFI_PARTIAL | LVFI_STRING;
	info.psz = (LPCTSTR)sPID;

	while( (nItem = m_wndListExt.FindItem(&info)) != -1 )
	{
		m_wndListExt.DeleteItem(nItem);
	}
}

void CPortMonView::FillProcKey(PROCKEY_S *pstProcKey, int nItem)
{
	CString sTemp;

	if( !pstProcKey )
	{
		return;
	}
	ZeroMemory( pstProcKey, sizeof(PROCKEY_S) );

	LVITEM lvi;
	ZeroMemory( &lvi, sizeof(LVITEM) );
	lvi.mask = LVIF_PARAM;
	lvi.iItem = nItem;
	lvi.iSubItem = 0;

	if ( m_wndListExt.GetItem( &lvi ) )
	{
		NETPROC_S *pNetProc = (NETPROC_S *)lvi.lParam;
		CopyMemory( pstProcKey, &(pNetProc->stProcessKey), sizeof(PROCKEY_S) );
	}
}

BOOL CPortMonView::ProcExists(PROCKEY_S *pstProcKey)
{
	PROCKEY_S stKey;

	for( int i = 0; i < m_wndListExt.GetItemCount(); i++ )
	{
		FillProcKey(&stKey, i);
		if( m_lstNetProc.CompareKey( &stKey, pstProcKey ) )
		{
			return TRUE;
		}
	}

	return FALSE;
}

void CPortMonView::UpdateListView(void)
{
	PROCKEY_S stProcKey;

	// delete process closed
	//m_mutexList.Lock();

	for( int i = (m_wndListExt.GetItemCount() - 1); i >= 0; i-- )
	{
		FillProcKey(&stProcKey, i);
		if( !m_lstNetProc.FindProc(&stProcKey) )
		{
			m_wndListExt.DeleteItem(i);
		}
	}

	// add process currently opened
	CProcList::iterator iter;
	NETPROC_S *pstNetProc;
	for( iter = m_lstNetProc.begin(); iter != m_lstNetProc.end(); iter++ )
	{
		pstNetProc = *iter;
		if( !ProcExists( &(pstNetProc->stProcessKey) ) )
		{
			AddNetProcCreated(pstNetProc);
		}
	}

	//m_mutexList.Unlock();
}

void CPortMonView::UpdateNetProc(void)
{
	//first just get the TCP table
	CString temp;
	PMIB_TCPTABLE_EX pTcpTable = NULL;
	CPortMonDoc *pDoc = GetDocument();
	NETPROC_S *pstNetProc;

	// remove list node at first
	m_lstNetProc.RemoveAll();

	m_pfnAllocateAndGetTcpExTable(&pTcpTable, TRUE, GetProcessHeap(), 0, 2);
	for (UINT i = 0; i < pTcpTable->dwNumEntries; i++)
	{
		pstNetProc = new NETPROC_S;
		ZeroMemory( pstNetProc, sizeof(NETPROC_S) );

		// fill network process informations
		pstNetProc->stProcessKey.dwPid = pTcpTable->table[i].dwProcessId;
		pstNetProc->stProcessKey.cProtocol = (char)enTCP;
		pstNetProc->stProcessKey.dwLocalIP = pTcpTable->table[i].dwLocalAddr;
		pstNetProc->stProcessKey.wLocalPort = htons((USHORT)(pTcpTable->table[i].dwLocalPort));
		pstNetProc->stProcessKey.dwRemoteIP = pTcpTable->table[i].dwRemoteAddr;
		pstNetProc->stProcessKey.wRemotePort = htons((USHORT)(pTcpTable->table[i].dwRemotePort));

		// process state
		switch (pTcpTable->table[i].dwState)
		{
			case MIB_TCP_STATE_CLOSED:
				temp = "关闭";
				break;
			case MIB_TCP_STATE_LISTEN:
				temp = "侦听";
				break;
			case MIB_TCP_STATE_SYN_SENT:
				temp = "发送SYN";
				break;
			case MIB_TCP_STATE_SYN_RCVD:
				temp = "收到SYN";
				break;
			case MIB_TCP_STATE_ESTAB:
				temp = "连接建立";
				break;
			case MIB_TCP_STATE_FIN_WAIT1:
				temp = "等待FIN_1";
				break;
			case MIB_TCP_STATE_FIN_WAIT2:
				temp = "等待FIN_2";
				break;
			case MIB_TCP_STATE_CLOSE_WAIT:
				temp = "等待关闭";
				break;
			case MIB_TCP_STATE_CLOSING:
				temp = "关闭中";
				break;
			case MIB_TCP_STATE_LAST_ACK:
				temp = "最后确认";
				break;
			case MIB_TCP_STATE_TIME_WAIT:
				temp = "等待";
				break;
			case MIB_TCP_STATE_DELETE_TCB:
				temp = "删除";
				break;
			default:
				temp = "未知";
				break;
		}
		//StringCbCopy(pstNetProc->szState, sizeof(pstNetProc->szState), temp);
		_tcscpy( pstNetProc->szState, (LPCTSTR)temp );

		// process path name
		temp = pDoc->GetProcessNameByID(pTcpTable->table[i].dwProcessId);
		if( temp.IsEmpty() )
		{
			temp.Format( "PID = %u", pTcpTable->table[i].dwProcessId );
		}
		//StringCbCopy(pstNetProc->szPath, MAX_PATH*sizeof(TCHAR), temp);
		_tcscpy( pstNetProc->szPath, (LPCTSTR)temp );

		m_lstNetProc.AddNetProc(pstNetProc);
	}

	//now get the UDP table
	PMIB_UDPTABLE_EX pUdpTable = NULL;
	m_pfnAllocateAndGetUdpExTable(&pUdpTable, TRUE, GetProcessHeap(), 0, 2);
	for (UINT j = 0; j < pUdpTable->dwNumEntries; j++)
	{
		pstNetProc = new NETPROC_S;
		ZeroMemory( pstNetProc, sizeof(NETPROC_S) );

		// fill network process informations
		pstNetProc->stProcessKey.dwPid = pUdpTable->table[j].dwProcessId;
		pstNetProc->stProcessKey.cProtocol = (char)enUDP;
		pstNetProc->stProcessKey.dwLocalIP = pUdpTable->table[j].dwLocalAddr;
		pstNetProc->stProcessKey.wLocalPort = htons((USHORT)pUdpTable->table[j].dwLocalPort);

		// process name
		temp = pDoc->GetProcessNameByID(pUdpTable->table[j].dwProcessId);
		if( temp.IsEmpty() )
		{
			temp.Format( "PID = %u", pUdpTable->table[j].dwProcessId );
		}
		//StringCbCopy(pstNetProc->szPath, MAX_PATH*sizeof(TCHAR), temp);
		_tcscpy( pstNetProc->szPath, (LPCTSTR)temp );

		m_lstNetProc.AddNetProc(pstNetProc);
	}

	if (pTcpTable)
		HeapFree(GetProcessHeap(), 0, pTcpTable);
	if (pUdpTable)
		HeapFree(GetProcessHeap(), 0, pUdpTable);

	// update list view now
	UpdateListView();
}

void CPortMonView::AddNetProcCreated(NETPROC_S *pstNetProc)
{
	if( !pstNetProc )
	{
		return;
	}

	// we must allocate a new block for list view lParam
	NETPROC_S *pstProcNew = new NETPROC_S;
	CopyMemory( pstProcNew, pstNetProc, sizeof(NETPROC_S) );

	InsertRow( (LPARAM)pstProcNew, COL_NETMAX );
}

void CPortMonView::OnToolPing()
{
	if( !DoNetOpera(NET_OPER_PING) )
	{
		AfxMessageBox("启动失败");
	}
}

void CPortMonView::OnUpdateToolPing(CCmdUI *pCmdUI)
{
	int nItem;
	CString sTemp(_T(""));
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos)
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		sTemp = m_wndListExt.GetItemText(nItem, COL_PROTOCOL);
	}
	pCmdUI->Enable((m_wndListExt.GetSelectedCount() > 0) && (sTemp.CompareNoCase(_T("TCP")) == 0) );
}

void CPortMonView::OnToolTracert()
{
	if( !DoNetOpera(NET_OPER_TRACERT) )
	{
		AfxMessageBox("启动失败");
	}
}

void CPortMonView::OnUpdateToolTracert(CCmdUI *pCmdUI)
{
	int nItem;
	CString sTemp(_T(""));
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos)
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		sTemp = m_wndListExt.GetItemText(nItem, COL_PROTOCOL);
	}
	pCmdUI->Enable((m_wndListExt.GetSelectedCount() > 0) && (sTemp.CompareNoCase(_T("TCP")) == 0) );
}

void CPortMonView::OnComboIpAddrEnter()
{
	CBCGPToolbarComboBoxButton *pIpAddrCombo = ((CMainFrame *)AfxGetMainWnd())->GetComboIpAddr();
	if( !pIpAddrCombo )
	{
		return;
	}

	CString sIpAddr("");
	sIpAddr = pIpAddrCombo->GetText();

	// add the item at top of combo-list
	pIpAddrCombo->AddItemHead(sIpAddr);
}

void CPortMonView::OnUpdateComboIpAddrEnter(CCmdUI *pCmdUI)
{
	int nItem;
	CString sTemp(_T(""));
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos)
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		sTemp = m_wndListExt.GetItemText(nItem, COL_PROTOCOL);
	}
	pCmdUI->Enable((m_wndListExt.GetSelectedCount() > 0) && (sTemp.CompareNoCase(_T("TCP")) == 0) );
}

void CPortMonView::OnOperOpenPath()
{
	int nItem;
	CString sTemp(_T(""));
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos)
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		if( ((CPortMonApp *)AfxGetApp())->m_bShowNetProc )
		{
			sTemp = m_wndListExt.GetItemText(nItem, COL_NETPATH);
		}
		else
		{
			sTemp = m_wndListExt.GetItemText(nItem, COL_PATH);
		}

		int nIndex = sTemp.ReverseFind('\\');
		if( nIndex > 0 )
		{
			sTemp = sTemp.Left(nIndex);
			::ShellExecute( NULL, "explore", sTemp, NULL, NULL, SW_SHOWNORMAL );
		}
	}
}

void CPortMonView::OnUpdateOperOpenPath(CCmdUI *pCmdUI)
{
	pCmdUI->Enable(m_wndListExt.GetSelectedCount() > 0);
}

int CPortMonView::CompareItems(LPARAM lParam1, LPARAM lParam2, int nColumn)
{
	int nResult = 0;

	if( ((CPortMonApp *)AfxGetApp())->m_bShowNetProc )
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -