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

Visual C++

  1. // AccessCtrlPage.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyFireWall.h"
  5. #include "AccessCtrlPage.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. /////////////////////////////////////////////////////////////////////////////
  13. // CAccessCtrlPage property page
  14. IMPLEMENT_DYNCREATE(CAccessCtrlPage, CPropertyPage)
  15. CAccessCtrlPage::CAccessCtrlPage() : CPropertyPage(CAccessCtrlPage::IDD)
  16. {
  17. //{{AFX_DATA_INIT(CAccessCtrlPage)
  18. // NOTE: the ClassWizard will add member initialization here
  19. //}}AFX_DATA_INIT
  20. }
  21. CAccessCtrlPage::~CAccessCtrlPage()
  22. {
  23. }
  24. void CAccessCtrlPage::DoDataExchange(CDataExchange* pDX)
  25. {
  26. CPropertyPage::DoDataExchange(pDX);
  27. //{{AFX_DATA_MAP(CAccessCtrlPage)
  28. DDX_Control(pDX, IDC_ACCESS_CTRL_LIST, m_AccessCtrlList);
  29. //}}AFX_DATA_MAP
  30. }
  31. BEGIN_MESSAGE_MAP(CAccessCtrlPage, CPropertyPage)
  32. //{{AFX_MSG_MAP(CAccessCtrlPage)
  33. ON_NOTIFY(NM_DBLCLK, IDC_ACCESS_CTRL_LIST, OnDblclkAccessCtrlList)
  34. ON_NOTIFY(NM_RCLICK, IDC_ACCESS_CTRL_LIST, OnRclickAccessCtrlList)
  35. ON_COMMAND(IDM_ACL_DELETE, OnAclDeleteRule)
  36. ON_COMMAND(IDM_ACL_MODIFY, OnAclModifyRule)
  37. //}}AFX_MSG_MAP
  38. END_MESSAGE_MAP()
  39. /////////////////////////////////////////////////////////////////////////////
  40. // CAccessCtrlPage message handlers
  41. BOOL CAccessCtrlPage::OnInitDialog() 
  42. {
  43. CPropertyPage::OnInitDialog();
  44. // TODO: Add extra initialization here
  45. // 初始化 AccessCtrlList 的设置和风格
  46. m_AccessCtrlList.InsertColumn(0,L"程序名称",LVCFMT_LEFT,sizeof(L"应用程序")*12,-1);
  47. m_AccessCtrlList.InsertColumn(1,L"状态",LVCFMT_LEFT,sizeof(L"动作")*8,-1);
  48. m_AccessCtrlList.InsertColumn(2,L"类型",LVCFMT_LEFT,sizeof(L"类型")*6,-1);
  49. m_AccessCtrlList.InsertColumn(3,L"应用程序路径",LVCFMT_LEFT,sizeof(L"应用程序路径")*18,-1);
  50. m_AccessCtrlList.InsertColumn(4,L"描述",LVCFMT_LEFT,sizeof(L"描述")*18,-1);
  51. m_AccessCtrlList.ModifyStyle(LVS_TYPEMASK,LVS_REPORT);
  52. m_AccessCtrlList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
  53. return TRUE;  // return TRUE unless you set the focus to a control
  54.               // EXCEPTION: OCX Property Pages should return FALSE
  55. }
  56. void CAccessCtrlPage::OnDblclkAccessCtrlList(NMHDR* pNMHDR, LRESULT* pResult) 
  57. {
  58. // TODO: Add your control notification handler code here
  59. LPNMLISTVIEW pNMListView = (NM_LISTVIEW *)pNMHDR;
  60.     //是否点击了有效的项目。
  61.     if (pNMListView->iItem != -1) //点击了有效的项目
  62.     {
  63.         if (pNMListView->iSubItem == 1) // 双击列1时,修改应用程序的状态,允许 --> 禁止  或者  禁止 --> 允许
  64.         {
  65. OnAclModifyRule();
  66.         }
  67.     }
  68. *pResult = 0;
  69. }
  70. void CAccessCtrlPage::OnRclickAccessCtrlList(NMHDR* pNMHDR, LRESULT* pResult) 
  71. {
  72. // TODO: Add your control notification handler code here
  73. CMenu menu,*pSubMenu;
  74. menu.LoadMenu(IDR_ACL_MENU);
  75. pSubMenu=menu.GetSubMenu(0);
  76. // 根据应用程序的状态来修改右键菜单的内容
  77. CString strAction;
  78. strAction = m_AccessCtrlList.GetItemText(m_AccessCtrlList.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED),1);
  79. if (strAction == " 允许 ")
  80. {
  81. pSubMenu->ModifyMenu(IDM_ACL_MODIFY, MF_BYCOMMAND, IDM_ACL_MODIFY, L" 禁止 ");
  82. else
  83. {
  84. pSubMenu->ModifyMenu(IDM_ACL_MODIFY, MF_BYCOMMAND, IDM_ACL_MODIFY, L" 允许 ");
  85. }
  86. CPoint point;
  87. GetCursorPos(&point);
  88. pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
  89. *pResult = 0;
  90. }
  91. void CAccessCtrlPage::OnAclModifyRule() 
  92. {
  93. // TODO: Add your command handler code here
  94. TCHAR szAppPath[MAX_PATH];
  95. // 得到当前选中的进程路径
  96. _tcscpy(szAppPath, m_AccessCtrlList.GetItemText(m_AccessCtrlList.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED),3));
  97. // 修改LSP过滤规则
  98. if(g_RuleFile.ModifyLspRule(szAppPath) == FALSE)
  99. {
  100. return ;
  101. }
  102. // 应用到Dll层
  103. theApp.ApplyLspRules();
  104. char szContent[256];
  105. USES_CONVERSION;
  106. // 修改 AccessCtrlList 上的显示
  107. CString strAction;
  108. strAction = m_AccessCtrlList.GetItemText(m_AccessCtrlList.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED),1);
  109. if (strAction == " 允许 ")
  110. {
  111. strAction = " 禁止 ";
  112. sprintf(szContent, "将程序 %s 对应的应用层规则状态修改为:禁止。", W2A(GetFileName(szAppPath)));
  113. else
  114. {
  115. strAction = " 允许 ";
  116. sprintf(szContent, "将程序 %s 对应的应用层规则状态修改为:允许。", W2A(GetFileName(szAppPath)));
  117. }
  118. m_AccessCtrlList.SetItemText(m_AccessCtrlList.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED), 1, strAction);
  119. // 保存日志
  120. SaveLogFile(szContent);
  121. }
  122. void CAccessCtrlPage::OnAclDeleteRule()
  123. {
  124. // TODO: Add your command handler code here
  125. // 获得选中的行号
  126. int nItem = m_AccessCtrlList.GetNextItem(-1,LVNI_ALL|LVNI_SELECTED);
  127. // 删除规则
  128. g_RuleFile.DelLspRule(nItem);
  129. // 将规则保存到文件
  130. g_RuleFile.SaveRules();
  131. // 将规则在 AccessCtrlList 控件上显示出来
  132. ::PostMessage(g_hMainWnd, UPDATE_ACCESS_CTRL_LIST, 0, 0);
  133. // 将规则应用到Dll模块
  134. theApp.ApplyLspRules();
  135. // 保存日志文件
  136. TCHAR szAppPath[MAX_PATH];
  137. // 得到当前选中的进程路径
  138. _tcscpy(szAppPath, m_AccessCtrlList.GetItemText(nItem,3));
  139. char szContent[256];
  140. USES_CONVERSION;
  141. sprintf(szContent, "删除程序 %s 对应的应用层过滤规则。", W2A(GetFileName(szAppPath)));
  142. SaveLogFile(szContent);
  143. }