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

Visual C++

  1. // MyFireWallDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyFireWall.h"
  5. #include "MyFireWallDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. extern CMyFireWallApp theApp;
  12. #define IDM_SHOW_WINDOW  11     //显示主界面
  13. DWORD WINAPI GetFlowRateThread(LPVOID lpParam)
  14. {
  15. CMyFireWallDlg *pMyFireWallDlg = (CMyFireWallDlg *)lpParam;
  16. HANDLE hControlDevice = PtOpenControlDevice();
  17. CIMAdapters adapters;
  18. if(!adapters.EnumAdapters(hControlDevice))
  19. return ERROR_SUCCESS;
  20. HANDLE hAdapter;
  21. while (TRUE)
  22. {
  23. PassthruStatistics PassthruStats;
  24. for(int i=0; i<adapters.m_nAdapters; i++)
  25. {
  26. // 打开下层适配器
  27. hAdapter = PtOpenAdapter(adapters.m_pwszAdapterName[i]);
  28. if(hAdapter != INVALID_HANDLE_VALUE)
  29. {
  30. PassthruStatistics Stats;
  31. BOOL bRet = PtQueryStatistics(hAdapter, &Stats);
  32. if(bRet == FALSE)
  33. {
  34. AfxMessageBox(L"返回值位 FALSE");
  35. ::CloseHandle(hAdapter);
  36. ::CloseHandle(hControlDevice);
  37. break;
  38. }
  39. PassthruStats.nSendFlowRate  = Stats.nSendFlowRate;
  40. PassthruStats.nRecvFlowRate  = Stats.nRecvFlowRate;
  41. PassthruStats.nMPSendPktsCt  = Stats.nMPSendPktsCt;
  42. PassthruStats.nMPSendPktsDropped = Stats.nMPSendPktsDropped;
  43. PassthruStats.nPTRcvCt  = Stats.nPTRcvCt;
  44. PassthruStats.nPTRcvDropped  = Stats.nPTRcvDropped;
  45. PassthruStats.nPTRcvPktCt  = Stats.nPTRcvPktCt;
  46. PassthruStats.nPTRcvPktDropped  = Stats.nPTRcvPktDropped;
  47. ::CloseHandle(hAdapter);
  48. }
  49. }
  50. // 
  51. //  CString strFlowRate;
  52. //  strFlowRate.Format(L"发送流量:%d kbpsrn接收流量:%d KbpsrnnMPSendPktsCt: %drnnMPSendPktsDropped: %drnnPTRcvCt: %drnnPTRcvDropped: %drnnPTRcvPktCt: %drnnPTRcvPktDropped: %d",
  53. //  PassthruStats.nSendFlowRate*8/1024, 
  54. //  PassthruStats.nRecvFlowRate*8/1024,
  55. //  PassthruStats.nMPSendPktsCt,
  56. //  PassthruStats.nMPSendPktsDropped,
  57. //  PassthruStats.nPTRcvCt,
  58. //  PassthruStats.nPTRcvDropped,
  59. //  PassthruStats.nPTRcvPktCt,
  60. //  PassthruStats.nPTRcvPktDropped
  61. //  );
  62. //  pMyFireWallDlg->m_WorkStatusPage.SetDlgItemText(IDC_FLOW_RATE, strFlowRate);
  63. // 
  64. Sleep(1000);
  65. }
  66. ::CloseHandle(hControlDevice);
  67. }
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CAboutDlg dialog used for App About
  70. class CAboutDlg : public CDialog
  71. {
  72. public:
  73. CAboutDlg();
  74. // Dialog Data
  75. //{{AFX_DATA(CAboutDlg)
  76. enum { IDD = IDD_ABOUTBOX };
  77. //}}AFX_DATA
  78. // ClassWizard generated virtual function overrides
  79. //{{AFX_VIRTUAL(CAboutDlg)
  80. protected:
  81. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  82. //}}AFX_VIRTUAL
  83. // Implementation
  84. protected:
  85. //{{AFX_MSG(CAboutDlg)
  86. //}}AFX_MSG
  87. DECLARE_MESSAGE_MAP()
  88. };
  89. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  90. {
  91. //{{AFX_DATA_INIT(CAboutDlg)
  92. //}}AFX_DATA_INIT
  93. }
  94. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  95. {
  96. CDialog::DoDataExchange(pDX);
  97. //{{AFX_DATA_MAP(CAboutDlg)
  98. //}}AFX_DATA_MAP
  99. }
  100. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  101. //{{AFX_MSG_MAP(CAboutDlg)
  102. // No message handlers
  103. //}}AFX_MSG_MAP
  104. END_MESSAGE_MAP()
  105. /////////////////////////////////////////////////////////////////////////////
  106. // CMyFireWallDlg dialog
  107. CMyFireWallDlg::CMyFireWallDlg(CWnd* pParent /*=NULL*/)
  108. : CDialog(CMyFireWallDlg::IDD, pParent)
  109. {
  110. //{{AFX_DATA_INIT(CMyFireWallDlg)
  111. // NOTE: the ClassWizard will add member initialization here
  112. //}}AFX_DATA_INIT
  113. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  114. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  115. }
  116. void CMyFireWallDlg::DoDataExchange(CDataExchange* pDX)
  117. {
  118. CDialog::DoDataExchange(pDX);
  119. //{{AFX_DATA_MAP(CMyFireWallDlg)
  120. // NOTE: the ClassWizard will add DDX and DDV calls here
  121. //}}AFX_DATA_MAP
  122. }
  123. BEGIN_MESSAGE_MAP(CMyFireWallDlg, CDialog)
  124. //{{AFX_MSG_MAP(CMyFireWallDlg)
  125. ON_WM_SYSCOMMAND()
  126. ON_WM_PAINT()
  127. ON_WM_QUERYDRAGICON()
  128. ON_COMMAND(IDM_BLUE, OnSkinBlue)
  129. ON_COMMAND(IDM_GREEN, OnSkinGreen)
  130. ON_COMMAND(IDM_WHITE, OnSkinWhite)
  131. ON_COMMAND(IDM_EXIT, OnMenuExit)
  132. ON_COMMAND(IDM_LSP_RULE, OnMenuLspRule)
  133. ON_COMMAND(IDM_KER_RULE, OnMenuKerRule)
  134. ON_COMMAND(IDM_CUTDOWN_NETWORK, OnMenuCutdownNetwork)
  135. ON_COMMAND(IDM_STOP_PROTECT, OnMenuStopProtect)
  136. //}}AFX_MSG_MAP
  137. ON_MESSAGE(PM_QUERY_ACL_NOTIFY, OnQueryAcl)
  138. ON_MESSAGE(PM_SESSION_NOTIFY, OnSessionNotify)
  139. ON_MESSAGE(QUERY_DLG_DESTROY, OnQueryDlgDestroy)
  140. ON_MESSAGE(UPDATE_ACCESS_CTRL_LIST, OnUpdateAccessCtrlList)
  141. ON_MESSAGE(UPDATE_PACKET_MONITOR_LIST, OnUpdatePacketMonitorList)
  142. ON_MESSAGE(UPDATE_WEBSITE_LIST, OnUpdateWebSiteList)
  143. ON_MESSAGE(UPDATE_IPRULE_LIST, OnUpdateIPRuleList)
  144. ON_COMMAND(IDM_SHOW_WINDOW,ShowMainWindow)
  145. ON_MESSAGE(WM_TO_TRAY,OnShowTask)
  146. END_MESSAGE_MAP()
  147. /////////////////////////////////////////////////////////////////////////////
  148. // CMyFireWallDlg message handlers
  149. BOOL CMyFireWallDlg::OnInitDialog()
  150. {
  151. CDialog::OnInitDialog();
  152. // Add "About..." menu item to system menu.
  153. // IDM_ABOUTBOX must be in the system command range.
  154. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  155. ASSERT(IDM_ABOUTBOX < 0xF000);
  156. CMenu* pSysMenu = GetSystemMenu(FALSE);
  157. if (pSysMenu != NULL)
  158. {
  159. CString strAboutMenu;
  160. strAboutMenu.LoadString(IDS_ABOUTBOX);
  161. if (!strAboutMenu.IsEmpty())
  162. {
  163. pSysMenu->AppendMenu(MF_SEPARATOR);
  164. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  165. }
  166. }
  167. // Set the icon for this dialog.  The framework does this automatically
  168. //  when the application's main window is not a dialog
  169. SetIcon(m_hIcon, TRUE); // Set big icon
  170. SetIcon(m_hIcon, FALSE); // Set small icon
  171. // TODO: Add extra initialization here
  172. // 设置 DLL 对应的主对话框句柄
  173. TCHAR szPath[256];
  174. ::GetModuleFileName(NULL, szPath, 256);
  175. g_pIoControl->SetInstance(m_hWnd, szPath);
  176. // 保存主对话框句柄到一个全局变量
  177. g_hMainWnd = m_hWnd;
  178. m_pQueryDlg = NULL;
  179. m_pStartQueryDlg = NULL;
  180. m_Sheet.AddPage(&m_WorkStatusPage);
  181. m_Sheet.AddPage(&m_AppMonitorPage);
  182. m_Sheet.AddPage(&m_AccessCtrlPage);
  183. m_Sheet.AddPage(&m_PacketMonitorPage);
  184. m_Sheet.AddPage(&m_IPRulePage);
  185. m_Sheet.AddPage(&m_WebSiteSettingPage);
  186. m_Sheet.AddPage(&m_ARPRulePage);
  187. m_Sheet.Create(this,WS_CHILD|WS_VISIBLE,0);
  188. m_Sheet.ModifyStyleEx(0,WS_EX_CONTROLPARENT);
  189. m_Sheet.ModifyStyle(0,WS_TABSTOP);
  190. CRect rect;
  191. m_Sheet.GetWindowRect(&rect);
  192. ScreenToClient(&rect);
  193. m_Sheet.SetWindowPos(NULL,rect.left-4,rect.top-5,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
  194. m_Sheet.SetActivePage(&m_ARPRulePage);
  195. m_Sheet.SetActivePage(&m_WebSiteSettingPage);
  196. m_Sheet.SetActivePage(&m_IPRulePage);
  197. m_Sheet.SetActivePage(&m_PacketMonitorPage);
  198. m_Sheet.SetActivePage(&m_AccessCtrlPage);
  199. m_Sheet.SetActivePage(&m_AppMonitorPage);
  200. m_Sheet.SetActivePage(&m_WorkStatusPage);
  201. // 显示应用层规则到 AccessCtrlList
  202. OnUpdateAccessCtrlList(0, 0);
  203. // 显示核心层规则到 PacketMonitorList
  204. OnUpdatePacketMonitorList(0, 0);
  205. // 显示网站黑名单到 WebSiteList
  206. OnUpdateWebSiteList(0, 0);
  207. // 获得日志文件路径
  208. char szPathName[256];
  209. sprintf(szPathName, ("%s%s"), strCurrentPath, ("MyFireWall.log"));
  210. // 打开日志文件
  211. if((g_pLogFile = fopen(szPathName, "a")) == NULL)
  212. {
  213. AfxMessageBox(_T("MyFireWall.exe 打开日志文件出错!"));
  214. }
  215. return TRUE;  // return TRUE  unless you set the focus to a control
  216. }
  217. void CMyFireWallDlg::OnSysCommand(UINT nID, LPARAM lParam)
  218. {
  219. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  220. {
  221. CAboutDlg dlgAbout;
  222. dlgAbout.DoModal();
  223. }
  224. else
  225. {
  226. CDialog::OnSysCommand(nID, lParam);
  227. }
  228. }
  229. // If you add a minimize button to your dialog, you will need the code below
  230. //  to draw the icon.  For MFC applications using the document/view model,
  231. //  this is automatically done for you by the framework.
  232. void CMyFireWallDlg::OnPaint() 
  233. {
  234. // 设置 DLL 对应的主对话框句柄
  235. if (IsIconic())
  236. {
  237. CPaintDC dc(this); // device context for painting
  238. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  239. // Center icon in client rectangle
  240. int cxIcon = GetSystemMetrics(SM_CXICON);
  241. int cyIcon = GetSystemMetrics(SM_CYICON);
  242. CRect rect;
  243. GetClientRect(&rect);
  244. int x = (rect.Width() - cxIcon + 1) / 2;
  245. int y = (rect.Height() - cyIcon + 1) / 2;
  246. // Draw the icon
  247. dc.DrawIcon(x, y, m_hIcon);
  248. }
  249. else
  250. {
  251. CDialog::OnPaint();
  252. }
  253. }
  254. // The system calls this to obtain the cursor to display while the user drags
  255. //  the minimized window.
  256. HCURSOR CMyFireWallDlg::OnQueryDragIcon()
  257. {
  258. return (HCURSOR) m_hIcon;
  259. }
  260. void CMyFireWallDlg::OnSkinBlue() 
  261. {
  262. // TODO: Add your command handler code here
  263. LoadSkin("Minimized.ssk");
  264. // 保存日志文件
  265. SaveLogFile("用户将防火墙皮肤设置为蓝色。");
  266. }
  267. void CMyFireWallDlg::OnSkinGreen() 
  268. {
  269. // TODO: Add your command handler code here
  270. LoadSkin("Topax.ssk");
  271. // 保存日志文件
  272. SaveLogFile("用户将防火墙皮肤设置为绿色。");
  273. }
  274. void CMyFireWallDlg::OnSkinWhite() 
  275. {
  276. // TODO: Add your command handler code here
  277. LoadSkin("dogmax.ssk");
  278. // 保存日志文件
  279. SaveLogFile("用户将防火墙皮肤设置为白色。");
  280. }
  281. void CMyFireWallDlg::OnSessionNotify(WPARAM wParam, LPARAM lParam)
  282. {
  283. SESSION session;
  284. //获取Dll发送来的 Session
  285. g_pIoControl->GetSession(&session, wParam);
  286. //解析出消息类型
  287. int nCode = lParam;
  288. switch(nCode)
  289. {
  290. case CODE_CHANGE_SESSION: //一个会话的属性改变了
  291. m_AppMonitorPage.AddSession(&session);
  292. break;
  293. case CODE_DELETE_SESSION: //一个会话被删除
  294. m_AppMonitorPage.DeleteSession(&session, FALSE);
  295. break;
  296. case CODE_APP_EXIT: //一个应用程序退出,我们要删除此应用程序的所有会话
  297. m_AppMonitorPage.DeleteSession(&session,TRUE);
  298. break;
  299. }
  300. }
  301. void CMyFireWallDlg::OnQueryAcl(WPARAM wParam, LPARAM lParam)
  302. {
  303. CQueryDlg *pQueryDlg = new CQueryDlg;
  304. /*******************************************************************************************/
  305. CRect DlgRect,ScreenRect;
  306. SystemParametersInfo(SPI_GETWORKAREA,0,&ScreenRect,0); //检索工作区大小,工作区是指没有被任务遮盖的屏幕部分。
  307. // 传递应用程序会话
  308. g_pIoControl->GetQuerySession(&pQueryDlg->m_Session, wParam);
  309. pQueryDlg->m_nIndex = wParam;
  310. pQueryDlg->Create(IDD_QUERY_DLG);
  311. pQueryDlg->GetWindowRect(&DlgRect);
  312. pQueryDlg->SetWindowPos(&wndTopMost,ScreenRect.Width()-DlgRect.Width(),ScreenRect.Height()-DlgRect.Height(),DlgRect.Width(),DlgRect.Height(),SWP_NOSIZE);
  313. pQueryDlg->m_pNext = NULL;
  314. /*******************************************************************************************/
  315. if (m_pStartQueryDlg == NULL)
  316. {
  317. m_pStartQueryDlg = pQueryDlg;
  318. m_pQueryDlg  =  pQueryDlg;
  319. // 使用淡出效果显示对话框
  320. // AnimateWindow(dlg.m_hWnd,1000,AW_ACTIVATE|AW_CENTER|AW_BLEND);
  321. m_pStartQueryDlg->ShowWindow(SW_SHOW);
  322. }
  323. else
  324. {
  325. m_pQueryDlg->m_pNext = pQueryDlg;
  326. m_pQueryDlg = pQueryDlg;
  327. }
  328. }
  329. void CMyFireWallDlg::OnQueryDlgDestroy(WPARAM wParam, LPARAM lParam)
  330. {
  331. CQueryDlg *pTemp = m_pStartQueryDlg;
  332. m_pStartQueryDlg = m_pStartQueryDlg->m_pNext;
  333. delete pTemp;
  334. if (m_pStartQueryDlg != NULL)
  335. {
  336. // 显示下一个询问对话框
  337. m_pStartQueryDlg->ShowWindow(SW_SHOW);
  338. }
  339. }
  340. void CMyFireWallDlg::OnUpdateAccessCtrlList(WPARAM wParam, LPARAM lParam)
  341. {
  342. CString ss;
  343. ss.Format(L"DEBUG输出: ulLspRuleCount = %d",g_RuleFile.m_header.ulLspRuleCount);
  344. m_AccessCtrlPage.SetDlgItemText(IDC_DEBUG, ss);
  345. int nItem;
  346. CString strTemp;
  347. m_AccessCtrlPage.ImageList.DeleteImageList();
  348. m_AccessCtrlPage.ImageList.Create(18, 18, ILC_COLOR8, 30, 10);
  349. m_AccessCtrlPage.m_AccessCtrlList.SetImageList(&m_AccessCtrlPage.ImageList, LVSIL_SMALL);
  350. //清除原来的显示内容
  351. m_AccessCtrlPage.m_AccessCtrlList.DeleteAllItems();
  352. for(int i=0; i < (int)g_RuleFile.m_header.ulLspRuleCount; i++)
  353. {
  354. //设置应用程序的图标
  355. SHFILEINFOW stFileInfo;
  356. if( ::SHGetFileInfo(g_RuleFile.m_pLspRules[i].szApplication, 0, &stFileInfo, sizeof(stFileInfo), SHGFI_ICON)) 
  357. {
  358. m_AccessCtrlPage.ImageList.Add(stFileInfo.hIcon);
  359. }
  360. //设置应用程序名称
  361. nItem = m_AccessCtrlPage.m_AccessCtrlList.InsertItem(i, GetFileName(g_RuleFile.m_pLspRules[i].szApplication), i);
  362. //设置采取的动作
  363. if(g_RuleFile.m_pLspRules[i].ucAction == RULE_ACTION_PASS)
  364. {
  365. strTemp = L" 允许 ";
  366. }
  367. else if(g_RuleFile.m_pLspRules[i].ucAction == RULE_ACTION_DENY)
  368. {
  369. strTemp = L" 禁止 ";
  370. }
  371. m_AccessCtrlPage.m_AccessCtrlList.SetItemText(nItem, 1, strTemp);
  372. //设置协议类型
  373. switch(g_RuleFile.m_pLspRules[i].ucServiceType)
  374. {
  375. case RULE_SERVICE_TYPE_ALL:
  376. strTemp.Format(L"%s",L"所有");
  377. break;
  378. case RULE_SERVICE_TYPE_TCP:
  379. strTemp.Format(L"%s",L"TCP");
  380. break;
  381. case RULE_SERVICE_TYPE_UDP:
  382. strTemp.Format(L"%s",L"UDP");
  383. break;
  384. case RULE_SERVICE_TYPE_FTP:
  385. strTemp.Format(L"%s",L"FTP");
  386. break;
  387. case RULE_SERVICE_TYPE_TELNET:
  388. strTemp.Format(L"%s",L"TELNET");
  389. break;
  390. case RULE_SERVICE_TYPE_HTTP:
  391. strTemp.Format(L"%s",L"HTTP");
  392. break;
  393. case RULE_SERVICE_TYPE_NNTP:
  394. strTemp.Format(L"%s",L"NNTP");
  395. break;
  396. case RULE_SERVICE_TYPE_SMTP:
  397. strTemp.Format(L"%s",L"SMTP");
  398. break;
  399. }
  400. m_AccessCtrlPage.m_AccessCtrlList.SetItemText(nItem, 2, strTemp);
  401. //设置应用程序路径
  402. m_AccessCtrlPage.m_AccessCtrlList.SetItemText(nItem, 3, g_RuleFile.m_pLspRules[i].szApplication);
  403. //设置应用程序的描述
  404. m_AccessCtrlPage.m_AccessCtrlList.SetItemText(nItem, 4, g_RuleFile.m_pLspRules[i].sDemo);
  405. }
  406. }
  407. void CMyFireWallDlg::OnUpdatePacketMonitorList(WPARAM wParam, LPARAM lParam)
  408. {
  409. int nItem;
  410. WCHAR wszTemp[6];
  411. BYTE *pByte = new BYTE;
  412. CString strIP, strTemp;
  413. PPassthruFilter pItem = new PassthruFilter;
  414. //清除原来的显示内容
  415. m_PacketMonitorPage.m_PacketMonitorList.DeleteAllItems();
  416. for (int i = 0; i < (int)g_RuleFile.m_header.ulKerRuleCount; i++)
  417. {
  418. pItem = &g_RuleFile.m_pKerRules[i];
  419. // 源IP地址
  420. pByte = (BYTE *)&pItem->sourceIP;
  421. strIP.Format(L"%d.%d.%d.%d", pByte[3], pByte[2], pByte[1], pByte[0]);
  422. strTemp = (pItem->sourceIP == 0)? L"所有" : strIP;
  423. nItem = m_PacketMonitorPage.m_PacketMonitorList.InsertItem(i, strTemp);
  424. /*
  425. // 源IP掩码
  426. pByte = (BYTE *)&pItem->sourceMask;
  427. strTemp.Format(L"%d.%d.%d.%d", pByte[3], pByte[2], pByte[1], pByte[0]);
  428. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 1, strTemp);
  429. */
  430. // 源端口号
  431. strTemp = (pItem->sourcePort == 0)? L"所有" : ::_itot(pItem->sourcePort, wszTemp, 10);
  432. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 1, strTemp);
  433. // 目的IP地址
  434. pByte = (BYTE *)&pItem->destinationIP;
  435. strIP.Format(L"%d.%d.%d.%d", pByte[3], pByte[2], pByte[1], pByte[0]);
  436. strTemp = (pItem->destinationIP == 0)? L"所有" : strIP;
  437. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 2, strTemp);
  438. /*
  439. // 目的IP掩码
  440. pByte = (BYTE *)&pItem->destinationMask;
  441. strTemp.Format(L"%d.%d.%d.%d", pByte[3], pByte[2], pByte[1], pByte[0]);
  442. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 4, strTemp);
  443. */
  444. // 目的端口号
  445. strTemp = (pItem->destinationPort == 0)? L"所有" : ::_itot(pItem->destinationPort, wszTemp, 10);
  446. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 3, strTemp);
  447. // 协议
  448. switch(pItem->protocol)
  449. {
  450. case 1:
  451. strTemp = L"ICMP";
  452. break;
  453. case 6:
  454. strTemp = L"TCP";
  455. break;
  456. case 17:
  457. strTemp = L"UDP";
  458. break;
  459. default:
  460. strTemp = L"所有";
  461. }
  462. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 4, strTemp);
  463. //动作
  464. strTemp = pItem->bDrop? L"禁止" : L"允许";
  465. m_PacketMonitorPage.m_PacketMonitorList.SetItemText(nItem, 5, strTemp);
  466. }
  467. }
  468. void CMyFireWallDlg::OnUpdateWebSiteList(WPARAM wParam, LPARAM lParam)
  469. {
  470. int nItem;
  471. int nIndex = 0;
  472. BYTE *pByte = new BYTE;
  473. CString strIP, strTemp;
  474. PPassthruFilter pItem = new PassthruFilter;
  475. //清除原来的显示内容
  476. m_WebSiteSettingPage.m_WebSiteList.DeleteAllItems();
  477. for (int i = 0; i < (int)g_RuleFile.m_header.ulKerRuleCount; i++)
  478. {
  479. pItem = &g_RuleFile.m_pKerRules[i];
  480. if (_tcscmp(pItem->szWebSiteURL, L"") == 0)
  481. {
  482. continue ;
  483. }
  484. // 网站URL
  485. nItem = m_WebSiteSettingPage.m_WebSiteList.InsertItem(nIndex, pItem->szWebSiteURL);
  486. // 网站IP地址
  487. pByte = (BYTE *)&pItem->destinationIP;
  488. strIP.Format(L"%d.%d.%d.%d", pByte[3], pByte[2], pByte[1], pByte[0]);
  489. strTemp = (pItem->destinationIP == 0)? L"所有" : strIP;
  490. m_WebSiteSettingPage.m_WebSiteList.SetItemText(nItem, 1, strTemp);
  491. // 网站描述信息
  492. m_WebSiteSettingPage.m_WebSiteList.SetItemText(nItem, 2, pItem->szDescription);
  493. nIndex++;
  494. }
  495. }
  496. void CMyFireWallDlg::OnUpdateIPRuleList(WPARAM wParam, LPARAM lParam)
  497. {
  498. int nItem;
  499. CString strTemp;
  500. // 应用 CImageList 从另一种角度上增加 IPRuleList 的列宽
  501. CImageList ImageList;
  502. ImageList.Create(1, 18, ILC_COLOR8, 0, 0);
  503. m_IPRulePage.m_IPRuleList.SetImageList(&ImageList, LVSIL_SMALL);
  504. // 删除以前全部内容
  505. m_IPRulePage.m_IPRuleList.DeleteAllItems();
  506. // Ping入规则
  507. nItem = m_IPRulePage.m_IPRuleList.InsertItem(0, L"Ping入");
  508. strTemp = g_RuleFile.m_pIPRules[0].bState? L" 允许 " : L" 拒绝 ";
  509. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 1, strTemp);
  510. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 2, L"ICMP");
  511. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 3, L"任意");
  512. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 4, g_RuleFile.m_pIPRules[0].description);
  513. // Ping出规则
  514. nItem = m_IPRulePage.m_IPRuleList.InsertItem(1, L"Ping出");
  515. strTemp = g_RuleFile.m_pIPRules[1].bState? L" 允许 " : L" 拒绝 ";
  516. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 1, strTemp);
  517. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 2, L"ICMP");
  518. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 3, L"任意");
  519. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 4, g_RuleFile.m_pIPRules[1].description);
  520. // RPC(Remote Procedurce call: 远程过程调用)规则
  521. nItem = m_IPRulePage.m_IPRuleList.InsertItem(2, L"RPC(远程过程调用)");
  522. strTemp = g_RuleFile.m_pIPRules[2].bState? L" 允许 " : L" 拒绝 ";
  523. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 1, strTemp);
  524. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 2, L"TCP");
  525. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 3, L"135");
  526. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 4, g_RuleFile.m_pIPRules[2].description);
  527. // DNS(域名服务)规则
  528. nItem = m_IPRulePage.m_IPRuleList.InsertItem(3, L"DNS(域名服务)");
  529. strTemp = g_RuleFile.m_pIPRules[3].bState? L" 允许 " : L" 拒绝 ";
  530. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 1, strTemp);
  531. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 2, L"UDP");
  532. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 3, L"53");
  533. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 4, g_RuleFile.m_pIPRules[3].description);
  534. // 局域网共享规则
  535. nItem = m_IPRulePage.m_IPRuleList.InsertItem(4, L"局域网共享");
  536. strTemp = g_RuleFile.m_pIPRules[4].bState? L" 允许 " : L" 拒绝 ";
  537. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 1, strTemp);
  538. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 2, L"TCP");
  539. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 3, L"139,445");
  540. m_IPRulePage.m_IPRuleList.SetItemText(nItem, 4, g_RuleFile.m_pIPRules[4].description);
  541. }
  542. void CMyFireWallDlg::OnMenuCutdownNetwork() 
  543. {
  544. // TODO: Add your command handler code here
  545. CString strItem;
  546. GetMenu()->GetMenuString(IDM_CUTDOWN_NETWORK, strItem, MF_BYCOMMAND);
  547. if (strItem == L"断开网络")
  548. {
  549. int nWorkMode = IM_DENY_ALL;
  550. PtSetWorkMode(&nWorkMode);
  551. // 显示“连接网络”
  552. GetMenu()->GetSubMenu(0)->ModifyMenu(IDM_CUTDOWN_NETWORK, MF_BYCOMMAND, IDM_CUTDOWN_NETWORK, L"连接网络");
  553. // 在“工作状态”标签上改变核心层工作模式
  554. m_WorkStatusPage.SetDlgItemText(IDC_KER_MODE, L"禁止所有");
  555. // 保存日志文件
  556. SaveLogFile("用户断开网络。");
  557. else
  558. {
  559. int nWorkMode = g_RuleFile.m_header.ucKerWorkMode;
  560. PtSetWorkMode(&nWorkMode);
  561. // 显示“断开网络”
  562. GetMenu()->GetSubMenu(0)->ModifyMenu(IDM_CUTDOWN_NETWORK, MF_BYCOMMAND, IDM_CUTDOWN_NETWORK, L"断开网络");
  563. // 在“工作状态”标签上改变核心层工作模式
  564. m_WorkStatusPage.UpdateWorkMode();
  565. // 保存日志文件
  566. SaveLogFile("用户连接网络。");
  567. }
  568. }
  569. void CMyFireWallDlg::OnMenuStopProtect()
  570. {
  571. // TODO: Add your command handler code here
  572. CString strItem;
  573. GetMenu()->GetMenuString(IDM_STOP_PROTECT, strItem, MF_BYCOMMAND);
  574. if (strItem == L"停止保护")
  575. {
  576. // 应用层放行所有
  577. g_pIoControl->SetWorkMode(PF_PASS_ALL);
  578. // 驱动层放行所有
  579. int nWorkMode = IM_PASS_ALL;
  580. PtSetWorkMode(&nWorkMode);
  581. // 显示“开启保护”
  582. GetMenu()->GetSubMenu(0)->ModifyMenu(IDM_STOP_PROTECT, MF_BYCOMMAND, IDM_STOP_PROTECT, L"开启保护");
  583. // 在“工作状态”标签上改变应用层和核心层工作模式
  584. m_WorkStatusPage.SetDlgItemText(IDC_LSP_MODE, L"允许所有");
  585. m_WorkStatusPage.SetDlgItemText(IDC_KER_MODE, L"允许所有");
  586. // 保存日志文件
  587. SaveLogFile("用户停止防火墙保护。");
  588. else
  589. {
  590. // 应用层过滤所有
  591. g_pIoControl->SetWorkMode(g_RuleFile.m_header.ucLspWorkMode);
  592. // 驱动层过滤所有
  593. int nWorkMode = g_RuleFile.m_header.ucKerWorkMode;
  594. PtSetWorkMode(&nWorkMode);
  595. // 显示“停止保护”
  596. GetMenu()->GetSubMenu(0)->ModifyMenu(IDM_STOP_PROTECT, MF_BYCOMMAND, IDM_STOP_PROTECT, L"停止保护");
  597. // 在“工作状态”标签上还原应用层和核心层工作模式
  598. m_WorkStatusPage.UpdateWorkMode();
  599. // 保存日志文件
  600. SaveLogFile("用户开启防火墙保护。");
  601. }
  602. }
  603. void CMyFireWallDlg::OnMenuExit() 
  604. {
  605. // TODO: Add your command handler code here
  606. RemoveProvider();
  607. // 保存日志文件
  608. SaveLogFile("用户关闭防火墙。");
  609. exit(0);
  610. }
  611. void CMyFireWallDlg::OnMenuLspRule() 
  612. {
  613. // TODO: Add your command handler code here
  614. m_Sheet.SetActivePage(&m_AccessCtrlPage);
  615. }
  616. void CMyFireWallDlg::OnMenuKerRule() 
  617. {
  618. // TODO: Add your command handler code here
  619. m_Sheet.SetActivePage(&m_PacketMonitorPage);
  620. }
  621. void CMyFireWallDlg::OnCancel() 
  622. {
  623. // TODO: Add extra cleanup here
  624. nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
  625. nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
  626. nid.hWnd=this->m_hWnd;
  627. nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
  628. nid.uID=IDR_MAINFRAME;
  629. nid.uCallbackMessage=WM_TO_TRAY;
  630. wsprintf(nid.szTip, _T("%s"), _T("MyFireWall 正在保护您的网络……"));
  631. Shell_NotifyIcon(NIM_ADD,&nid);
  632. ShowWindow(SW_HIDE);
  633. }
  634. void CMyFireWallDlg::OnShowTask(WPARAM wParam, LPARAM lParam)
  635. {
  636. UINT uID; //发出该消息的图标的ID
  637. UINT uMouseMsg; //鼠标动作
  638. uID=(UINT) wParam;
  639. uMouseMsg=(UINT) lParam;
  640. if(uID!=IDR_MAINFRAME)
  641. {
  642. return;
  643. }
  644. switch(uMouseMsg)
  645. {
  646. case WM_LBUTTONDBLCLK: 
  647. ShowWindow(SW_SHOW);
  648. break;
  649. case WM_RBUTTONUP:
  650. POINT point;
  651. //得到鼠标坐标
  652. GetCursorPos(&point);
  653. //创建弹出菜单
  654. CMenu menu;
  655. menu.CreatePopupMenu();
  656. //增加菜单项“启动”,点击则发送消息WM_DESTROY给主窗口,打开主界面。
  657. menu.AppendMenu(MF_STRING, IDM_SHOW_WINDOW, _T("  启 动  "));
  658. //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口,将程序结束。
  659. menu.AppendMenu(MF_STRING,IDM_EXIT, _T("  关 闭  "));
  660. //将程序设置为前端窗口
  661. SetForegroundWindow();
  662. //确定弹出菜单的位置
  663. menu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
  664. //资源回收
  665. HMENU hMenu=menu.Detach();
  666. menu.DestroyMenu();
  667. break;
  668. }
  669. return;
  670. }
  671. void CMyFireWallDlg::ShowMainWindow()
  672. {
  673. ShowWindow(SW_SHOW);
  674. }