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

Visual C++

  1. // MyFireWall.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "MyFireWall.h"
  5. #include "MyFireWallDlg.h"
  6. #include "Winver.h"
  7. #pragma comment(lib, "Version.lib") // 提供获得文件版本的函数
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. /////////////////////////////////////////////////////////////////////////////
  14. // CMyFireWallApp
  15. BEGIN_MESSAGE_MAP(CMyFireWallApp, CWinApp)
  16. //{{AFX_MSG_MAP(CMyFireWallApp)
  17. // NOTE - the ClassWizard will add and remove mapping macros here.
  18. //    DO NOT EDIT what you see in these blocks of generated code!
  19. //}}AFX_MSG
  20. ON_COMMAND(ID_HELP, CWinApp::OnHelp)
  21. END_MESSAGE_MAP()
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CMyFireWallApp construction
  24. CMyFireWallApp::CMyFireWallApp()
  25. {
  26. // TODO: add construction code here,
  27. // Place all significant initialization in InitInstance
  28. }
  29. /////////////////////////////////////////////////////////////////////////////
  30. // The one and only CMyFireWallApp object
  31. CMyFireWallApp theApp;
  32. /////////////////////////////////////////////////////////////////////////////
  33. // CMyFireWallApp initialization
  34. BOOL CMyFireWallApp::InitInstance()
  35. {
  36. // 运行一次
  37. TCHAR szModule[] = L"MyFireWall";
  38. m_hSemaphore = ::CreateSemaphore(NULL, 0, 1, szModule);
  39. if(::GetLastError() == ERROR_ALREADY_EXISTS)
  40. {
  41. AfxMessageBox(L" MyFireWall 已经在运行!");
  42. return FALSE;
  43. }
  44. // 加载过滤文件
  45. if (!g_RuleFile.LoadRules())
  46. {
  47. AfxMessageBox(L"加载配置文件时失败!");
  48. return FALSE;
  49. }
  50. // 获得防火墙当前路径
  51. TCHAR szCurrentPath[MAX_PATH];
  52. GetModuleFileName(NULL, szCurrentPath, MAX_PATH);
  53. strCurrentPath = GetFilePath(szCurrentPath);
  54. // 加载LSP
  55. if (!IsProviderInstalled())
  56. {
  57. TCHAR szPathName[256];
  58. // 注意,安装LSP需要使用完整DLL路径。这样的话,CPIOControl类在加载DLL时也应使用
  59. // 完整路径,否则CPIOControl类加载的DLL不能和作为LSP的DLL共享内存
  60. wsprintf(szPathName, _T("%s%s"), strCurrentPath, _T("MyLsp.dll"));
  61. if(!InstallProvider(szPathName))
  62. {
  63. AfxMessageBox(L" 应用层过滤安装失败!"); 
  64. return FALSE;
  65. }
  66. }
  67. //创建Dll I/O控制对象,加载Dll模块
  68. g_pIoControl = new CPIOControl;
  69. //应用文件中的数据,设置应用层和核心层的过滤规则
  70. ApplyLspRules();
  71. ApplyKerRules();
  72. //加载皮肤
  73. InitializeSkin("Topax.ssk");
  74. AfxEnableControlContainer();
  75. // Standard initialization
  76. // If you are not using these features and wish to reduce the size
  77. //  of your final executable, you should remove from the following
  78. //  the specific initialization routines you do not need.
  79. #ifdef _AFXDLL
  80. Enable3dControls(); // Call this when using MFC in a shared DLL
  81. #else
  82. Enable3dControlsStatic(); // Call this when linking to MFC statically
  83. #endif
  84. CMyFireWallDlg dlg;
  85. m_pMainWnd = &dlg;
  86. int nResponse = dlg.DoModal();
  87. if (nResponse == IDOK)
  88. {
  89. // TODO: Place code here to handle when the dialog is
  90. // dismissed with OK
  91. }
  92. else if (nResponse == IDCANCEL)
  93. {
  94. // TODO: Place code here to handle when the dialog is
  95. //  dismissed with Cancel
  96. }
  97. // Since the dialog has been closed, return FALSE so that we exit the
  98. //  application, rather than start the application's message pump.
  99. return FALSE;
  100. }
  101. int CMyFireWallApp::ExitInstance() 
  102. {
  103. // TODO: Add your specialized code here and/or call the base class
  104. if(g_pIoControl != NULL)
  105. {
  106. g_pIoControl->SetWorkMode(PF_PASS_ALL);
  107. g_pIoControl->SetInstance(NULL, L"");
  108. delete g_pIoControl;
  109. }
  110. int nKerWorkMode = IM_PASS_ALL;
  111. PtSetWorkMode(&nKerWorkMode);
  112. IMClearRules();
  113. PtSetARPRules(FALSE);
  114. ::CloseHandle(m_hSemaphore);
  115. return CWinApp::ExitInstance();
  116. }
  117. BOOL CMyFireWallApp::ApplyFileData()
  118. {
  119. // 设置应用层工作模式
  120. g_pIoControl->SetWorkMode(g_RuleFile.m_header.ucLspWorkMode);
  121. // 设置应用层规则文件
  122. g_pIoControl->SetRuleFile(&g_RuleFile.m_header, g_RuleFile.m_pLspRules);
  123. // 设置核心层工作模式
  124. int nWorkMode = g_RuleFile.m_header.ucKerWorkMode;
  125. PtSetWorkMode(&nWorkMode);
  126. // 设置核心层规则文件
  127. IMClearRules();
  128. if(g_RuleFile.m_header.ucKerWorkMode == IM_START_FILTER)
  129. {
  130. if(!IMSetRules(g_RuleFile.m_pKerRules, g_RuleFile.m_header.ulKerRuleCount))
  131. {
  132. AfxMessageBox(L" 设置核心层规则出错!n");
  133. return FALSE;
  134. }
  135. }
  136. return TRUE;
  137. }
  138. BOOL CMyFireWallApp::ApplyLspRules()
  139. {
  140. // 设置应用层工作模式
  141. g_pIoControl->SetWorkMode(g_RuleFile.m_header.ucLspWorkMode);
  142. // 设置应用层规则文件
  143. g_pIoControl->SetRuleFile(&g_RuleFile.m_header, g_RuleFile.m_pLspRules);
  144. return TRUE;
  145. }
  146. BOOL CMyFireWallApp::ApplyKerRules()
  147. {
  148. // 设置核心层工作模式
  149. int nWorkMode = g_RuleFile.m_header.ucKerWorkMode;
  150. PtSetWorkMode(&nWorkMode);
  151. // 设置核心层规则文件
  152. IMClearRules();
  153. if(g_RuleFile.m_header.ucKerWorkMode == IM_START_FILTER)
  154. {
  155. if(!IMSetRules(g_RuleFile.m_pKerRules, g_RuleFile.m_header.ulKerRuleCount))
  156. {
  157. AfxMessageBox(L" 设置核心层规则出错!n");
  158. return FALSE;
  159. }
  160. }
  161. return TRUE;
  162. }
  163. BOOL CMyFireWallApp::ApplyIPRules(int nIndex)
  164. {
  165. int nPing = (int)g_RuleFile.m_pIPRules[0].bState *10 + (int)g_RuleFile.m_pIPRules[1].bState;
  166. // 设置Ping入和Ping出
  167. PtSetPing(&nPing);
  168. PassthruFilter RuleItem;
  169. // RPC
  170. if (nIndex == -1 || nIndex == 2)
  171. {
  172. if (g_RuleFile.m_pIPRules[2].bState == TRUE)
  173. {
  174. // 如果改为“允许”的话,就删除相应的规则
  175. for (int i=0; i<g_RuleFile.m_header.ulKerRuleCount; i++)
  176. {
  177. if (_tcscmp(g_RuleFile.m_pKerRules[i].szDescription, L"RPC") == 0)
  178. {
  179. g_RuleFile.DelKerRule(i);
  180. break;
  181. }
  182. }
  183. }
  184. else
  185. {
  186. // 如果是“禁止”,就添加相应的规则
  187. RuleItem.bDrop = !g_RuleFile.m_pIPRules[2].bState;
  188. RuleItem.protocol = g_RuleFile.m_pIPRules[2].protocol; // 1:ICMP,6:TCP,17:UDP
  189. RuleItem.sourceIP   = 0;
  190. RuleItem.sourcePort = 0;
  191. RuleItem.destinationIP   = 0;
  192. RuleItem.destinationPort = g_RuleFile.m_pIPRules[2].port;
  193. _tcscpy(RuleItem.szWebSiteURL,  L"");
  194. _tcscpy(RuleItem.szDescription, L"RPC");
  195. // 添加核心层规则
  196. g_RuleFile.AddKerRules(&RuleItem, 1);
  197. }
  198. }
  199. // DNS
  200. if (nIndex == -1 || nIndex == 3)
  201. {
  202. if (g_RuleFile.m_pIPRules[3].bState == TRUE)
  203. {
  204. // 如果改为“允许”的话,就删除相应的规则
  205. for (int i=0; i<g_RuleFile.m_header.ulKerRuleCount; i++)
  206. {
  207. if (_tcscmp(g_RuleFile.m_pKerRules[i].szDescription, L"DNS") == 0)
  208. {
  209. g_RuleFile.DelKerRule(i);
  210. break;
  211. }
  212. }
  213. }
  214. else
  215. {
  216. // 如果是“禁止”,就添加相应的规则
  217. RuleItem.bDrop = !g_RuleFile.m_pIPRules[3].bState;
  218. RuleItem.protocol = g_RuleFile.m_pIPRules[3].protocol; // 1:ICMP,6:TCP,17:UDP
  219. RuleItem.sourceIP   = 0;
  220. RuleItem.sourcePort = 0;
  221. RuleItem.destinationIP   = 0;
  222. RuleItem.destinationPort = g_RuleFile.m_pIPRules[3].port;
  223. _tcscpy(RuleItem.szWebSiteURL,  L"");
  224. _tcscpy(RuleItem.szDescription, L"DNS");
  225. // 添加到核心层规则
  226. g_RuleFile.AddKerRules(&RuleItem, 1);
  227. }
  228. }
  229. // 局域网共享
  230. if (nIndex == -1 || nIndex == 4)
  231. {
  232. if (g_RuleFile.m_pIPRules[4].bState == TRUE)
  233. {
  234. // 如果改为“允许”的话,就删除相应的规则
  235. for (int i=0; i<g_RuleFile.m_header.ulKerRuleCount; i++)
  236. {
  237. if (_tcscmp(g_RuleFile.m_pKerRules[i].szDescription, L"LAN139") == 0 || _tcscmp(g_RuleFile.m_pKerRules[i].szDescription, L"LAN445") == 0)
  238. {
  239. g_RuleFile.DelKerRule(i);
  240. }
  241. }
  242. }
  243. else
  244. {
  245. // 如果是“禁止”,就添加相应的规则
  246. // 端口139
  247. RuleItem.bDrop = !g_RuleFile.m_pIPRules[4].bState;
  248. RuleItem.protocol = g_RuleFile.m_pIPRules[4].protocol; // 1:ICMP,6:TCP,17:UDP
  249. RuleItem.sourceIP   = 0;
  250. RuleItem.sourcePort = 0;
  251. RuleItem.destinationIP   = 0;
  252. RuleItem.destinationPort = 139;
  253. _tcscpy(RuleItem.szWebSiteURL,  L"");
  254. _tcscpy(RuleItem.szDescription, L"LAN139");
  255. // 添加到核心层规则
  256. g_RuleFile.AddKerRules(&RuleItem, 1);
  257. // 端口445
  258. RuleItem.bDrop = !g_RuleFile.m_pIPRules[4].bState;
  259. RuleItem.protocol = g_RuleFile.m_pIPRules[4].protocol; // 1:ICMP,6:TCP,17:UDP
  260. RuleItem.sourceIP   = 0;
  261. RuleItem.sourcePort = 0;
  262. RuleItem.destinationIP   = 0;
  263. RuleItem.destinationPort = 445;
  264. _tcscpy(RuleItem.szWebSiteURL,  L"");
  265. _tcscpy(RuleItem.szDescription, L"LAN445");
  266. // 添加到核心层规则
  267. g_RuleFile.AddKerRules(&RuleItem, 1);
  268. }
  269. }
  270. // 保存规则
  271. g_RuleFile.SaveRules();
  272. // 应用到核心层
  273. theApp.ApplyKerRules();
  274. return TRUE;
  275. }