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

Visual C++

  1. // WorkStatusPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyFireWall.h"
  5. #include "WorkStatusPage.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define MODIFY_LSP_MODE 1
  12. #define MODIFY_KER_MODE 2
  13. #define START_X      70
  14. #define START_Y      370
  15. #define UNIT_LENGTH  3
  16. #define UNIT_HEIGHT  1
  17. extern CMyFireWallApp theApp;
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CWorkStatusPage property page
  20. IMPLEMENT_DYNCREATE(CWorkStatusPage, CPropertyPage)
  21. CWorkStatusPage::CWorkStatusPage() : CPropertyPage(CWorkStatusPage::IDD)
  22. {
  23. //{{AFX_DATA_INIT(CWorkStatusPage)
  24. // NOTE: the ClassWizard will add member initialization here
  25. //}}AFX_DATA_INIT
  26. }
  27. CWorkStatusPage::~CWorkStatusPage()
  28. {
  29. }
  30. void CWorkStatusPage::DoDataExchange(CDataExchange* pDX)
  31. {
  32. CPropertyPage::DoDataExchange(pDX);
  33. //{{AFX_DATA_MAP(CWorkStatusPage)
  34. // NOTE: the ClassWizard will add DDX and DDV calls here
  35. //}}AFX_DATA_MAP
  36. }
  37. BEGIN_MESSAGE_MAP(CWorkStatusPage, CPropertyPage)
  38. //{{AFX_MSG_MAP(CWorkStatusPage)
  39. ON_BN_CLICKED(IDC_LSP_MODE, OnModifyLspMode)
  40. ON_COMMAND(IDM_DENY_MODE, OnMenuDenyMode)
  41. ON_COMMAND(IDM_FILTER_MODE, OnMenuFilterMode)
  42. ON_COMMAND(IDM_PASS_MODE, OnMenuPassMode)
  43. ON_BN_CLICKED(IDC_KER_MODE, OnModifyKerMode)
  44. ON_WM_PAINT()
  45. ON_WM_TIMER()
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CWorkStatusPage message handlers
  50. BOOL CWorkStatusPage::OnInitDialog() 
  51. {
  52. CPropertyPage::OnInitDialog();
  53. // TODO: Add extra initialization here
  54. m_nSelected = 0; // 这是对于菜单项的操作,设为0表示开始时既不修改应用层模式(对应 1),也不修改核心层模式(对应 2)
  55. UpdateWorkMode();
  56. for (int i=0; i<MAX_COUNTS; i++)
  57. {
  58. m_nSendFlowRate[i]  = 0;
  59. m_nRecvFlowRate[i]  = 0;
  60. m_nTotalFlowRate[i] = 0;
  61.   }
  62. SetTimer(1, 1000, 0);
  63. return TRUE;  // return TRUE unless you set the focus to a control
  64.               // EXCEPTION: OCX Property Pages should return FALSE
  65. }
  66. void CWorkStatusPage::UpdateWorkMode()
  67. {
  68. // 应用层工作模式
  69. switch (g_RuleFile.m_header.ucLspWorkMode)
  70. {
  71. case PF_PASS_ALL:
  72. SetDlgItemText(IDC_LSP_MODE, L"允许所有");
  73. break;
  74. case PF_QUERY_ALL:
  75. SetDlgItemText(IDC_LSP_MODE, L"过滤所有");
  76. break;
  77. case PF_DENY_ALL:
  78. SetDlgItemText(IDC_LSP_MODE, L"禁止所有");
  79. break;
  80. }
  81. // 核心层工作模式
  82. switch (g_RuleFile.m_header.ucKerWorkMode)
  83. {
  84. case IM_PASS_ALL:
  85. SetDlgItemText(IDC_KER_MODE, L"允许所有");
  86. break;
  87. case IM_START_FILTER:
  88. SetDlgItemText(IDC_KER_MODE, L"过滤所有");
  89. break;
  90. case IM_DENY_ALL:
  91. SetDlgItemText(IDC_KER_MODE, L"禁止所有");
  92. break;
  93. }
  94. void CWorkStatusPage::OnModifyLspMode() 
  95. {
  96. // TODO: Add your control notification handler code here
  97. m_nSelected = MODIFY_LSP_MODE;
  98. //创建菜单
  99. CMenu menu,*pSubMenu;
  100. menu.LoadMenu(IDR_MODE_MENU);
  101. pSubMenu=menu.GetSubMenu(0);
  102. CRect Rect;
  103. GetDlgItem(IDC_LSP_MODE)->GetWindowRect(&Rect);
  104. CPoint point(Rect.left, Rect.bottom);
  105. UINT nCheckItem;
  106. switch (g_RuleFile.m_header.ucLspWorkMode)
  107. {
  108. case PF_PASS_ALL:
  109. nCheckItem = IDM_PASS_MODE;
  110. break;
  111. case PF_QUERY_ALL:
  112. nCheckItem = IDM_FILTER_MODE;
  113. break;
  114. case PF_DENY_ALL:
  115. nCheckItem = IDM_DENY_MODE;
  116. break;
  117. }
  118. pSubMenu->CheckMenuItem(nCheckItem, MF_BYCOMMAND | MF_CHECKED);
  119. pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
  120. }
  121. void CWorkStatusPage::OnModifyKerMode() 
  122. {
  123. // TODO: Add your control notification handler code here
  124. m_nSelected = MODIFY_KER_MODE;
  125. //创建菜单
  126. CMenu menu,*pSubMenu;
  127. menu.LoadMenu(IDR_MODE_MENU);
  128. pSubMenu=menu.GetSubMenu(0);
  129. CRect Rect;
  130. GetDlgItem(IDC_KER_MODE)->GetWindowRect(&Rect);
  131. CPoint point(Rect.left, Rect.bottom);
  132. UINT nCheckItem;
  133. switch (g_RuleFile.m_header.ucKerWorkMode)
  134. {
  135. case IM_PASS_ALL:
  136. nCheckItem = IDM_PASS_MODE;
  137. break;
  138. case IM_START_FILTER:
  139. nCheckItem = IDM_FILTER_MODE;
  140. break;
  141. case IM_DENY_ALL:
  142. nCheckItem = IDM_DENY_MODE;
  143. break;
  144. }
  145. pSubMenu->CheckMenuItem(nCheckItem, MF_BYCOMMAND | MF_CHECKED);
  146. pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
  147. }
  148. void CWorkStatusPage::OnMenuPassMode() 
  149. {
  150. // TODO: Add your command handler code here
  151. if (m_nSelected == MODIFY_LSP_MODE)
  152. {
  153. g_RuleFile.m_header.ucLspWorkMode = PF_PASS_ALL;
  154. g_pIoControl->SetWorkMode(PF_PASS_ALL);
  155. SetDlgItemText(IDC_LSP_MODE, L"允许所有");
  156. // 保存文件头中的工作模式
  157. g_RuleFile.SaveRules();
  158. // 应用到DLL层
  159. theApp.ApplyLspRules();
  160. // 将该动作保存到日志文件
  161. SaveLogFile("将应用层工作模式设置为:“允许所有”。");
  162. else
  163. {
  164. g_RuleFile.m_header.ucKerWorkMode = IM_PASS_ALL;
  165. int nKerWorkMode = IM_PASS_ALL;
  166. PtSetWorkMode(&nKerWorkMode);
  167. SetDlgItemText(IDC_KER_MODE, L"允许所有");
  168. // 保存文件头中的工作模式
  169. g_RuleFile.SaveRules();
  170. // 应用到核心层
  171. theApp.ApplyKerRules();
  172. // 将该动作保存到日志文件
  173. SaveLogFile("将核心层工作模式设置为:“允许所有”。");
  174. }
  175. // 还原 nSelected 值
  176. m_nSelected = 0;
  177. }
  178. void CWorkStatusPage::OnMenuFilterMode() 
  179. {
  180. // TODO: Add your command handler code here
  181. if (m_nSelected == MODIFY_LSP_MODE)
  182. {
  183. g_RuleFile.m_header.ucLspWorkMode = PF_QUERY_ALL;
  184. g_pIoControl->SetWorkMode(PF_QUERY_ALL);
  185. SetDlgItemText(IDC_LSP_MODE, L"过滤所有");
  186. // 保存文件头中的工作模式
  187. g_RuleFile.SaveRules();
  188. // 应用到DLL层
  189. theApp.ApplyLspRules();
  190. // 将该动作保存到日志文件
  191. SaveLogFile("将应用层工作模式设置为:“过滤所有”。");
  192. else
  193. {
  194. g_RuleFile.m_header.ucKerWorkMode = IM_START_FILTER;
  195. int nKerWorkMode = IM_START_FILTER;
  196. PtSetWorkMode(&nKerWorkMode);
  197. SetDlgItemText(IDC_KER_MODE, L"过滤所有");
  198. // 保存文件头中的工作模式
  199. g_RuleFile.SaveRules();
  200. // 应用到核心层
  201. theApp.ApplyKerRules();
  202. SaveLogFile("将核心层工作模式设置为:“过滤所有”。");
  203. }
  204. // 还原 nSelected 值
  205. m_nSelected = 0;
  206. }
  207. void CWorkStatusPage::OnMenuDenyMode() 
  208. {
  209. // TODO: Add your command handler code here
  210. if (m_nSelected == MODIFY_LSP_MODE)
  211. {
  212. g_RuleFile.m_header.ucLspWorkMode = PF_DENY_ALL;
  213. g_pIoControl->SetWorkMode(PF_DENY_ALL);
  214. SetDlgItemText(IDC_LSP_MODE, L"拒绝所有");
  215. // 保存文件头中的工作模式
  216. g_RuleFile.SaveRules();
  217. // 应用到DLL层
  218. theApp.ApplyLspRules();
  219. SaveLogFile("将应用层工作模式设置为:“拒绝所有”。");
  220. else
  221. {
  222. g_RuleFile.m_header.ucKerWorkMode = IM_DENY_ALL;
  223. int nKerWorkMode = IM_DENY_ALL;
  224. PtSetWorkMode(&nKerWorkMode);
  225. SetDlgItemText(IDC_KER_MODE, L"拒绝所有");
  226. // 保存文件头中的工作模式
  227. g_RuleFile.SaveRules();
  228. // 应用到核心层
  229. theApp.ApplyKerRules();
  230. SaveLogFile("将核心层工作模式设置为:“拒绝所有”。");
  231. }
  232. // 还原 nSelected 值
  233. m_nSelected = 0;
  234. }
  235. void CWorkStatusPage::OnPaint() 
  236. {
  237. CPaintDC dc(this); // device context for painting
  238. // TODO: Add your message handler code here
  239. DrawFlowGraph();
  240. // Do not call CPropertyPage::OnPaint() for painting messages
  241. }
  242. void CWorkStatusPage::OnTimer(UINT nIDEvent)
  243. {
  244. // TODO: Add your message handler code here and/or call default
  245. HANDLE hControlDevice = PtOpenControlDevice();
  246. CIMAdapters adapters;
  247. if(!adapters.EnumAdapters(hControlDevice))
  248. return ;
  249. HANDLE hAdapter;
  250. PassthruStatistics PassthruStats;
  251. for(int i=0; i<adapters.m_nAdapters; i++)
  252. {
  253. // 打开下层适配器
  254. hAdapter = PtOpenAdapter(adapters.m_pwszAdapterName[i]);
  255. if(hAdapter != INVALID_HANDLE_VALUE)
  256. {
  257. PassthruStatistics Stats;
  258. BOOL bRet = PtQueryStatistics(hAdapter, &Stats);
  259. if(bRet == FALSE)
  260. {
  261. AfxMessageBox(L"返回值位 FALSE");
  262. ::CloseHandle(hAdapter);
  263. ::CloseHandle(hControlDevice);
  264. break;
  265. }
  266. PassthruStats.nSendFlowRate  = Stats.nSendFlowRate;
  267. PassthruStats.nRecvFlowRate  = Stats.nRecvFlowRate;
  268. PassthruStats.nMPSendPktsCt  = Stats.nMPSendPktsCt;
  269. PassthruStats.nMPSendPktsDropped = Stats.nMPSendPktsDropped;
  270. PassthruStats.nPTRcvCt  = Stats.nPTRcvCt;
  271. PassthruStats.nPTRcvDropped  = Stats.nPTRcvDropped;
  272. PassthruStats.nPTRcvPktCt  = Stats.nPTRcvPktCt;
  273. PassthruStats.nPTRcvPktDropped  = Stats.nPTRcvPktDropped;
  274. ::CloseHandle(hAdapter);
  275. }
  276. }
  277. CString strFlowRate;
  278. strFlowRate.Format(L"当前发送流速:n    %d kBpsn当前接收流速:n    %d KBpsnn发送数据包总数: n    %drn  丢弃个数: n    %dnn接收数据包总数: n    %dn  丢弃个数: n    %drn",
  279. PassthruStats.nSendFlowRate/1024, 
  280. PassthruStats.nRecvFlowRate/1024,
  281. PassthruStats.nMPSendPktsCt,
  282. PassthruStats.nMPSendPktsDropped,
  283. PassthruStats.nPTRcvCt+PassthruStats.nPTRcvPktCt,
  284. PassthruStats.nPTRcvDropped+PassthruStats.nPTRcvPktDropped
  285. );
  286. SetDlgItemText(IDC_FLOW_RATE, strFlowRate);
  287. for (i=MAX_COUNTS-2; i>=0; i--)
  288. {
  289. m_nSendFlowRate[i+1]  = m_nSendFlowRate[i];
  290. m_nRecvFlowRate[i+1]  = m_nRecvFlowRate[i];
  291. m_nTotalFlowRate[i+1] = m_nTotalFlowRate[i];
  292. }
  293. m_nSendFlowRate[0]  = PassthruStats.nSendFlowRate/1024/3;
  294. m_nRecvFlowRate[0]  = PassthruStats.nRecvFlowRate/1024/3;
  295. m_nTotalFlowRate[0] = m_nSendFlowRate[0]+m_nRecvFlowRate[0];
  296. if (m_nSendFlowRate[0]>90)
  297. {
  298. m_nSendFlowRate[0] = 90;
  299. }
  300. if (m_nRecvFlowRate[0]>90)
  301. {
  302. m_nRecvFlowRate[0] = 90;
  303. }
  304. if (m_nTotalFlowRate[0]>90)
  305. {
  306. m_nTotalFlowRate[0] = 90;
  307. }
  308. DrawFlowGraph();
  309. OnPaint();
  310. ::CloseHandle(hControlDevice);
  311. CPropertyPage::OnTimer(nIDEvent);
  312. }
  313. void CWorkStatusPage::DrawFlowGraph()
  314. {
  315. CClientDC dc(this);
  316. CRect Rect(70, 70, 370, 370);
  317. CBrush Brush(RGB(135, 206, 235)); // 天蓝
  318. dc.FillRect(&Rect, &Brush);
  319. dc.MoveTo(START_X, 70);
  320. dc.LineTo(START_X, START_Y);
  321. dc.LineTo(370, START_Y);
  322. dc.LineTo(370, 70);
  323. dc.LineTo(START_X, 70);
  324. dc.MoveTo(START_X, 170);
  325. dc.LineTo(370, 170);
  326. dc.MoveTo(START_X, 270);
  327. dc.LineTo(370, 270);
  328. dc.MoveTo(START_X, 80);
  329. dc.LineTo(START_X+5, 80);
  330. dc.MoveTo(START_X, 180);
  331. dc.LineTo(START_X+5, 180);
  332. dc.MoveTo(START_X, 280);
  333. dc.LineTo(START_X+5, 280);
  334. int  penWidth = 2;   
  335. CPen NewPen(PS_SOLID, penWidth, RGB(34, 139, 34)); // 森林绿   
  336. dc.SelectObject(&NewPen); 
  337. // 画发送流量
  338. dc.MoveTo(START_X, START_Y-200-m_nSendFlowRate[0]);
  339. for (int i=1; i<MAX_COUNTS; i++)
  340. {
  341. dc.LineTo(START_X+i*UNIT_LENGTH, START_Y-200-m_nSendFlowRate[i]*UNIT_HEIGHT);
  342. }
  343. // 画接收流量
  344. dc.MoveTo(START_X, START_Y-100-m_nRecvFlowRate[0]);
  345. for (i=1; i<MAX_COUNTS; i++)
  346. {
  347. dc.LineTo(START_X+i*UNIT_LENGTH, START_Y-100-m_nRecvFlowRate[i]*UNIT_HEIGHT);
  348. }
  349. // 画总流量
  350. dc.MoveTo(START_X, START_Y-m_nTotalFlowRate[0]);
  351. for (i=1; i<MAX_COUNTS; i++)
  352. {
  353. dc.LineTo(START_X+i*UNIT_LENGTH, START_Y-m_nTotalFlowRate[i]*UNIT_HEIGHT);
  354. }
  355. }