ProcessViewPage.cpp
上传用户:shouhua
上传日期:2014-12-06
资源大小:5685k
文件大小:14k
源码类别:

杀毒

开发平台:

Visual C++

  1. // ProcessViewPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "AntiEvilTools.h"
  5. #include "ProcessViewPage.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. //#include <stdio.h>
  12. //#include <windows.h>
  13. #include "Iphlpapi.h"
  14. #include <tlhelp32.h>
  15. #include "Winsock2.h"
  16. #pragma comment(lib, "Iphlpapi.lib")
  17. #pragma comment(lib, "WS2_32.lib")
  18. long total_num=1;
  19. typedef struct 
  20. {
  21.   DWORD   dwState;         // 连接状态
  22.   DWORD   dwLocalAddr;     // 本地地址
  23.   DWORD   dwLocalPort;     // 本地端口
  24.   DWORD   dwRemoteAddr;    // 远程地址
  25.   DWORD   dwRemotePort;    // 远程端口
  26.   DWORD   dwProcessId; // 进程ID号
  27. } MIB_TCPEXROW, *PMIB_TCPEXROW;
  28. typedef struct 
  29. {
  30. DWORD dwNumEntries;
  31. MIB_TCPEXROW table[ANY_SIZE];
  32. } MIB_TCPEXTABLE, *PMIB_TCPEXTABLE;
  33. typedef struct 
  34. {
  35.   DWORD   dwLocalAddr;     // 本地地址
  36.   DWORD   dwLocalPort;     // 本地端口
  37.   DWORD   dwProcessId; // 进程ID号
  38. } MIB_UDPEXROW, *PMIB_UDPEXROW;
  39. typedef struct 
  40. {
  41. DWORD dwNumEntries;
  42. MIB_UDPEXROW table[ANY_SIZE];
  43. } MIB_UDPEXTABLE, *PMIB_UDPEXTABLE;
  44. // 扩展函数原型
  45. typedef DWORD (WINAPI *PFNAllocateAndGetTcpExTableFromStack)(
  46.   PMIB_TCPEXTABLE *pTcpTable, 
  47.   BOOL bOrder,             
  48.   HANDLE heap,
  49.   DWORD zero,
  50.   DWORD flags
  51. );
  52. typedef DWORD (WINAPI *PFNAllocateAndGetUdpExTableFromStack)(
  53.   PMIB_UDPEXTABLE *pUdpTable,  
  54.   BOOL bOrder,              
  55.   HANDLE heap,
  56.   DWORD zero,
  57.   DWORD flags
  58. );
  59. PCHAR ProcessPidToName(HANDLE hProcessSnap, DWORD ProcessId, PCHAR ProcessName);
  60. /////////////////////////////////////////////////////////////////////////////
  61. // CProcessViewPage property page
  62. IMPLEMENT_DYNCREATE(CProcessViewPage, CPropertyPage)
  63. CProcessViewPage::CProcessViewPage() : CPropertyPage(CProcessViewPage::IDD)
  64. {
  65. //{{AFX_DATA_INIT(CProcessViewPage)
  66. // NOTE: the ClassWizard will add member initialization here
  67. //}}AFX_DATA_INIT
  68. }
  69. CProcessViewPage::~CProcessViewPage()
  70. {
  71. }
  72. void CProcessViewPage::DoDataExchange(CDataExchange* pDX)
  73. {
  74. CPropertyPage::DoDataExchange(pDX);
  75. //{{AFX_DATA_MAP(CProcessViewPage)
  76. DDX_Control(pDX, IDC_LIST_PROCESS_VIEW, m_process_ListCtrl);
  77. //}}AFX_DATA_MAP
  78. }
  79. BEGIN_MESSAGE_MAP(CProcessViewPage, CPropertyPage)
  80. //{{AFX_MSG_MAP(CProcessViewPage)
  81. ON_NOTIFY(NM_RCLICK, IDC_LIST_PROCESS_VIEW, OnRclickProcessList)
  82. ON_COMMAND(ID_REF, OnMenuitemProcessRefresh)
  83. // NOTE: the ClassWizard will add message map macros here
  84. //}}AFX_MSG_MAP
  85. END_MESSAGE_MAP()
  86. /////////////////////////////////////////////////////////////////////////////
  87. // CProcessViewPage message handlers
  88. int CProcessViewPage::GetFileIcon(LPCTSTR lpFileName)
  89. {
  90. SHFILEINFO sfi;
  91. SHGetFileInfo(lpFileName, 0, &sfi, sizeof(sfi), SHGFI_ICON|SHGFI_SMALLICON|SHGFI_LARGEICON);
  92. return sfi.iIcon;
  93. }
  94. void CProcessViewPage::GetProcessPort()
  95. {
  96. m_process_ListCtrl.DeleteAllItems();
  97. PFNAllocateAndGetTcpExTableFromStack pAllocateAndGetTcpExTableFromStack;
  98. PFNAllocateAndGetUdpExTableFromStack pAllocateAndGetUdpExTableFromStack;
  99.     CString   str1;
  100. // 获取扩展函数的入口地址
  101. HMODULE hModule = ::LoadLibrary("iphlpapi.dll");
  102. pAllocateAndGetTcpExTableFromStack = 
  103. (PFNAllocateAndGetTcpExTableFromStack)::GetProcAddress(hModule, 
  104. "AllocateAndGetTcpExTableFromStack");
  105. pAllocateAndGetUdpExTableFromStack = 
  106. (PFNAllocateAndGetUdpExTableFromStack)::GetProcAddress(hModule, 
  107. "AllocateAndGetUdpExTableFromStack");
  108. if(pAllocateAndGetTcpExTableFromStack == NULL || pAllocateAndGetUdpExTableFromStack == NULL)
  109. {
  110. printf(" Ex APIs are not present n ");
  111. // 说明你应该调用普通的IP帮助API去获取TCP连接表和UDP监听表
  112. return ;
  113. }
  114. // 调用扩展函数,获取TCP扩展连接表和UDP扩展监听表
  115. PMIB_TCPEXTABLE pTcpExTable;
  116. PMIB_UDPEXTABLE pUdpExTable;
  117. // pTcpExTable和pUdpExTable所指的缓冲区自动由扩展函数在进程堆中申请
  118. if(pAllocateAndGetTcpExTableFromStack(&pTcpExTable, TRUE, GetProcessHeap(), 2, 2) != 0)
  119. {
  120. //printf(" Failed to snapshot TCP endpoints.n");
  121. return ;
  122. }
  123. if(pAllocateAndGetUdpExTableFromStack(&pUdpExTable, TRUE, GetProcessHeap(), 2, 2) != 0)
  124. {
  125. //printf(" Failed to snapshot UDP endpoints.n");
  126. return ;
  127. }
  128. // 给系统内的所有进程拍一个快照
  129. HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  130. if(hProcessSnap == INVALID_HANDLE_VALUE)
  131. {
  132. //printf(" Failed to take process snapshot. Process names will not be shown.nn");
  133. return ;
  134. }
  135. // printf(" Active Connections nn");
  136. // char szLocalAddr[128];
  137. // char szRemoteAddr[128];
  138. char szProcessName[128];
  139. in_addr inadLocal, inadRemote;
  140. char    strState[128];
  141. DWORD   dwRemotePort = 0;
  142. char strTemp[1024];
  143. CString str, strNum, strName,szSource,strSourPort, szDest,strDestPort, strData, strSize,strMAC,strHost;
  144. // 打印UDP监听表信息
  145. for(UINT i = 0; i < pUdpExTable->dwNumEntries; ++i)
  146. {
  147. // 本地IP地址
  148. inadLocal.s_addr = pUdpExTable->table[i].dwLocalAddr;
  149. // 远程端口
  150. if(strcmp(strState, "LISTEN") != 0)
  151. {
  152. dwRemotePort = pTcpExTable->table[i].dwRemotePort;
  153. }
  154. else
  155. dwRemotePort = 0;
  156. // 远程IP地址
  157. inadRemote.s_addr = pTcpExTable->table[i].dwRemoteAddr;
  158. // sprintf(szLocalAddr,  "%s:%u", inet_ntoa(inadLocal), 
  159. // ntohs((unsigned short)(0x0000FFFF & pUdpExTable->table[i].dwLocalPort)));
  160. // 打印出此入口的信息
  161. // str1.Format("%-5s %s:%dn", "[UDP]", 
  162. // ProcessPidToName(hProcessSnap, pUdpExTable->table[i].dwProcessId, szProcessName),
  163. // pUdpExTable->table[i].dwProcessId );
  164. // MessageBox(str1);
  165. strNum.Format("%d",pUdpExTable->table[i].dwProcessId);
  166. strName.Format("%s",ProcessPidToName(hProcessSnap, pUdpExTable->table[i].dwProcessId, szProcessName));
  167. szSource.Format("%s",inet_ntoa(inadLocal));
  168. strSourPort.Format("%d",ntohs((unsigned short)(0x0000FFFF & pUdpExTable->table[i].dwLocalPort)));
  169. szDest.Format("%s","*.*.*.*");
  170. // strDestPort.Format("%d",ntohs((unsigned short)(0x0000FFFF & dwRemotePort)));
  171. int index;
  172. CString Proto="UDP";
  173. GetExeFilePath(ProcessPidToName(hProcessSnap, pUdpExTable->table[i].dwProcessId, szProcessName), strTemp,pUdpExTable->table[i].dwProcessId);
  174. index = m_process_ListCtrl.InsertItem(0,strName,GetFileIcon(strTemp));
  175. m_process_ListCtrl.SetItem(index,1,LVIF_TEXT,strNum, 0, 0, 0, 0);
  176. m_process_ListCtrl.SetItem(index,2,LVIF_TEXT,Proto, 0, 0, 0, 0);
  177. m_process_ListCtrl.SetItem(index,3,LVIF_TEXT,szSource, 0, 0, 0, 0);
  178. m_process_ListCtrl.SetItem(index,4,LVIF_TEXT,strSourPort, 0, 0, 0, 0);
  179. m_process_ListCtrl.SetItem(index,5,LVIF_TEXT,szDest, 0, 0, 0, 0);
  180. m_process_ListCtrl.SetItem(index,6,LVIF_TEXT,"*", 0, 0, 0, 0);
  181. m_process_ListCtrl.SetItem(index,7,LVIF_TEXT,"*", 0, 0, 0, 0);
  182. /*printf("      Local:   %sn      Remote:  %sn",
  183. szLocalAddr, "*.*.*.*:*" );*/
  184. }
  185. // 打印TCP扩展连接表信息
  186. for(i = 0; i < pTcpExTable->dwNumEntries; ++i)
  187. {
  188. // 状态
  189. switch (pTcpExTable->table[i].dwState)
  190. {
  191. case MIB_TCP_STATE_CLOSED:
  192. strcpy(strState, "CLOSED");
  193. break;
  194. case MIB_TCP_STATE_TIME_WAIT:
  195. strcpy(strState, "TIME_WAIT");
  196. break;
  197. case MIB_TCP_STATE_LAST_ACK:
  198. strcpy(strState, "LAST_ACK");
  199. break;
  200. case MIB_TCP_STATE_CLOSING:
  201. strcpy(strState, "CLOSING");
  202. break;
  203. case MIB_TCP_STATE_CLOSE_WAIT:
  204. strcpy(strState, "CLOSE_WAIT");
  205. break;
  206. case MIB_TCP_STATE_FIN_WAIT1:
  207. strcpy(strState, "FIN_WAIT1");
  208. break;
  209. case MIB_TCP_STATE_ESTAB:
  210. strcpy(strState, "ESTAB");
  211. break;
  212. case MIB_TCP_STATE_SYN_RCVD:
  213. strcpy(strState, "SYN_RCVD");
  214. break;
  215. case MIB_TCP_STATE_SYN_SENT:
  216. strcpy(strState, "SYN_SENT");
  217. break;
  218. case MIB_TCP_STATE_LISTEN:
  219. strcpy(strState, "LISTEN");
  220. break;
  221. case MIB_TCP_STATE_DELETE_TCB:
  222. strcpy(strState, "DELETE");
  223. break;
  224. default:
  225. // printf("Error: unknown state!n");
  226. break;
  227. }
  228. // 本地IP地址
  229. inadLocal.s_addr = pTcpExTable->table[i].dwLocalAddr;
  230. // 远程端口
  231. if(strcmp(strState, "LISTEN") != 0)
  232. {
  233. dwRemotePort = pTcpExTable->table[i].dwRemotePort;
  234. }
  235. else
  236. dwRemotePort = 0;
  237. // 远程IP地址
  238. inadRemote.s_addr = pTcpExTable->table[i].dwRemoteAddr;
  239. // sprintf(szLocalAddr, "%s:%u", inet_ntoa(inadLocal), 
  240. // ntohs((unsigned short)(0x0000FFFF & pTcpExTable->table[i].dwLocalPort)));
  241. // sprintf(szRemoteAddr, "%s:%u", inet_ntoa(inadRemote), 
  242. // ntohs((unsigned short)(0x0000FFFF & dwRemotePort)));
  243. // 打印出此入口的信息
  244. //str1.Format("%-5s %s:%dn      State:   %sn", "[TCP]", 
  245. // ProcessPidToName(hProcessSnap, pTcpExTable->table[i].dwProcessId, szProcessName),
  246. // pTcpExTable->table[i].dwProcessId,
  247. // strState);
  248.      //   MessageBox(str1);
  249. strNum.Format("%d",pTcpExTable->table[i].dwProcessId);
  250. strName.Format("%s",ProcessPidToName(hProcessSnap, pTcpExTable->table[i].dwProcessId, szProcessName));
  251. szSource.Format("%s",inet_ntoa(inadLocal));
  252. strSourPort.Format("%d",ntohs((unsigned short)(0x0000FFFF & pTcpExTable->table[i].dwLocalPort)));
  253. szDest.Format("%s",inet_ntoa(inadRemote));
  254. strDestPort.Format("%d",ntohs((unsigned short)(0x0000FFFF & dwRemotePort)));
  255. if(szDest=="0.0.0.0")
  256. strDestPort="0";
  257. int index;
  258. CString Proto="TCP";
  259. GetExeFilePath(ProcessPidToName(hProcessSnap, pUdpExTable->table[i].dwProcessId, szProcessName), strTemp,pUdpExTable->table[i].dwProcessId);
  260. index = m_process_ListCtrl.InsertItem(0,strName,GetFileIcon(strTemp));
  261. m_process_ListCtrl.SetItem(index,1,LVIF_TEXT,strNum, 0, 0, 0, 0);
  262. m_process_ListCtrl.SetItem(index,2,LVIF_TEXT,Proto, 0, 0, 0, 0);
  263. m_process_ListCtrl.SetItem(index,3,LVIF_TEXT,szSource, 0, 0, 0, 0);
  264. m_process_ListCtrl.SetItem(index,4,LVIF_TEXT,strSourPort, 0, 0, 0, 0);
  265. m_process_ListCtrl.SetItem(index,5,LVIF_TEXT,szDest, 0, 0, 0, 0);
  266. m_process_ListCtrl.SetItem(index,6,LVIF_TEXT,strDestPort, 0, 0, 0, 0);
  267. m_process_ListCtrl.SetItem(index,7,LVIF_TEXT,strState, 0, 0, 0, 0);
  268. /*printf("      Local:   %sn      Remote:  %sn",
  269. szLocalAddr, szRemoteAddr);*/
  270. }
  271. ::CloseHandle(hProcessSnap);
  272. ::LocalFree(pTcpExTable);
  273. ::LocalFree(pUdpExTable);
  274. ::FreeLibrary(hModule);
  275. return ;
  276. }
  277. bool CProcessViewPage::InitSystemImageLists(HWND hwndList)
  278. {
  279. SHFILEINFO sfi;
  280.     HIMAGELIST himlSmall = (HIMAGELIST)::SHGetFileInfo( "C:\", 0, &sfi, 
  281. sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
  282.     HIMAGELIST himlLarge = (HIMAGELIST)::SHGetFileInfo( "C:\", 0, &sfi, 
  283. sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_LARGEICON );
  284.     if( himlSmall && himlLarge ) { 
  285. ListView_SetImageList(hwndList, himlSmall, LVSIL_SMALL);
  286. ListView_SetImageList(hwndList, himlLarge, LVSIL_NORMAL);
  287. return TRUE;
  288.     }
  289.     return FALSE;
  290. }
  291. BOOL CProcessViewPage::OnInitDialog()
  292. {
  293. CDialog::OnInitDialog();
  294. // Add "About..." menu item to system menu.
  295. // IDM_ABOUTBOX must be in the system command range.
  296. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  297. ASSERT(IDM_ABOUTBOX < 0xF000);
  298. CMenu* pSysMenu = GetSystemMenu(FALSE);
  299. if (pSysMenu != NULL)
  300. {
  301. CString strAboutMenu;
  302. strAboutMenu.LoadString(IDS_ABOUTBOX);
  303. if (!strAboutMenu.IsEmpty())
  304. {
  305. pSysMenu->AppendMenu(MF_SEPARATOR);
  306. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  307. }
  308. }
  309. // Set the icon for this dialog.  The framework does this automatically
  310. //  when the application's main window is not a dialog
  311. SetIcon(m_hIcon, TRUE); // Set big icon
  312. SetIcon(m_hIcon, FALSE); // Set small icon
  313. // TODO: Add extra initialization here
  314. //  ListView initialize
  315. DWORD dwStyle=GetWindowLong(m_process_ListCtrl.GetSafeHwnd(),GWL_STYLE);
  316. dwStyle&=~LVS_TYPEMASK;
  317. dwStyle|=LVS_REPORT;
  318. SetWindowLong(m_process_ListCtrl.GetSafeHwnd(),GWL_STYLE,dwStyle);
  319. //SetRedraw(TRUE); 
  320. //初始化列表
  321. InitSystemImageLists(m_process_ListCtrl.m_hWnd);
  322. m_process_ListCtrl.InsertColumn(0,"状态",LVCFMT_LEFT,60);
  323.     m_process_ListCtrl.InsertColumn(0,"目的端口",LVCFMT_LEFT,80);
  324. m_process_ListCtrl.InsertColumn(0,"目的地址IP",LVCFMT_LEFT,100);
  325. m_process_ListCtrl.InsertColumn(0,"源端口",LVCFMT_LEFT,60);
  326. m_process_ListCtrl.InsertColumn(0,"源地址",LVCFMT_LEFT,100);
  327. m_process_ListCtrl.InsertColumn(0,"协议",LVCFMT_LEFT,40);
  328. m_process_ListCtrl.InsertColumn(0,"进程号",LVCFMT_LEFT,60);
  329. m_process_ListCtrl.InsertColumn(0,"进程名",LVCFMT_LEFT,80);
  330.     
  331.     ::SendMessage(m_process_ListCtrl.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
  332. LVS_EX_FULLROWSELECT, LVS_EX_FULLROWSELECT);
  333. // SetWindowText("进程与端口");
  334. // SetTimer(0, 500, NULL);
  335. GetProcessPort();
  336. return TRUE;  // return TRUE  unless you set the focus to a control
  337. }
  338. bool CProcessViewPage::GetExeFilePath(char pExeFileName[], char buffer[], DWORD pid)
  339. {
  340. bool flag = true;
  341. memset(buffer, 0, strlen(buffer));
  342. int result = (int)FindExecutable(pExeFileName, 0, buffer);
  343. if(result <= 32)
  344. {
  345. memset(buffer, 0, strlen(buffer));
  346. HANDLE hProcess;
  347. hProcess = OpenProcess(PROCESS_VM_READ|PROCESS_QUERY_INFORMATION, FALSE, pid);
  348. if(hProcess != NULL)
  349. {
  350. if(GetModuleFileNameEx(hProcess, 0, buffer, 1024) == 0)
  351. flag = false;
  352. }
  353. else
  354. {
  355. flag = false;
  356. }
  357. CloseHandle(hProcess);
  358. }
  359. if(!flag)
  360. {
  361. strcpy(buffer, "不知道");
  362. }
  363. return flag;
  364. }
  365. PCHAR ProcessPidToName(HANDLE hProcessSnap, DWORD ProcessId, PCHAR ProcessName)
  366. {
  367. PROCESSENTRY32 processEntry;
  368. processEntry.dwSize = sizeof(processEntry);
  369. // 找不到的话,默认进程名为“???”
  370. strcpy(ProcessName, "???");
  371. if(!::Process32First(hProcessSnap, &processEntry)) 
  372. return ProcessName;
  373. do 
  374. {
  375. if(processEntry.th32ProcessID == ProcessId) // 就是这个进程
  376. {
  377. strcpy(ProcessName, processEntry.szExeFile);
  378. break;
  379. }
  380. }
  381. while(::Process32Next(hProcessSnap, &processEntry));
  382. return ProcessName;
  383. }
  384. void CProcessViewPage::OnRclickProcessList(NMHDR *pNMHDR, LRESULT *pResult)
  385. {
  386. iSelected = m_process_ListCtrl.GetNextItem(-1, LVNI_SELECTED);
  387. POINT point;
  388. ::GetCursorPos(&point);
  389. CMenu menu;
  390. menu.LoadMenu(IDR_MENU1);
  391. menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);
  392. *pResult = 0;
  393. }
  394. void CProcessViewPage::OnMenuitemProcessRefresh()
  395. {
  396. GetProcessPort();
  397. }