📄 portmonview.cpp
字号:
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 + -