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

Visual C++

  1. // QueryDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "MyFireWall.h"
  5. #include "QueryDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. #define PASS_ALL  1
  12. #define PASS_ONCE 2
  13. #define DENY_ONCE 3
  14. #define DENY_ALL  4
  15. extern CMyFireWallApp theApp;
  16. FileVersion AppVersion; // 保存程序
  17. // 用于时间控制的线程函数
  18. DWORD WINAPI TimeControlThread(LPVOID lpParam)
  19. {
  20. CQueryDlg *pQueryDlg = (CQueryDlg *)lpParam;
  21. // 等待1分钟
  22. for (int i=60; i>0; i--)
  23. {
  24. if (pQueryDlg->m_hWnd == NULL)
  25. {
  26. return ERROR_SUCCESS;
  27. }
  28. pQueryDlg->SetDlgItemInt(IDC_TIME, i);
  29. Sleep(1000);
  30. }
  31. // 向 CQueryDlg 发送销毁对话框信息
  32. ::PostMessage(pQueryDlg->m_hWnd, WM_CLOSE, 0, 0);
  33. return ERROR_SUCCESS;
  34. }
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CQueryDlg dialog
  37. CQueryDlg::CQueryDlg(CWnd* pParent /*=NULL*/)
  38. : CDialog(CQueryDlg::IDD, pParent)
  39. {
  40. //{{AFX_DATA_INIT(CQueryDlg)
  41. // NOTE: the ClassWizard will add member initialization here
  42. //}}AFX_DATA_INIT
  43. }
  44. void CQueryDlg::DoDataExchange(CDataExchange* pDX)
  45. {
  46. CDialog::DoDataExchange(pDX);
  47. //{{AFX_DATA_MAP(CQueryDlg)
  48. DDX_Control(pDX, IDC_APP_INFO_LIST, m_AppInfoList);
  49. //}}AFX_DATA_MAP
  50. }
  51. BEGIN_MESSAGE_MAP(CQueryDlg, CDialog)
  52. //{{AFX_MSG_MAP(CQueryDlg)
  53. ON_BN_CLICKED(IDC_RADIO_PASSALL, OnRadioPassall)
  54. ON_BN_CLICKED(IDC_RADIO_PASSONCE, OnRadioPassonce)
  55. ON_BN_CLICKED(IDC_RADIO_DENYONCE, OnRadioDenyonce)
  56. ON_BN_CLICKED(IDC_RADIO_DENYALL, OnRadioDenyall)
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. /////////////////////////////////////////////////////////////////////////////
  60. // CQueryDlg message handlers
  61. BOOL CQueryDlg::OnInitDialog() 
  62. {
  63. CDialog::OnInitDialog();
  64. // TODO: Add extra initialization here
  65. m_pNext = NULL;
  66. // 初始化选中“总是允许”
  67. m_nSelectedAction = PASS_ALL;
  68. CheckRadioButton(IDC_RADIO_PASSALL, IDC_RADIO_DENYALL, IDC_RADIO_PASSALL);
  69. // 绘制询问应用程序图标
  70. SHFILEINFOW stFileInfo;
  71. if( ::SHGetFileInfo(m_Session.szPathName, 0, &stFileInfo, sizeof(stFileInfo), SHGFI_ICON)) 
  72. {
  73. ((CStatic *)GetDlgItem(IDC_APP_ICON))->SetIcon(stFileInfo.hIcon);
  74. }
  75. // 填写显示的部分
  76. SetDlgItemText(IDC_APP_NAME, GetFileName(m_Session.szPathName));
  77. // 初始化 InfoListCtrl 的设置和风格
  78. m_AppInfoList.InsertColumn(0,L"程序详细信息",LVCFMT_LEFT,80,-1);
  79. m_AppInfoList.InsertColumn(1,L"  ",LVCFMT_LEFT,240,-1);
  80. m_AppInfoList.ModifyStyle(LVS_TYPEMASK,LVS_REPORT);
  81. m_AppInfoList.SetExtendedStyle(LVS_EX_FULLROWSELECT);
  82. // 把程序的详细信息插入到 InfoListCtrl 中
  83. int nItem;
  84. CString strTemp;
  85. // 程序路径
  86. nItem = m_AppInfoList.InsertItem(0, L"程序路径");
  87. m_AppInfoList.SetItemText(nItem, 1, m_Session.szPathName);
  88. // 程序详细信息
  89. GetVersionFromPath(m_Session.szPathName, &AppVersion);
  90. nItem = m_AppInfoList.InsertItem(1, L"公司名称");
  91. m_AppInfoList.SetItemText(nItem, 1, AppVersion.CompanyName);
  92. nItem = m_AppInfoList.InsertItem(2, L"产品版本");
  93. m_AppInfoList.SetItemText(nItem, 1, AppVersion.ProductVersion);
  94. nItem = m_AppInfoList.InsertItem(3, L"法律版权");
  95. m_AppInfoList.SetItemText(nItem, 1, AppVersion.LegalCopyright);
  96. nItem = m_AppInfoList.InsertItem(4, L"程序描述");
  97. m_AppInfoList.SetItemText(nItem, 1, AppVersion.FileDescription);
  98. // 本机IP/端口
  99. in_addr LocalAddr;
  100. LocalAddr.S_un.S_addr  = m_Session.ulLocalIP;
  101. nItem = m_AppInfoList.InsertItem(5, L"本机IP/端口");
  102. USES_CONVERSION;
  103. strTemp.Format(L"%s / %d", A2W(inet_ntoa(LocalAddr)), m_Session.usLocalPort);
  104. strTemp.Replace(L":", L".");
  105. m_AppInfoList.SetItemText(nItem, 1, strTemp);
  106. // 远程IP/端口
  107. in_addr RemoteAddr;
  108. RemoteAddr.S_un.S_addr  = m_Session.ulRemoteIP;
  109. nItem = m_AppInfoList.InsertItem(6, L"远程IP/端口");
  110. strTemp.Format(L"%s / %d", A2W(inet_ntoa(RemoteAddr)), m_Session.usRemotePort);
  111. strTemp.Replace(L":", L".");
  112. m_AppInfoList.SetItemText(nItem, 1, strTemp);
  113. // 创建一个控制窗口显示时间的线程
  114. DWORD dwThreadId;
  115. m_hThread = CreateThread(NULL, 0, TimeControlThread, this, 0, &dwThreadId);
  116. return TRUE;  // return TRUE unless you set the focus to a control
  117. // EXCEPTION: OCX Property Pages should return FALSE
  118. }
  119. void CQueryDlg::OnRadioPassall() 
  120. {
  121. // TODO: Add your control notification handler code here
  122. m_nSelectedAction = PASS_ALL;
  123. }
  124. void CQueryDlg::OnRadioPassonce() 
  125. {
  126. // TODO: Add your control notification handler code here
  127. m_nSelectedAction = PASS_ONCE;
  128. }
  129. void CQueryDlg::OnRadioDenyonce() 
  130. {
  131. // TODO: Add your control notification handler code here
  132. m_nSelectedAction = DENY_ONCE;
  133. }
  134. void CQueryDlg::OnRadioDenyall() 
  135. {
  136. // TODO: Add your control notification handler code here
  137. m_nSelectedAction = DENY_ALL;
  138. }
  139. void CQueryDlg::OnCancel() 
  140. {
  141. // TODO: Add extra cleanup here
  142. char szContent[256];
  143. USES_CONVERSION;
  144. switch ( m_nSelectedAction )
  145. {
  146. case PASS_ALL:
  147. // 增加LSP层规则
  148. AddLspRule(RULE_ACTION_PASS);
  149. // 将规则应用到Dll模块
  150. theApp.ApplyLspRules();
  151. // 把对询问消息的相应传递给Dll模块
  152. g_pIoControl->SetQuerySession(m_nIndex, RULE_ACTION_PASS);
  153. // 保存日志记录
  154. sprintf(szContent, "应用程序 %s 试图联网,用户采取的选择:总是允许。", W2A(m_Session.szPathName));
  155. break;
  156. case PASS_ONCE:
  157. g_pIoControl->SetQuerySession(m_nIndex, RULE_ACTION_PASS);
  158. // 保存日志记录
  159. sprintf(szContent, "应用程序 %s 试图联网,用户采取的选择:允许这次。", W2A(m_Session.szPathName));
  160. break;
  161. case DENY_ONCE:
  162. g_pIoControl->SetQuerySession(m_nIndex, RULE_ACTION_DENY);
  163. // 保存日志记录
  164. sprintf(szContent, "应用程序 %s 试图联网,用户采取的选择:拒绝这次。", W2A(m_Session.szPathName));
  165. break;
  166. case DENY_ALL:
  167. // 增加LSP层规则
  168. AddLspRule(RULE_ACTION_DENY);
  169. // 将规则应用到Dll模块
  170. theApp.ApplyLspRules();
  171. // 把对询问消息的相应传递给Dll模块
  172. g_pIoControl->SetQuerySession(m_nIndex, RULE_ACTION_DENY);
  173. // 保存日志记录
  174. sprintf(szContent, "应用程序 %s 试图联网,用户采取的选择:总是拒绝。", W2A(m_Session.szPathName));
  175. break;
  176. }
  177. // 终止计时线程
  178. TerminateThread(m_hThread, 0);
  179. // 向主对话框发送消息,表明自己要销毁
  180. ::PostMessage(g_hMainWnd, QUERY_DLG_DESTROY, 0, 0);
  181. // 保存日志文件
  182. SaveLogFile(szContent);
  183. CDialog::OnCancel();
  184. }
  185. void CQueryDlg::AddLspRule(UCHAR ucAction)
  186. {
  187. if(g_RuleFile.m_header.ulLspRuleCount > MAX_RULE_COUNT)
  188. {
  189. AfxMessageBox(L" 超过规则的最大数目,不能够再添加");
  190. return ;
  191. }
  192. // 设置规则
  193. RULE_ITEM tmpRule;
  194. tmpRule.ucAction = ucAction;
  195. tmpRule.ucDirection   = m_Session.ucDirection;
  196. tmpRule.ucServiceType = m_Session.nProtocol;
  197. tmpRule.usServicePort = m_Session.usLocalPort;
  198. _tcscpy(tmpRule.szApplication, m_Session.szPathName);
  199. _tcscpy(tmpRule.sDemo, AppVersion.FileDescription);
  200. // 将规则添加到文件
  201. if(!g_RuleFile.AddLspRules(&tmpRule, 1))
  202. {
  203. AfxMessageBox(L"添加 ACL 规则错误。");
  204. return ;
  205. }
  206. // 将规则保存到文件
  207. g_RuleFile.SaveRules();
  208. // 将规则在 ListCtrl 控件上显示出来
  209. ::PostMessage(g_hMainWnd, UPDATE_ACCESS_CTRL_LIST, 0, 0);
  210. }