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

Visual C++

  1. //////////////////////////////////////////////////
  2. // PRuleFile.cpp
  3. #include "stdafx.h"
  4. #include "PRuleFile.h"
  5. CPRuleFile::CPRuleFile()
  6. {
  7. // 获取规则文件的完整路径
  8. TCHAR *p;
  9. ::GetFullPathName(RULE_FILE_NAME, MAX_PATH, m_szPathName, &p);
  10. m_hFile = INVALID_HANDLE_VALUE;
  11. // 为过滤规则预申请内存空间
  12. m_nLspMaxCount = 50;
  13. m_nKerMaxCount = 50;
  14. m_nIPMaxCount  = 10;
  15. m_pLspRules = new RULE_ITEM[m_nLspMaxCount];
  16. m_pKerRules = new PassthruFilter[m_nKerMaxCount];
  17. m_pIPRules  = new IPRule[m_nIPMaxCount];
  18. m_bLoad = FALSE;
  19. }
  20. CPRuleFile::~CPRuleFile()
  21. {
  22. if(m_hFile != INVALID_HANDLE_VALUE)
  23. ::CloseHandle(m_hFile);
  24. delete[] m_pLspRules;
  25. delete[] m_pKerRules;
  26. delete[] m_pIPRules;
  27. }
  28. void CPRuleFile::InitFileData()
  29. {
  30. // 初始化文件头
  31. wcscpy(m_header.szSignature, RULE_HEADER_SIGNATURE);
  32. m_header.ulHeaderLength = sizeof(m_header);
  33. m_header.ucMajorVer = RULE_HEADER_MAJOR;
  34. m_header.ucMinorVer = RULE_HEADER_MINOR;
  35. m_header.dwVersion = RULE_HEADER_VERSION;
  36. wcscpy(m_header.szWebURL, RULE_HEADER_WEB_URL); 
  37. wcscpy(m_header.szEmail, RULE_HEADER_EMAIL);
  38. m_header.ulLspRuleCount = 0;
  39. m_header.ulKerRuleCount = 0;
  40. m_header.ulIPRuleCount  = 0;
  41. m_header.ucLspWorkMode = PF_QUERY_ALL;
  42. m_header.ucKerWorkMode = IM_START_FILTER;
  43. m_header.bAutoStart = FALSE;
  44. m_header.bIsIPRuleSaved = FALSE;
  45. }
  46. // 将规则写入指定文件
  47. BOOL CPRuleFile::WriteRules(TCHAR *pszPathName) 
  48. {
  49. DWORD dw;
  50. if(m_hFile != INVALID_HANDLE_VALUE)
  51. {
  52. ::CloseHandle(m_hFile);
  53. }
  54. // 打开文件
  55. m_hFile = ::CreateFile(pszPathName, GENERIC_WRITE, 
  56. 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 
  57. if(m_hFile != INVALID_HANDLE_VALUE)
  58. {
  59. // 写文件头
  60. ::WriteFile(m_hFile, &m_header, sizeof(m_header), &dw, NULL);
  61. // 写应用层过滤规则
  62. if(m_header.ulLspRuleCount > 0)
  63. {
  64. ::WriteFile(m_hFile, 
  65. m_pLspRules, m_header.ulLspRuleCount * sizeof(RULE_ITEM), &dw, NULL);
  66. }
  67. // 写核心层过滤规则
  68. if(m_header.ulKerRuleCount > 0)
  69. {
  70. ::WriteFile(m_hFile, 
  71. m_pKerRules, m_header.ulKerRuleCount * sizeof(PassthruFilter), &dw, NULL);
  72. }
  73. // 写IP规则
  74. if(m_header.ulIPRuleCount > 0)
  75. {
  76. ::WriteFile(m_hFile, 
  77. m_pIPRules, m_header.ulIPRuleCount * sizeof(IPRule), &dw, NULL);
  78. }
  79. ::CloseHandle(m_hFile);
  80. m_hFile = INVALID_HANDLE_VALUE;
  81. return TRUE;
  82. }
  83. return FALSE;
  84. }
  85. BOOL CPRuleFile::OpenFile()
  86. {
  87. // 首先保证文件已经存在
  88. if(::GetFileAttributes(m_szPathName) == -1)
  89. {
  90. InitFileData();
  91. if(!WriteRules(m_szPathName))
  92. return FALSE;
  93. }
  94. // 如果没有关闭,就关闭
  95. if(m_hFile != INVALID_HANDLE_VALUE)
  96. ::CloseHandle(m_hFile);
  97. // 以只读方式打开文件
  98. m_hFile = ::CreateFile(m_szPathName, GENERIC_READ, 
  99. FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
  100. return m_hFile != INVALID_HANDLE_VALUE;
  101. }
  102. ///////////////////////////////////////////////////////////////////////////////////////
  103. // 接口成员
  104. BOOL CPRuleFile::LoadRules()
  105. {
  106. // 先打开文件
  107. if((!OpenFile()) || (::SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN) == -1))
  108. {
  109. return FALSE;
  110. }
  111. // 从文件中读取数据
  112. DWORD dw = 0;
  113. do
  114. {
  115. // 读文件头
  116. ::ReadFile(m_hFile, &m_header, sizeof(m_header), &dw, NULL);
  117. // 如果签名不正确,退出
  118. if((dw != sizeof(m_header)) || 
  119. (_tcscmp(m_header.szSignature, RULE_HEADER_SIGNATURE) != 0))
  120. {
  121. AfxMessageBox(L"签名出错!");
  122. break;
  123. }
  124. // 读应用层过滤规则
  125. if(m_header.ulLspRuleCount > 0)
  126. {
  127. if(m_header.ulLspRuleCount > (ULONG)m_nLspMaxCount)
  128. {
  129. m_nLspMaxCount = m_header.ulLspRuleCount;
  130. delete[] m_pLspRules;
  131. m_pLspRules = new RULE_ITEM[m_nLspMaxCount];
  132. }
  133. if(!::ReadFile(m_hFile, m_pLspRules, 
  134. m_header.ulLspRuleCount * sizeof(RULE_ITEM), &dw, NULL))
  135. break;
  136. }
  137. // 读核心层过滤规则
  138. if(m_header.ulKerRuleCount > 0)
  139. {
  140. if(m_header.ulKerRuleCount > (ULONG)m_nKerMaxCount)
  141. {
  142. m_nKerMaxCount = m_header.ulKerRuleCount;
  143. delete[] m_pKerRules;
  144. m_pKerRules = new PassthruFilter[m_nKerMaxCount];
  145. }
  146. if(!::ReadFile(m_hFile, m_pKerRules, 
  147. m_header.ulKerRuleCount * sizeof(PassthruFilter), &dw, NULL))
  148. break;
  149. }
  150. // 读IP规则
  151. if(m_header.ulIPRuleCount > 0)
  152. {
  153. if(m_header.ulIPRuleCount > (ULONG)m_nIPMaxCount)
  154. {
  155. m_nIPMaxCount = m_header.ulIPRuleCount;
  156. delete[] m_pIPRules;
  157. m_pIPRules = new IPRule[m_nIPMaxCount];
  158. }
  159. if(!::ReadFile(m_hFile, m_pIPRules, 
  160. m_header.ulIPRuleCount * sizeof(IPRule), &dw, NULL))
  161. break;
  162. }
  163. m_bLoad = TRUE;
  164. }
  165. while(FALSE);
  166. ::CloseHandle(m_hFile);
  167. m_hFile = INVALID_HANDLE_VALUE;
  168. return m_bLoad;
  169. }
  170. BOOL CPRuleFile::SaveRules()
  171. {
  172. // 如果没有加载,退出
  173. if(!m_bLoad)
  174. return FALSE;
  175. // 保存规则
  176. return WriteRules(m_szPathName);
  177. }
  178. BOOL CPRuleFile::AddLspRules(RULE_ITEM *pItem, int nCount)
  179. {
  180. if((pItem == NULL) || !m_bLoad)
  181. return FALSE;
  182. // 首先保证有足够大的内存空间
  183. if(m_header.ulLspRuleCount + nCount > (ULONG)m_nLspMaxCount)
  184. {
  185. m_nLspMaxCount = 2*(m_header.ulLspRuleCount + nCount);
  186. RULE_ITEM *pTmp = new RULE_ITEM[m_header.ulLspRuleCount];
  187. memcpy(pTmp, m_pLspRules, m_header.ulLspRuleCount);
  188. delete[] m_pLspRules;
  189. m_pLspRules = new RULE_ITEM[m_nLspMaxCount];
  190. memcpy(m_pLspRules, pTmp, m_header.ulLspRuleCount);
  191. delete[] pTmp;
  192. }
  193. // 添加规则
  194. memcpy(m_pLspRules + m_header.ulLspRuleCount, pItem, nCount * sizeof(RULE_ITEM));
  195. m_header.ulLspRuleCount += nCount;
  196. return TRUE;
  197. }
  198. BOOL CPRuleFile::AddKerRules(PassthruFilter *pItem, int nCount)
  199. {
  200. if((pItem == NULL) || !m_bLoad)
  201. return FALSE;
  202. // 首先保证有足够大的内存空间
  203. if(m_header.ulKerRuleCount + nCount > (ULONG)m_nKerMaxCount)
  204. {
  205. m_nKerMaxCount = 2*(m_header.ulKerRuleCount + nCount);
  206. PassthruFilter *pTmp = new PassthruFilter[m_header.ulKerRuleCount];
  207. memcpy(pTmp, m_pKerRules, m_header.ulKerRuleCount);
  208. delete[] m_pKerRules;
  209. m_pKerRules = new PassthruFilter[m_nKerMaxCount];
  210. memcpy(m_pKerRules, pTmp, m_header.ulKerRuleCount);
  211. delete[] pTmp;
  212. }
  213. // 添加规则
  214. memcpy(m_pKerRules + m_header.ulKerRuleCount, pItem, nCount * sizeof(PassthruFilter));
  215. m_header.ulKerRuleCount += nCount;
  216. return TRUE;
  217. }
  218. BOOL CPRuleFile::AddIPRules(IPRule *pItem, int nCount)
  219. {
  220. if((pItem == NULL) || !m_bLoad)
  221. return FALSE;
  222. // 首先保证有足够大的内存空间
  223. if(m_header.ulIPRuleCount + nCount > (ULONG)m_nIPMaxCount)
  224. {
  225. m_nIPMaxCount = 2*(m_header.ulIPRuleCount + nCount);
  226. IPRule *pTmp = new IPRule[m_header.ulIPRuleCount];
  227. memcpy(pTmp, m_pIPRules, m_header.ulIPRuleCount);
  228. delete[] m_pIPRules;
  229. m_pIPRules = new IPRule[m_nIPMaxCount];
  230. memcpy(m_pIPRules, pTmp, m_header.ulIPRuleCount);
  231. delete[] pTmp;
  232. }
  233. // 添加规则
  234. memcpy(m_pIPRules + m_header.ulIPRuleCount, pItem, nCount * sizeof(IPRule));
  235. m_header.ulIPRuleCount += nCount;
  236. return TRUE;
  237. }
  238. BOOL CPRuleFile::DelLspRule(int nIndex)
  239. {
  240. if(((ULONG)nIndex >= m_header.ulLspRuleCount) || !m_bLoad)
  241. return FALSE;
  242. // 删除一个成员
  243. memcpy(&m_pLspRules[nIndex], 
  244. &m_pLspRules[nIndex + 1], (m_header.ulLspRuleCount - nIndex) * sizeof(RULE_ITEM));
  245. m_header.ulLspRuleCount --;
  246. return TRUE;
  247. }
  248. BOOL CPRuleFile::DelKerRule(int nIndex)
  249. {
  250. if(((ULONG)nIndex >= m_header.ulKerRuleCount) || !m_bLoad)
  251. return FALSE;
  252. // 删除一个成员
  253. memcpy(&m_pKerRules[nIndex], 
  254. &m_pKerRules[nIndex + 1], (m_header.ulKerRuleCount - nIndex) * sizeof(PassthruFilter));
  255. m_header.ulKerRuleCount --;
  256. return TRUE;
  257. }
  258. BOOL CPRuleFile::ModifyLspRule(TCHAR *szAppPath)
  259. {
  260. BOOL bRet;
  261. // 先打开文件
  262. if((!OpenFile()) || (::SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN) == -1))
  263. {
  264. return FALSE;
  265. }
  266. // 从文件中读取数据
  267. DWORD dw = 0;
  268. do
  269. {
  270. // 读文件头
  271. ::ReadFile(m_hFile, &m_header, sizeof(m_header), &dw, NULL);
  272. // 如果签名不正确,退出
  273. if((dw != sizeof(m_header)) || 
  274. (_tcscmp(m_header.szSignature, RULE_HEADER_SIGNATURE) != 0))
  275. {
  276. AfxMessageBox(L"签名出错!");
  277. break;
  278. }
  279. // 读应用层过滤规则
  280. if(m_header.ulLspRuleCount > 0)
  281. {
  282. if(m_header.ulLspRuleCount > (ULONG)m_nLspMaxCount)
  283. {
  284. m_nLspMaxCount = m_header.ulLspRuleCount;
  285. delete[] m_pLspRules;
  286. m_pLspRules = new RULE_ITEM[m_nLspMaxCount];
  287. }
  288. if(!::ReadFile(m_hFile, m_pLspRules, m_header.ulLspRuleCount * sizeof(RULE_ITEM), &dw, NULL))
  289. {
  290. break;
  291. }
  292. }
  293. // 查找与应用程序相关的过滤规则
  294. for (int i = 0; i < (int)m_header.ulLspRuleCount; i++)
  295. {
  296. if (_tcscmp(m_pLspRules[i].szApplication,szAppPath) == 0)
  297. {
  298. m_pLspRules[i].ucAction = 1 - m_pLspRules[i].ucAction; // 改变应用程序的状态
  299. SaveRules(); // 保存修改后的过滤规则
  300. break;
  301. }
  302. }
  303. if (i >= (int)m_header.ulLspRuleCount)
  304. {
  305. AfxMessageBox(L"没有找到与该程序相关的过滤规则!");
  306. bRet = FALSE;
  307. }
  308. else
  309. {
  310. bRet = TRUE;
  311. }
  312. }
  313. while(FALSE);
  314. ::CloseHandle(m_hFile);
  315. m_hFile = INVALID_HANDLE_VALUE;
  316. return bRet;
  317. }
  318. BOOL CPRuleFile::DelKerRuleByURL(TCHAR *szURL)
  319. {
  320. // 先打开文件
  321. if((!OpenFile()) || (::SetFilePointer(m_hFile, 0, NULL, FILE_BEGIN) == -1))
  322. {
  323. return FALSE;
  324. }
  325. // 从文件中读取数据
  326. DWORD dw = 0;
  327. BOOL  bRet = FALSE;
  328. do
  329. {
  330. // 读文件头
  331. ::ReadFile(m_hFile, &m_header, sizeof(m_header), &dw, NULL);
  332. // 如果签名不正确,退出
  333. if((dw != sizeof(m_header)) || 
  334. (_tcscmp(m_header.szSignature, RULE_HEADER_SIGNATURE) != 0))
  335. {
  336. AfxMessageBox(L"签名出错!");
  337. break;
  338. }
  339. // 读应用层过滤规则
  340. if(m_header.ulLspRuleCount > 0)
  341. {
  342. if(m_header.ulLspRuleCount > (ULONG)m_nLspMaxCount)
  343. {
  344. m_nLspMaxCount = m_header.ulLspRuleCount;
  345. delete[] m_pLspRules;
  346. m_pLspRules = new RULE_ITEM[m_nLspMaxCount];
  347. }
  348. if(!::ReadFile(m_hFile, m_pLspRules, 
  349. m_header.ulLspRuleCount * sizeof(RULE_ITEM), &dw, NULL))
  350. break;
  351. }
  352. // 读核心层过滤规则
  353. if(m_header.ulKerRuleCount > 0)
  354. {
  355. if(m_header.ulKerRuleCount > (ULONG)m_nKerMaxCount)
  356. {
  357. m_nKerMaxCount = m_header.ulKerRuleCount;
  358. delete[] m_pKerRules;
  359. m_pKerRules = new PassthruFilter[m_nKerMaxCount];
  360. }
  361. if(!::ReadFile(m_hFile, m_pKerRules, 
  362. m_header.ulKerRuleCount * sizeof(PassthruFilter), &dw, NULL))
  363. break;
  364. }
  365. // 从核心层规则中找到与该URL匹配的规则
  366. for (int i=0; i<(int)m_header.ulKerRuleCount; i++)
  367. {
  368. if (_tcscmp(m_pKerRules[i].szWebSiteURL, szURL) == 0)
  369. {
  370. DelKerRule(i);
  371. i--; // 因为规则减少了1个,所以计数要减1。
  372. }
  373. }
  374. // 保存修改后的规则文件
  375. SaveRules();
  376. bRet = TRUE;
  377. }
  378. while(FALSE);
  379. ::CloseHandle(m_hFile);
  380. m_hFile = INVALID_HANDLE_VALUE;
  381. return bRet;
  382. }