XInstall.cpp
上传用户:kklily621
上传日期:2013-06-25
资源大小:252k
文件大小:8k
开发平台:

Visual C++

  1. //=============================================================================================
  2. /*
  3. 文件: XInstall.cpp
  4. 说明:
  5. ---------------------------------------------------
  6. 用来安装 Xfilter 个人防火墙。
  7. ---------------------------------------------------
  8. 工程: Xfilter 个人防火墙
  9. 作者: 朱雁辉,朱雁冰
  10. 创建日期: 2001/08/28
  11. 网址: http://www.xfilt.com
  12. 电子邮件: xstudio@xfilt.com
  13. 版权所有 (c) 2001-2002 X 工作室
  14. 警告:
  15. ---------------------------------------------------
  16. 本电脑程序受著作权法的保护。未经授权,不能使用
  17. 和修改本软件全部或部分源代码。凡擅自复制、盗用或散
  18. 布此程序或部分程序或者有其它任何越权行为,将遭到民
  19. 事赔偿及刑事的处罚,并将依法以最高刑罚进行追诉。
  20. 凡通过合法途径购买本软件源代码的用户被默认授权
  21. 可以在自己的程序中使用本软件的部分代码,但作者不对
  22. 代码产生的任何后果负责。
  23. 使用了本软件代码的程序只能以可执行文件形式发布,
  24. 未经特别许可,不能将含有本软件源代码的源程序以任何
  25. 形式发布。
  26. ---------------------------------------------------
  27. */
  28. //=============================================================================================
  29. #include "stdafx.h"
  30. #include "XInstall.h"
  31. BOOL CXInstall::IsWinsock2()
  32. {
  33. WORD wVersionRequested = MAKEWORD(2, 0);
  34. WSADATA wsaData;
  35. if(WSAStartup(wVersionRequested, &wsaData) != 0)
  36. return FALSE;
  37.  
  38. if (LOBYTE(wsaData.wVersion) != 2)
  39. {
  40. WSACleanup();
  41. return FALSE; 
  42. }
  43. return TRUE;
  44. }
  45. BOOL CXInstall::IsInstalled(TCHAR *sPathName)
  46. {
  47. TCHAR tsPathName[MAX_PATH];
  48. if( ReadReg(REG_INSTALL_PATH_ITEM, 
  49. (BYTE*)tsPathName, 
  50. MAX_PATH, 
  51. HKEY_LOCAL_MACHINE, 
  52. REG_INSTALL_KEY, REG_SZ
  53. )
  54. )
  55. {
  56. if(sPathName != NULL)
  57. _tcscpy(sPathName, tsPathName);
  58. return TRUE;
  59. }
  60. return FALSE;
  61. }
  62. int CXInstall::InstallProvider(TCHAR *sPathName)
  63. {
  64. if(IsInstalled())
  65. return XERR_PROVIDER_ALREADY_INSTALL;
  66. _tcscpy(m_sPathName, sPathName);
  67. int iRet;
  68. if((iRet = EnumHookKey()) != XERR_SUCCESS)
  69. return iRet;
  70. if(!SaveReg(
  71. REG_INSTALL_PATH_ITEM, 
  72. (BYTE*)sPathName, 
  73. _tcslen(sPathName),
  74. HKEY_LOCAL_MACHINE, 
  75. REG_INSTALL_KEY, 
  76. REG_SZ
  77. )
  78. )
  79. return XERR_PROVIDER_SAVE_PATH_FAILED;
  80. return XERR_SUCCESS;
  81. }
  82. BOOL CXInstall::RemoveProvider()
  83. {
  84. int iRet = XERR_SUCCESS;
  85. if(!IsInstalled())
  86. return XERR_PROVIDER_NOT_INSTALL;
  87. if(iRet = EnumHookKey(TRUE) != XERR_SUCCESS)
  88. return iRet;
  89. if(!DeleteReg())
  90. return XERR_PROVIDER_REG_DELETE_FAILED;
  91. return XERR_SUCCESS;
  92. }
  93. //=============================================================================================
  94. // private install function
  95. int CXInstall::EnumHookKey(BOOL IsRemove)
  96. {
  97. HKEY hkey = NULL;
  98. if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, REG_PROTOCOL_CATALOG_KEY, 0, KEY_READ, &hkey) != ERROR_SUCCESS)
  99. return XERR_PROVIDER_OPEN_REG_FAILED;
  100. __try
  101. {
  102. TCHAR sSubKey[MAX_PATH];
  103. DWORD dwIndex = 0;
  104. int   iRet = 0;
  105. while(RegEnumKey(hkey, dwIndex, sSubKey, MAX_PATH) == ERROR_SUCCESS)
  106. {
  107. if((iRet = SaveHookKey(hkey, sSubKey, IsRemove)) != XERR_SUCCESS)
  108. return iRet;
  109. dwIndex ++;
  110. }
  111. }
  112. __finally
  113. {
  114. RegCloseKey(hkey);
  115. }
  116. return XERR_SUCCESS;
  117. }
  118. int CXInstall::SaveHookKey(HKEY hkey, LPCTSTR sSubKey, BOOL IsRemove)
  119. {
  120. HKEY hSubKey = NULL;
  121. BYTE ItemValue   [MAX_PROTOCOL_CATALOG_LENTH];
  122. DWORD ItemSize = MAX_PROTOCOL_CATALOG_LENTH;
  123. if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubKey) != ERROR_SUCCESS)
  124. return XERR_PROVIDER_OPEN_REG_FAILED;
  125. __try
  126. {
  127. if(RegQueryValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, NULL, ItemValue, &ItemSize) != ERROR_SUCCESS
  128. || (ItemSize != MAX_PROTOCOL_CATALOG_LENTH))
  129. return XERR_PROVIDER_READ_VALUE_FAILED;
  130. WSAPROTOCOL_INFOW *mProtocolInfo = (WSAPROTOCOL_INFOW*)(ItemValue + MAX_PATH);
  131. #if _DEBUG
  132. TCHAR sProtocolInfo[1024];
  133. _stprintf(sProtocolInfo
  134. , _T("dwServiceFlags1: %u;tdwProviderFlags: %u;tProviderId: %X-%X-%X-%X;t
  135. dwCatalogEntryId: %u;tProtocolChain->ChainLen: %i;tiVersion: %i;t
  136. iAddressFamily: %i;tiMaxSockAddr: %i;tiMinSockAddr: %i;tiSocketType: %i;t
  137. iProtocol: %i;tiProtocolMaxOffset: %i;tiNetworkByteOrder: %i;tiSecurityScheme: %i;t
  138. dwMessageSize: %u;tdwProviderReserved: %u;tszProtocol: %s; ") 
  139. , mProtocolInfo->dwServiceFlags1, mProtocolInfo->dwProviderFlags 
  140. , mProtocolInfo->ProviderId.Data1, mProtocolInfo->ProviderId.Data2 
  141. , mProtocolInfo->ProviderId.Data3, mProtocolInfo->ProviderId.Data4 
  142. , mProtocolInfo->dwCatalogEntryId, mProtocolInfo->ProtocolChain.ChainLen 
  143. , mProtocolInfo->iVersion, mProtocolInfo->iAddressFamily
  144. , mProtocolInfo->iMaxSockAddr, mProtocolInfo->iMinSockAddr
  145. , mProtocolInfo->iSocketType, mProtocolInfo->iProtocol
  146. , mProtocolInfo->iProtocolMaxOffset, mProtocolInfo->iNetworkByteOrder
  147. , mProtocolInfo->iSecurityScheme, mProtocolInfo->dwMessageSize
  148. , mProtocolInfo->dwProviderReserved, mProtocolInfo->szProtocol
  149. );
  150. ODS(sProtocolInfo);
  151. #endif
  152. if(mProtocolInfo->ProtocolChain.ChainLen == 1 && mProtocolInfo->iMaxSockAddr == 16 && mProtocolInfo->iMinSockAddr == 16)
  153. {
  154. TCHAR sItem[21];
  155. _stprintf(sItem, _T("%u"), mProtocolInfo->dwCatalogEntryId);
  156. if(!IsRemove)
  157. {
  158. if(!SaveReg(
  159. sItem, 
  160. ItemValue,
  161. _tcslen((TCHAR*)ItemValue), 
  162. HKEY_LOCAL_MACHINE, 
  163. REG_INSTALL_KEY, 
  164. REG_SZ
  165. )
  166. )
  167. return XERR_PROVIDER_CREATE_ITEM_FAILED;
  168. _tcscpy((TCHAR*)ItemValue, m_sPathName);
  169. if(RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize) != ERROR_SUCCESS)
  170. return XERR_PROVIDER_SET_VALUE_FAILED;
  171. }
  172. else
  173. {
  174. TCHAR sProvider[MAX_PATH];
  175. int iRet = ReadReg(
  176. sItem, 
  177. (BYTE*)sProvider, 
  178. MAX_PATH, 
  179. HKEY_LOCAL_MACHINE, 
  180. REG_INSTALL_KEY, REG_SZ
  181. );
  182. #if _DEBUG
  183. if(!iRet)
  184. return XERR_PROVIDER_READ_VALUE_FAILED;
  185. #endif
  186. _tcscpy((TCHAR*)ItemValue, sProvider);
  187. iRet = RegSetValueEx(hSubKey, REG_PROTOCOL_CATALOG_ITEM, 0, REG_BINARY, ItemValue, ItemSize);
  188. #if _DEBUG
  189. if(iRet != ERROR_SUCCESS)
  190. return XERR_PROVIDER_SET_VALUE_FAILED;
  191. #endif
  192. }
  193. }
  194. }
  195. __finally
  196. {
  197. RegCloseKey(hSubKey);
  198. }
  199. return XERR_SUCCESS;
  200. }
  201. //=============================================================================================
  202. // registry operator function
  203. BOOL CXInstall::ReadReg(
  204. TCHAR *sKey, 
  205. BYTE *pBuffer,
  206. DWORD dwBufSize,
  207. HKEY hkey, 
  208. TCHAR *sSubKey, 
  209. DWORD ulType
  210. )
  211. {
  212. HKEY hSubkey;
  213. if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubkey) != ERROR_SUCCESS)
  214. return FALSE;
  215. __try
  216. {
  217. DWORD dwType;
  218. if (RegQueryValueEx(hSubkey, sKey, 0, &dwType, pBuffer, &dwBufSize) == ERROR_SUCCESS
  219. && dwType == ulType)
  220. return TRUE;
  221. }
  222. __finally
  223. {
  224. RegCloseKey(hSubkey);
  225. }
  226. return FALSE;
  227. }
  228. BOOL CXInstall::SaveReg(
  229. TCHAR *sKey, 
  230. BYTE *pBuffer,
  231. DWORD dwBufSize,
  232. HKEY hkey, 
  233. TCHAR *sSubKey, 
  234. DWORD ulType
  235. )
  236. {
  237. HKEY hSubkey;
  238. DWORD dwDisposition;
  239. if (RegCreateKeyEx(hkey, sSubKey, 0, NULL, REG_OPTION_NON_VOLATILE
  240. , KEY_ALL_ACCESS, NULL, &hSubkey, &dwDisposition) != ERROR_SUCCESS)
  241. return FALSE;
  242. if (RegSetValueEx(hSubkey, sKey, 0, ulType, pBuffer, dwBufSize) != ERROR_SUCCESS)
  243. {
  244. RegCloseKey(hSubkey);
  245. return FALSE;
  246. }
  247. RegCloseKey(hSubkey);
  248. return TRUE;
  249. }
  250. BOOL CXInstall::DeleteReg(
  251. HKEY hkey,
  252. TCHAR *sSubKey, 
  253. TCHAR *sItem
  254. )
  255. {
  256. if(hkey == NULL || sSubKey == NULL)
  257. return FALSE;
  258. if(sItem == NULL)
  259. {
  260. if(RegDeleteKey(hkey,sSubKey) == ERROR_SUCCESS)
  261. return TRUE;
  262. else
  263. return FALSE;
  264. }
  265. HKEY hSubKey;
  266. if(RegOpenKeyEx(hkey, sSubKey, 0, KEY_ALL_ACCESS, &hSubKey) != ERROR_SUCCESS)
  267. return FALSE;
  268. __try
  269. {
  270. if(RegDeleteValue(hSubKey, sItem) == ERROR_SUCCESS)
  271. return TRUE;
  272. }
  273. __finally
  274. {
  275. RegCloseKey(hSubKey);
  276. }
  277. return FALSE;
  278. }