?? portmonview.cpp
字號:
// 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 + -