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

📄 portmonview.cpp

📁 关于远程网络监视程序的源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// PortMonView.cpp : CPortMonView 类的实现
//

#include "stdafx.h"
#include "PortMon.h"

#include "PortMonDoc.h"
#include "prochelp.h"
#include "mainfrm.h"
#include "QueueContainer.h"
#include "applicationscope.h"
#include "netdlg.h"
#include ".\portmonview.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CPortMonView

IMPLEMENT_DYNCREATE(CPortMonView, CViewExt)

BEGIN_MESSAGE_MAP(CPortMonView, CViewExt)
	ON_COMMAND(ID_OPER_CLOSEPROC, OnOperCloseProc)
	ON_UPDATE_COMMAND_UI(ID_OPER_CLOSEPROC, OnUpdateOperCloseProc)
	ON_COMMAND(ID_OPER_PREV, OnOperPrev)
	ON_COMMAND(ID_OPER_NEXT, OnOperNext)
	ON_UPDATE_COMMAND_UI(ID_OPER_PREV, OnUpdateOperPrev)
	ON_UPDATE_COMMAND_UI(ID_OPER_NEXT, OnUpdateOperNext)
	ON_WM_CONTEXTMENU()
	ON_COMMAND(ID_TOOL_PING, OnToolPing)
	ON_COMMAND(ID_TOOL_TRACERT, OnToolTracert)
	ON_COMMAND(ID_TOOL_IPADDR, OnComboIpAddrEnter)
	ON_COMMAND(ID_OPER_OPENPATH, OnOperOpenPath)
	ON_UPDATE_COMMAND_UI(ID_OPER_OPENPATH, OnUpdateOperOpenPath)
	ON_MESSAGE(WM_PROCESSNOTIFY, OnProcNotify)
	ON_WM_DESTROY()
	ON_COMMAND(ID_TOOL_WHOIS, OnToolWhois)
END_MESSAGE_MAP()

// CPortMonView 构造/析构

CPortMonView::CPortMonView() : CViewExt(IDV_PROCESS)
	, m_obAppScope( CApplicationScope::GetInstance(&m_obCallbackHdler) )
{
	// TODO: 在此处添加构造代码
	m_hLibModule = NULL;
}

CPortMonView::~CPortMonView()
{
	if(m_hLibModule)
	{
		FreeLibrary(m_hLibModule);
	}
}

BOOL CPortMonView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改 CREATESTRUCT cs 来修改窗口类或
	// 样式

	return CViewExt::PreCreateWindow(cs);
}

void CPortMonView::OnInitialUpdate()
{
	CViewExt::OnInitialUpdate();

	// 填充 ListView。
	m_wndListExt.SetExtendedStyle( m_wndListExt.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_GRIDLINES );

	if( !LoadExIpHelperProcedures() )
	{
		AfxMessageBox( "动态链接库Iphlpapi功能函数定位失败\n无法显示网络端口", MB_ICONINFORMATION );

		// 仅仅显示进程信息
		((CPortMonApp *)AfxGetApp())->m_bShowNetProc = FALSE;
	}

	// add list item and start process monitor
	m_obViewParam.SetHwnd( GetSafeHwnd() );

	CMainFrame *pFrame = (CMainFrame *)AfxGetMainWnd();
	pFrame->OnViewRefresh();
}

BOOL CPortMonView::LoadExIpHelperProcedures(void)
{
	m_hLibModule = LoadLibrary(_T("iphlpapi.dll"));
	if (m_hLibModule == NULL)
		return FALSE;

	// XP or later
	m_pfnAllocateAndGetTcpExTable = (PROCALLOCATEANDGETTCPEXTABLEFROMSTACK)GetProcAddress(m_hLibModule,"AllocateAndGetTcpExTableFromStack");
	if (m_pfnAllocateAndGetTcpExTable == NULL)
		return FALSE;

	// XP or later
	m_pfnAllocateAndGetUdpExTable = (PROCALLOCATEANDGETUDPEXTABLEFROMSTACK)GetProcAddress(m_hLibModule,"AllocateAndGetUdpExTableFromStack");
	if (m_pfnAllocateAndGetUdpExTable == NULL)
		return FALSE;

	return TRUE;
}

// CPortMonView 诊断

#ifdef _DEBUG
void CPortMonView::AssertValid() const
{
	CViewExt::AssertValid();
}

void CPortMonView::Dump(CDumpContext& dc) const
{
	CViewExt::Dump(dc);
}

CPortMonDoc* CPortMonView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPortMonDoc)));
	return (CPortMonDoc*)m_pDocument;
}
#endif //_DEBUG


// CPortMonView 消息处理程序

