WorkStatusPage.cpp
上传用户:zhuzhu0204
上传日期:2020-07-13
资源大小:13165k
文件大小:11k
源码类别:
防火墙与安全工具
开发平台:
Visual C++
- // WorkStatusPage.cpp : implementation file
- //
- #include "stdafx.h"
- #include "MyFireWall.h"
- #include "WorkStatusPage.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- #define MODIFY_LSP_MODE 1
- #define MODIFY_KER_MODE 2
- #define START_X 70
- #define START_Y 370
- #define UNIT_LENGTH 3
- #define UNIT_HEIGHT 1
- extern CMyFireWallApp theApp;
- /////////////////////////////////////////////////////////////////////////////
- // CWorkStatusPage property page
- IMPLEMENT_DYNCREATE(CWorkStatusPage, CPropertyPage)
- CWorkStatusPage::CWorkStatusPage() : CPropertyPage(CWorkStatusPage::IDD)
- {
- //{{AFX_DATA_INIT(CWorkStatusPage)
- // NOTE: the ClassWizard will add member initialization here
- //}}AFX_DATA_INIT
- }
- CWorkStatusPage::~CWorkStatusPage()
- {
- }
- void CWorkStatusPage::DoDataExchange(CDataExchange* pDX)
- {
- CPropertyPage::DoDataExchange(pDX);
- //{{AFX_DATA_MAP(CWorkStatusPage)
- // NOTE: the ClassWizard will add DDX and DDV calls here
- //}}AFX_DATA_MAP
- }
- BEGIN_MESSAGE_MAP(CWorkStatusPage, CPropertyPage)
- //{{AFX_MSG_MAP(CWorkStatusPage)
- ON_BN_CLICKED(IDC_LSP_MODE, OnModifyLspMode)
- ON_COMMAND(IDM_DENY_MODE, OnMenuDenyMode)
- ON_COMMAND(IDM_FILTER_MODE, OnMenuFilterMode)
- ON_COMMAND(IDM_PASS_MODE, OnMenuPassMode)
- ON_BN_CLICKED(IDC_KER_MODE, OnModifyKerMode)
- ON_WM_PAINT()
- ON_WM_TIMER()
- //}}AFX_MSG_MAP
- END_MESSAGE_MAP()
- /////////////////////////////////////////////////////////////////////////////
- // CWorkStatusPage message handlers
- BOOL CWorkStatusPage::OnInitDialog()
- {
- CPropertyPage::OnInitDialog();
- // TODO: Add extra initialization here
- m_nSelected = 0; // 这是对于菜单项的操作,设为0表示开始时既不修改应用层模式(对应 1),也不修改核心层模式(对应 2)
- UpdateWorkMode();
- for (int i=0; i<MAX_COUNTS; i++)
- {
- m_nSendFlowRate[i] = 0;
- m_nRecvFlowRate[i] = 0;
- m_nTotalFlowRate[i] = 0;
- }
- SetTimer(1, 1000, 0);
- return TRUE; // return TRUE unless you set the focus to a control
- // EXCEPTION: OCX Property Pages should return FALSE
- }
- void CWorkStatusPage::UpdateWorkMode()
- {
- // 应用层工作模式
- switch (g_RuleFile.m_header.ucLspWorkMode)
- {
- case PF_PASS_ALL:
- SetDlgItemText(IDC_LSP_MODE, L"允许所有");
- break;
- case PF_QUERY_ALL:
- SetDlgItemText(IDC_LSP_MODE, L"过滤所有");
- break;
- case PF_DENY_ALL:
- SetDlgItemText(IDC_LSP_MODE, L"禁止所有");
- break;
- }
- // 核心层工作模式
- switch (g_RuleFile.m_header.ucKerWorkMode)
- {
- case IM_PASS_ALL:
- SetDlgItemText(IDC_KER_MODE, L"允许所有");
- break;
- case IM_START_FILTER:
- SetDlgItemText(IDC_KER_MODE, L"过滤所有");
- break;
- case IM_DENY_ALL:
- SetDlgItemText(IDC_KER_MODE, L"禁止所有");
- break;
- }
- }
- void CWorkStatusPage::OnModifyLspMode()
- {
- // TODO: Add your control notification handler code here
- m_nSelected = MODIFY_LSP_MODE;
- //创建菜单
- CMenu menu,*pSubMenu;
- menu.LoadMenu(IDR_MODE_MENU);
- pSubMenu=menu.GetSubMenu(0);
- CRect Rect;
- GetDlgItem(IDC_LSP_MODE)->GetWindowRect(&Rect);
- CPoint point(Rect.left, Rect.bottom);
- UINT nCheckItem;
- switch (g_RuleFile.m_header.ucLspWorkMode)
- {
- case PF_PASS_ALL:
- nCheckItem = IDM_PASS_MODE;
- break;
- case PF_QUERY_ALL:
- nCheckItem = IDM_FILTER_MODE;
- break;
- case PF_DENY_ALL:
- nCheckItem = IDM_DENY_MODE;
- break;
- }
- pSubMenu->CheckMenuItem(nCheckItem, MF_BYCOMMAND | MF_CHECKED);
- pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
- }
- void CWorkStatusPage::OnModifyKerMode()
- {
- // TODO: Add your control notification handler code here
- m_nSelected = MODIFY_KER_MODE;
- //创建菜单
- CMenu menu,*pSubMenu;
- menu.LoadMenu(IDR_MODE_MENU);
- pSubMenu=menu.GetSubMenu(0);
- CRect Rect;
- GetDlgItem(IDC_KER_MODE)->GetWindowRect(&Rect);
- CPoint point(Rect.left, Rect.bottom);
- UINT nCheckItem;
- switch (g_RuleFile.m_header.ucKerWorkMode)
- {
- case IM_PASS_ALL:
- nCheckItem = IDM_PASS_MODE;
- break;
- case IM_START_FILTER:
- nCheckItem = IDM_FILTER_MODE;
- break;
- case IM_DENY_ALL:
- nCheckItem = IDM_DENY_MODE;
- break;
- }
- pSubMenu->CheckMenuItem(nCheckItem, MF_BYCOMMAND | MF_CHECKED);
- pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
- }
- void CWorkStatusPage::OnMenuPassMode()
- {
- // TODO: Add your command handler code here
- if (m_nSelected == MODIFY_LSP_MODE)
- {
- g_RuleFile.m_header.ucLspWorkMode = PF_PASS_ALL;
- g_pIoControl->SetWorkMode(PF_PASS_ALL);
- SetDlgItemText(IDC_LSP_MODE, L"允许所有");
- // 保存文件头中的工作模式
- g_RuleFile.SaveRules();
- // 应用到DLL层
- theApp.ApplyLspRules();
- // 将该动作保存到日志文件
- SaveLogFile("将应用层工作模式设置为:“允许所有”。");
- }
- else
- {
- g_RuleFile.m_header.ucKerWorkMode = IM_PASS_ALL;
- int nKerWorkMode = IM_PASS_ALL;
- PtSetWorkMode(&nKerWorkMode);
- SetDlgItemText(IDC_KER_MODE, L"允许所有");
- // 保存文件头中的工作模式
- g_RuleFile.SaveRules();
- // 应用到核心层
- theApp.ApplyKerRules();
- // 将该动作保存到日志文件
- SaveLogFile("将核心层工作模式设置为:“允许所有”。");
- }
- // 还原 nSelected 值
- m_nSelected = 0;
- }
- void CWorkStatusPage::OnMenuFilterMode()
- {
- // TODO: Add your command handler code here
- if (m_nSelected == MODIFY_LSP_MODE)
- {
- g_RuleFile.m_header.ucLspWorkMode = PF_QUERY_ALL;
- g_pIoControl->SetWorkMode(PF_QUERY_ALL);
- SetDlgItemText(IDC_LSP_MODE, L"过滤所有");
- // 保存文件头中的工作模式
- g_RuleFile.SaveRules();
- // 应用到DLL层
- theApp.ApplyLspRules();
- // 将该动作保存到日志文件
- SaveLogFile("将应用层工作模式设置为:“过滤所有”。");
- }
- else
- {
- g_RuleFile.m_header.ucKerWorkMode = IM_START_FILTER;
- int nKerWorkMode = IM_START_FILTER;
- PtSetWorkMode(&nKerWorkMode);
- SetDlgItemText(IDC_KER_MODE, L"过滤所有");
- // 保存文件头中的工作模式
- g_RuleFile.SaveRules();
- // 应用到核心层
- theApp.ApplyKerRules();
- SaveLogFile("将核心层工作模式设置为:“过滤所有”。");
- }
- // 还原 nSelected 值
- m_nSelected = 0;
- }
- void CWorkStatusPage::OnMenuDenyMode()
- {
- // TODO: Add your command handler code here
- if (m_nSelected == MODIFY_LSP_MODE)
- {
- g_RuleFile.m_header.ucLspWorkMode = PF_DENY_ALL;
- g_pIoControl->SetWorkMode(PF_DENY_ALL);
- SetDlgItemText(IDC_LSP_MODE, L"拒绝所有");
- // 保存文件头中的工作模式
- g_RuleFile.SaveRules();
- // 应用到DLL层
- theApp.ApplyLspRules();
- SaveLogFile("将应用层工作模式设置为:“拒绝所有”。");
- }
- else
- {
- g_RuleFile.m_header.ucKerWorkMode = IM_DENY_ALL;
- int nKerWorkMode = IM_DENY_ALL;
- PtSetWorkMode(&nKerWorkMode);
- SetDlgItemText(IDC_KER_MODE, L"拒绝所有");
- // 保存文件头中的工作模式
- g_RuleFile.SaveRules();
- // 应用到核心层
- theApp.ApplyKerRules();
- SaveLogFile("将核心层工作模式设置为:“拒绝所有”。");
- }
- // 还原 nSelected 值
- m_nSelected = 0;
- }
- void CWorkStatusPage::OnPaint()
- {
- CPaintDC dc(this); // device context for painting
- // TODO: Add your message handler code here
- DrawFlowGraph();
- // Do not call CPropertyPage::OnPaint() for painting messages
- }
- void CWorkStatusPage::OnTimer(UINT nIDEvent)
- {
- // TODO: Add your message handler code here and/or call default
- HANDLE hControlDevice = PtOpenControlDevice();
- CIMAdapters adapters;
- if(!adapters.EnumAdapters(hControlDevice))
- return ;
- HANDLE hAdapter;
- PassthruStatistics PassthruStats;
- for(int i=0; i<adapters.m_nAdapters; i++)
- {
- // 打开下层适配器
- hAdapter = PtOpenAdapter(adapters.m_pwszAdapterName[i]);
- if(hAdapter != INVALID_HANDLE_VALUE)
- {
- PassthruStatistics Stats;
- BOOL bRet = PtQueryStatistics(hAdapter, &Stats);
- if(bRet == FALSE)
- {
- AfxMessageBox(L"返回值位 FALSE");
- ::CloseHandle(hAdapter);
- ::CloseHandle(hControlDevice);
- break;
- }
- PassthruStats.nSendFlowRate = Stats.nSendFlowRate;
- PassthruStats.nRecvFlowRate = Stats.nRecvFlowRate;
- PassthruStats.nMPSendPktsCt = Stats.nMPSendPktsCt;
- PassthruStats.nMPSendPktsDropped = Stats.nMPSendPktsDropped;
- PassthruStats.nPTRcvCt = Stats.nPTRcvCt;
- PassthruStats.nPTRcvDropped = Stats.nPTRcvDropped;
- PassthruStats.nPTRcvPktCt = Stats.nPTRcvPktCt;
- PassthruStats.nPTRcvPktDropped = Stats.nPTRcvPktDropped;
- ::CloseHandle(hAdapter);
- }
- }
- CString strFlowRate;
- strFlowRate.Format(L"当前发送流速:n %d kBpsn当前接收流速:n %d KBpsnn发送数据包总数: n %drn 丢弃个数: n %dnn接收数据包总数: n %dn 丢弃个数: n %drn",
- PassthruStats.nSendFlowRate/1024,
- PassthruStats.nRecvFlowRate/1024,
- PassthruStats.nMPSendPktsCt,
- PassthruStats.nMPSendPktsDropped,
- PassthruStats.nPTRcvCt+PassthruStats.nPTRcvPktCt,
- PassthruStats.nPTRcvDropped+PassthruStats.nPTRcvPktDropped
- );
- SetDlgItemText(IDC_FLOW_RATE, strFlowRate);
- for (i=MAX_COUNTS-2; i>=0; i--)
- {
- m_nSendFlowRate[i+1] = m_nSendFlowRate[i];
- m_nRecvFlowRate[i+1] = m_nRecvFlowRate[i];
- m_nTotalFlowRate[i+1] = m_nTotalFlowRate[i];
- }
- m_nSendFlowRate[0] = PassthruStats.nSendFlowRate/1024/3;
- m_nRecvFlowRate[0] = PassthruStats.nRecvFlowRate/1024/3;
- m_nTotalFlowRate[0] = m_nSendFlowRate[0]+m_nRecvFlowRate[0];
- if (m_nSendFlowRate[0]>90)
- {
- m_nSendFlowRate[0] = 90;
- }
- if (m_nRecvFlowRate[0]>90)
- {
- m_nRecvFlowRate[0] = 90;
- }
- if (m_nTotalFlowRate[0]>90)
- {
- m_nTotalFlowRate[0] = 90;
- }
- DrawFlowGraph();
- OnPaint();
- ::CloseHandle(hControlDevice);
- CPropertyPage::OnTimer(nIDEvent);
- }
- void CWorkStatusPage::DrawFlowGraph()
- {
- CClientDC dc(this);
- CRect Rect(70, 70, 370, 370);
- CBrush Brush(RGB(135, 206, 235)); // 天蓝
- dc.FillRect(&Rect, &Brush);
- dc.MoveTo(START_X, 70);
- dc.LineTo(START_X, START_Y);
- dc.LineTo(370, START_Y);
- dc.LineTo(370, 70);
- dc.LineTo(START_X, 70);
- dc.MoveTo(START_X, 170);
- dc.LineTo(370, 170);
- dc.MoveTo(START_X, 270);
- dc.LineTo(370, 270);
- dc.MoveTo(START_X, 80);
- dc.LineTo(START_X+5, 80);
- dc.MoveTo(START_X, 180);
- dc.LineTo(START_X+5, 180);
- dc.MoveTo(START_X, 280);
- dc.LineTo(START_X+5, 280);
- int penWidth = 2;
- CPen NewPen(PS_SOLID, penWidth, RGB(34, 139, 34)); // 森林绿
- dc.SelectObject(&NewPen);
- // 画发送流量
- dc.MoveTo(START_X, START_Y-200-m_nSendFlowRate[0]);
- for (int i=1; i<MAX_COUNTS; i++)
- {
- dc.LineTo(START_X+i*UNIT_LENGTH, START_Y-200-m_nSendFlowRate[i]*UNIT_HEIGHT);
- }
- // 画接收流量
- dc.MoveTo(START_X, START_Y-100-m_nRecvFlowRate[0]);
- for (i=1; i<MAX_COUNTS; i++)
- {
- dc.LineTo(START_X+i*UNIT_LENGTH, START_Y-100-m_nRecvFlowRate[i]*UNIT_HEIGHT);
- }
- // 画总流量
- dc.MoveTo(START_X, START_Y-m_nTotalFlowRate[0]);
- for (i=1; i<MAX_COUNTS; i++)
- {
- dc.LineTo(START_X+i*UNIT_LENGTH, START_Y-m_nTotalFlowRate[i]*UNIT_HEIGHT);
- }
- }