AppMonitorPage.cpp
上传用户:zhuzhu0204
上传日期:2020-07-13
资源大小:13165k
文件大小:5k
开发平台:

Visual C++

  1. // AppMonitorPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyFireWall.h"
  5. #include "AppMonitorPage.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAppMonitorPage property page
  13. IMPLEMENT_DYNCREATE(CAppMonitorPage, CPropertyPage)
  14. CAppMonitorPage::CAppMonitorPage() : CPropertyPage(CAppMonitorPage::IDD)
  15. {
  16. //{{AFX_DATA_INIT(CAppMonitorPage)
  17. //}}AFX_DATA_INIT
  18. }
  19. CAppMonitorPage::~CAppMonitorPage()
  20. {
  21. }
  22. void CAppMonitorPage::DoDataExchange(CDataExchange* pDX)
  23. {
  24. CPropertyPage::DoDataExchange(pDX);
  25. //{{AFX_DATA_MAP(CAppMonitorPage)
  26. DDX_Control(pDX, IDC_APP_MONITOR_TREE, m_AppMonitorTree);
  27. //}}AFX_DATA_MAP
  28. }
  29. BEGIN_MESSAGE_MAP(CAppMonitorPage, CPropertyPage)
  30. //{{AFX_MSG_MAP(CAppMonitorPage)
  31. //}}AFX_MSG_MAP
  32. END_MESSAGE_MAP()
  33. /////////////////////////////////////////////////////////////////////////////
  34. // CAppMonitorPage message handlers
  35. BOOL CAppMonitorPage::OnInitDialog() 
  36. {
  37. CPropertyPage::OnInitDialog();
  38. // TODO: Add extra initialization here
  39. return TRUE;  // return TRUE unless you set the focus to a control
  40.               // EXCEPTION: OCX Property Pages should return FALSE
  41. }
  42. void CAppMonitorPage::AddSession(SESSION *pSession)
  43. {
  44. // 首先查看所属的应用程序,如果没有,就插入一个新的应用程序项
  45. // 要在此应用程序项下添加会话
  46. HTREEITEM hAppItem = FindAppItem(pSession->szPathName);
  47. if(hAppItem == NULL) 
  48. {
  49. hAppItem = m_AppMonitorTree.InsertItem(pSession->szPathName);
  50. }
  51. // 通过SESSION结构,构建可显示的文本
  52. CString sText = SetSessionText(pSession);
  53. // 在应用程序项下,根据套接字句柄查看此会话是否已经存在,
  54. // 如果存在,仅设置子项的文本,如果不存在,要创建一个新的子项
  55. HTREEITEM hSessionItem = FindSessionItem(hAppItem, pSession);
  56. if(hSessionItem != NULL)
  57. {
  58. m_AppMonitorTree.SetItemText(hSessionItem, sText);
  59. }
  60. else
  61. {
  62. hSessionItem = m_AppMonitorTree.InsertItem(sText,hAppItem);
  63. m_AppMonitorTree.SetItemData(hSessionItem, pSession->s);
  64. }
  65. }
  66. HTREEITEM CAppMonitorPage::FindAppItem(TCHAR *pszPathName)
  67. {
  68. // 遍历所有应用程序项,看看指定应用程序是否存在
  69. HTREEITEM hAppItem = m_AppMonitorTree.GetNextItem(TVI_ROOT, TVGN_CHILD);
  70. while(hAppItem != NULL)
  71. {
  72. if(m_AppMonitorTree.GetItemText(hAppItem).CompareNoCase(pszPathName) == 0)
  73. {
  74. // 存在,返回项句柄
  75. return hAppItem; 
  76. }
  77. hAppItem = m_AppMonitorTree.GetNextItem(hAppItem, TVGN_NEXT);
  78. }
  79. return NULL;
  80. }
  81. HTREEITEM CAppMonitorPage::FindSessionItem(HTREEITEM hAppItem, SESSION *pSession)
  82. {
  83. // 变量所有会话项,看看指定会话是否存在
  84. HTREEITEM hSessionItem = m_AppMonitorTree.GetNextItem(hAppItem, TVGN_CHILD);
  85. while(hSessionItem != NULL)
  86. {
  87. if(pSession->s == m_AppMonitorTree.GetItemData(hSessionItem))
  88. return hSessionItem; // 存在,返回项句柄
  89. hSessionItem = m_AppMonitorTree.GetNextItem(hSessionItem, TVGN_NEXT);
  90. }
  91. return NULL;
  92. }
  93. CString CAppMonitorPage::SetSessionText(SESSION *pSession)
  94. {
  95. //该函数的功能时通过 SESSION 结构,在树形结构中构建可显示的文本
  96. CString sText;
  97. CString sServType, sLocal, sRemote, sDirection;
  98. // 本地IP地址
  99. BYTE *pByte = (BYTE *)&pSession->ulLocalIP; // 注意,这里的IP地址是网络字节顺序
  100. sLocal.Format(L"%d.%d.%d.%d:%d", pByte[0], pByte[1], pByte[2], pByte[3], pSession->usLocalPort);
  101. // 远程IP地址
  102. pByte = (BYTE *)&pSession->ulRemoteIP;
  103. sRemote.Format(L"%d.%d.%d.%d:%d", pByte[0], pByte[1], pByte[2], pByte[3], pSession->usRemotePort);
  104. // 服务类型
  105. sServType = L"其它";
  106. switch(pSession->nProtocol)
  107. {
  108. case RULE_SERVICE_TYPE_ALL:
  109. sServType.Format(L"所有");
  110. break;
  111. case RULE_SERVICE_TYPE_TCP:
  112. sServType.Format(L"TCP");
  113. break;
  114. case RULE_SERVICE_TYPE_UDP:
  115. sServType.Format(L"UDP");
  116. break;
  117. case RULE_SERVICE_TYPE_FTP:
  118. sServType.Format(L"FTP");
  119. break;
  120. case RULE_SERVICE_TYPE_TELNET:
  121. sServType.Format(L"TELNET");
  122. break;
  123. case RULE_SERVICE_TYPE_HTTP:
  124. sServType.Format(L"HTTP");
  125. break;
  126. case RULE_SERVICE_TYPE_NNTP:
  127. sServType.Format(L"NNTP");
  128. break;
  129. case RULE_SERVICE_TYPE_POP3:
  130. sServType.Format(L"POP3");
  131. break;
  132. case RULE_SERVICE_TYPE_SMTP:
  133. sServType.Format(L"SMTP");
  134. break;
  135. }
  136. // 方向
  137. switch(pSession->ucDirection)
  138. {
  139. case RULE_DIRECTION_IN:
  140. sDirection = L"<——";
  141. break;
  142. case RULE_DIRECTION_OUT:
  143. sDirection = L"——>";
  144. break;
  145. case RULE_DIRECTION_IN_OUT:
  146. sDirection = L"<——>";
  147. break;
  148. default:
  149. sDirection = L"——";
  150. }
  151. sText.Format(L" %s 协议     【%s】 %s 【%s】 ", sServType, sLocal, sDirection, sRemote);
  152. return sText;
  153. }
  154. void CAppMonitorPage::DeleteSession(SESSION *pSession, BOOL bAppExit)
  155. {
  156. HTREEITEM hAppItem = FindAppItem(pSession->szPathName);
  157. if(hAppItem != NULL)
  158. {
  159. if(bAppExit) // 应用程序退出,删除整个应用程序项(包含下面的会话子项)
  160. {
  161. m_AppMonitorTree.DeleteItem(hAppItem);
  162. }
  163. else // 仅会话删除,在应用程序项下面找到这个会话,将之删除
  164. {
  165. HTREEITEM hSessionItem = FindSessionItem(hAppItem, pSession);
  166. if(hSessionItem != NULL)
  167. {
  168. m_AppMonitorTree.DeleteItem(hSessionItem);
  169. }
  170. // 没有Session存在了,将应用程序项也删除
  171. if(m_AppMonitorTree.GetNextItem(hAppItem, TVGN_CHILD) == NULL) 
  172. m_AppMonitorTree.DeleteItem(hAppItem);
  173. }
  174. }
  175. }