void CPortMonView::AddAllNetProc(void)
{
	m_obAppScope.StopMonitoring();

	//m_mutexList.Lock();

	// clear all items existed
	m_wndListExt.SetRedraw(FALSE); // shut off redraw

	m_wndListExt.DeleteAllItems();
	int nCol = m_wndListExt.GetHeaderCtrl().GetItemCount()-1;
	while ( nCol >= 0 )
	{
		m_wndListExt.DeleteColumn(nCol--);
	}

	// add new header
	m_wndListExt.InsertColumn(COL_NETPID, "PID", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_PROTOCOL, "协议", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_LOCALIP, "本机IP", LVCFMT_LEFT, 120);
	m_wndListExt.InsertColumn(COL_LOCALPORT, "本机端口", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_REMOTEIP, "远端IP", LVCFMT_LEFT,120);
	m_wndListExt.InsertColumn(COL_REMOTEPORT, "远端端口", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_STATE, "状态", LVCFMT_LEFT,120);
	m_wndListExt.InsertColumn(COL_NETPATH, "进程", LVCFMT_LEFT, 300);

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

	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 );

		// insert item into list
		InsertRow( (LPARAM)pstNetProc, COL_NETMAX );
	}

	//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 );

		// insert item into list
		InsertRow( (LPARAM)pstNetProc, COL_NETMAX );
	}
	m_wndListExt.Sort(COL_NETPID);
	m_wndListExt.SetRedraw(TRUE);

	// this function will redraw the list
	m_wndListExt.AutoSizeColumns();

	// free heap allocated
	if (pTcpTable)
		HeapFree(GetProcessHeap(), 0, pTcpTable);
	if (pUdpTable)
		HeapFree(GetProcessHeap(), 0, pUdpTable);

	//m_mutexList.Unlock();
}

void CPortMonView::AddAllProc(void)
{
	//m_mutexList.Lock();

	// clear all items existed
	m_wndListExt.SetRedraw(FALSE); // shut off redraw

	m_wndListExt.DeleteAllItems();
	int nCol = m_wndListExt.GetHeaderCtrl().GetItemCount()-1;
	while ( nCol >= 0 )
	{
		m_wndListExt.DeleteColumn(nCol--);
	}

	// add new header
	m_wndListExt.InsertColumn(COL_PID, "PID", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_PRIORITY, "优先级", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_THREADS, "线程数", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_MEMUSAGE, "内存使用", LVCFMT_LEFT, 80);
	m_wndListExt.InsertColumn(COL_PATH, "进程", LVCFMT_LEFT, 300);

	// enumerate all process of system
	// turn on debug privilege
	CProcessHelp::EnableDebugPrivilege(TRUE);

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

	BOOL bOK = procHelp.ProcessFirst(&pe32);
	while( bOK )
	{
		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
		CProcessHelp modHelp( TH32CS_SNAPMODULE, pe32.th32ProcessID );
		MODULEENTRY32 me32 = {0};
		me32.dwSize = sizeof(MODULEENTRY32);

		BOOL bSucc = modHelp.ModuleFirst(&me32);
		if( bSucc && ( 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 );
		}
		else
		{
			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 );
		bOK = procHelp.ProcessNext(&pe32);
	}

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

	m_wndListExt.Sort(COL_PID);
	m_wndListExt.SetRedraw(TRUE); // turn on redraw

	// this function will redraw the list
	m_wndListExt.AutoSizeColumns();

	//m_mutexList.Unlock();

	// start process monitor
	m_obAppScope.StartMonitoring(&m_obViewParam);
}

void CPortMonView::OnOperCloseProc()
{
	int nItem;
	DWORD dwPID;
	CString sPID, sService;
	HANDLE hProcess;

	CPortMonDoc *pDoc = GetDocument();

	//m_mutexList.Lock();
	// get the PID of the selected items and kill them
	POSITION pos = m_wndListExt.GetFirstSelectedItemPosition();
	if(pos)
	{
		nItem = m_wndListExt.GetNextSelectedItem(pos);
		sPID = m_wndListExt.GetItemText(nItem, COL_PID);
		_stscanf( sPID.GetBuffer(), "%u", &dwPID );
		sPID.ReleaseBuffer();

		// force to close the process
		hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwPID );
		if (hProcess)
		{
			TerminateProcess( hProcess, 1 );
			CloseHandle( hProcess );

			RemoveProcByID(dwPID);
		}
		else
		{
			if( pDoc->KillService() )
			{
				RemoveProcByID(dwPID);
			}
		}
	}

	//m_mutexList.Unlock();
}

void CPortMonView::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// TODO: 在此处添加消息处理程序代码
    CMenu popMenu;
	popMenu.LoadMenu(IDR_POPMENU);

	CMenu *pPopMenu = popMenu.GetSubMenu(0);
	ASSERT(pPopMenu != NULL);

	CBCGPPopupMenu* pPopupMenu = new CBCGPPopupMenu;
	pPopupMenu->Create (this, point.x, point.y, pPopMenu->Detach ());
}

void CPortMonView::OnUpdateOperCloseProc(CCmdUI *pCmdUI)
{
	CPortMonDoc *pDoc = GetDocument();
	pCmdUI->Enable((m_wndListExt.GetSelectedCount() > 0) && !pDoc->IsKernService() );
}

void CPortMonView::OnItemChanged(int nItem)
{
	DWORD dwPID;
	CString sPID;
	CPortMonDoc *pDoc = GetDocument();

	if( nItem != -1 )
	{
		sPID = m_wndListExt.GetItemText( nItem, COL_PID );
		_stscanf( sPID.GetBuffer(), "%u", &dwPID );
		sPID.ReleaseBuffer();

		pDoc->SetCurProcess(dwPID);
	}

⌨️ 快捷键说明

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