SysUtils.h
上传用户:jstlsd
上传日期:2007-01-13
资源大小:186k
文件大小:10k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. //---------------------------------------------------------------------------
  2. //
  3. // SysUtils.h
  4. //
  5. // SUBSYSTEM:   Hook system
  6. //
  7. // MODULE:      Hook tool
  8. //
  9. // DESCRIPTION: Common utilities. 
  10. //              Provides interface and implementation of some frequently
  11. //              used functions
  12. // 
  13. //             
  14. // AUTHOR: Ivo Ivanov (ivopi@hotmail.com)
  15. // DATE: 2001 December v1.00
  16. //
  17. //---------------------------------------------------------------------------
  18. #ifndef _SYSUTILS_H_
  19. #define _SYSUTILS_H_
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif // _MSC_VER > 1000
  23. #include "Common.h"
  24. //---------------------------------------------------------------------------
  25. // IsToolHelpSupported
  26. //
  27. //
  28. //---------------------------------------------------------------------------
  29. static BOOL IsToolHelpSupported()
  30. {
  31. BOOL    bResult(FALSE);
  32. HMODULE hModToolHelp;
  33. PROC    pfnCreateToolhelp32Snapshot;
  34. hModToolHelp = ::LoadLibrary( "KERNEL32.DLL" );
  35. if (NULL != hModToolHelp)
  36. {
  37. pfnCreateToolhelp32Snapshot = ::GetProcAddress( 
  38. hModToolHelp,
  39.             "CreateToolhelp32Snapshot"
  40. );
  41. bResult = (NULL != pfnCreateToolhelp32Snapshot);
  42. ::FreeLibrary(hModToolHelp);
  43. } // if
  44. return bResult;
  45. }
  46. //---------------------------------------------------------------------------
  47. // IsPsapiSupported
  48. //
  49. //
  50. //---------------------------------------------------------------------------
  51. static BOOL IsPsapiSupported()
  52. {
  53. BOOL bResult = FALSE;
  54. HMODULE hModPSAPI = NULL;
  55. hModPSAPI = ::LoadLibrary( "PSAPI.DLL" );
  56. bResult = (NULL != hModPSAPI);
  57. if (NULL != hModPSAPI)
  58. ::FreeLibrary(hModPSAPI);
  59. return bResult;
  60. }
  61. //---------------------------------------------------------------------------
  62. // IsWindows9x
  63. //
  64. //
  65. //---------------------------------------------------------------------------
  66. static BOOL WINAPI IsWindows9x() 
  67. {
  68. BOOL bResult = FALSE;
  69. OSVERSIONINFO vi = { sizeof(vi) };
  70. ::GetVersionEx(&vi);
  71. if (vi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) 
  72. bResult = TRUE;
  73. return bResult;
  74. }
  75. //---------------------------------------------------------------------------
  76. // IsWindowsNT4
  77. //
  78. // Inspect whether the OS is Windows NT4
  79. //---------------------------------------------------------------------------
  80. static BOOL WINAPI IsWindowsNT4() 
  81. {
  82.    OSVERSIONINFO vi = { sizeof(vi) };
  83.    ::GetVersionEx(&vi);
  84.    
  85.    return ( (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) && 
  86.         (vi.dwMajorVersion == 4) );
  87. }
  88. //---------------------------------------------------------------------------
  89. // ModuleFromAddress
  90. //
  91. // Returns the HMODULE that contains the specified memory address
  92. //---------------------------------------------------------------------------
  93. static HMODULE ModuleFromAddress(PVOID pv) 
  94. {
  95. MEMORY_BASIC_INFORMATION mbi;
  96. return ((::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0) 
  97.         ? (HMODULE) mbi.AllocationBase : NULL);
  98. }
  99. //---------------------------------------------------------------------------
  100. // GetProcessHostFullName
  101. //
  102. // Return the path and the name of the current process
  103. //---------------------------------------------------------------------------
  104. static BOOL GetProcessHostFullName(char* pszFullFileName)
  105. {
  106. DWORD dwResult = 0;
  107. ::ZeroMemory((PBYTE)pszFullFileName, MAX_PATH);
  108. if (TRUE != ::IsBadReadPtr((PBYTE)pszFullFileName, MAX_PATH))
  109. dwResult = ::GetModuleFileName(
  110. NULL,                   // handle to module
  111. pszFullFileName,        // file name of module
  112. MAX_PATH                // size of buffer
  113. );
  114. return (dwResult != 0);
  115. }
  116. //---------------------------------------------------------------------------
  117. // GetProcessHostName
  118. //
  119. // Return the name of the current process
  120. //---------------------------------------------------------------------------
  121. static BOOL GetProcessHostName(char* pszFullFileName)
  122. {
  123. BOOL  bResult;
  124. char  *pdest;
  125. int   ch = '\';
  126. bResult = GetProcessHostFullName(pszFullFileName);
  127. if (bResult)
  128. {
  129. // Search backward 
  130. pdest = strrchr(pszFullFileName, ch);
  131. if( pdest != NULL )
  132. strcpy(pszFullFileName, &pdest[1]);
  133. } // if
  134. return bResult;
  135. }
  136. //---------------------------------------------------------------------------
  137. // GetProcessHostName
  138. //
  139. // Return the name of the current process
  140. //---------------------------------------------------------------------------
  141. static BOOL ExtractModuleFileName(char* pszFullFileName)
  142. {
  143. BOOL  bResult = FALSE;
  144. if (TRUE != ::IsBadReadPtr(pszFullFileName, MAX_PATH))
  145. {
  146. char  *pdest;
  147. int   ch = '\';
  148. // Search backward 
  149. pdest = strrchr(pszFullFileName, ch);
  150. if( pdest != NULL )
  151. strcpy(pszFullFileName, &pdest[1]);
  152. bResult = TRUE;
  153. } // if
  154. return bResult;
  155. }
  156. //---------------------------------------------------------------------------
  157. // ReplaceFileName
  158. //
  159. //---------------------------------------------------------------------------
  160. static BOOL ReplaceFileName(
  161. char* pszOldFileName,
  162. char* pszBaseNewFileName,
  163. char* pszNewFileName
  164. )
  165. {
  166. BOOL  bResult = FALSE;
  167. char *pdest;
  168. int   ch = '\';
  169. if ( 
  170. (TRUE != ::IsBadReadPtr(pszOldFileName, strlen(pszOldFileName) + 1))  &&
  171. (TRUE != ::IsBadReadPtr(pszBaseNewFileName, strlen(pszBaseNewFileName) + 1))
  172. )
  173. {
  174. if (TRUE != ::IsBadReadPtr(pszNewFileName, MAX_PATH))
  175. {
  176. ::ZeroMemory(pszNewFileName, sizeof(MAX_PATH));
  177. strcpy(pszNewFileName, pszOldFileName);
  178. // Search backward and replaces the dll name with the hook one
  179. pdest = strrchr(pszNewFileName, ch);
  180. if( pdest != NULL )
  181. strcpy(&pdest[1], pszBaseNewFileName);
  182. else
  183. strcpy(pszNewFileName, pszBaseNewFileName);
  184. bResult = TRUE;
  185. } // if
  186. } // if
  187. return bResult;
  188. }
  189. //---------------------------------------------------------------------------
  190. // ReplaceFileName
  191. //
  192. //---------------------------------------------------------------------------
  193. static BOOL ReplaceFileName(
  194. HINSTANCE hOldFile,
  195. char*     pszBaseNewFileName,
  196. char*     pszNewFileName
  197. )
  198. {
  199. BOOL  bResult = FALSE;
  200. char  szFileName[MAX_PATH];
  201. if (TRUE != ::IsBadReadPtr(pszBaseNewFileName, strlen(pszBaseNewFileName) + 1))
  202. {
  203. if (TRUE != ::IsBadReadPtr(pszNewFileName, MAX_PATH))
  204. {
  205. ::ZeroMemory(pszNewFileName, sizeof(MAX_PATH));
  206. if (NULL != hOldFile)
  207. {
  208. if (0 != ::GetModuleFileName(hOldFile, szFileName, MAX_PATH))
  209. bResult = 
  210. ReplaceFileName(
  211. szFileName, 
  212. pszBaseNewFileName, 
  213. pszNewFileName);
  214. } // if
  215. } // if
  216. } // if
  217. return bResult;
  218. }
  219. //
  220. // Converts a string to a boolean value
  221. //
  222. static BOOL StrToBool(const char* pszValue)
  223. {
  224. return ( (0 == stricmp("YES", pszValue)) ||
  225.      (0 == stricmp("Y", pszValue)) ||
  226.      (0 == stricmp("TRUE", pszValue)) );
  227. }
  228. //
  229. // Converts a boolean value to a string
  230. //
  231. static void BoolToStr(BOOL bValue, char* pszResult)
  232. {
  233. bValue ? strcpy(pszResult, "Yes") : 
  234.          strcpy(pszResult, "No");
  235. }
  236. //
  237. // Trims leading spaces and control characters from a string
  238. //
  239. static void TrimLeft(
  240. const char*  pszParam,
  241. char*        pszResult
  242. )
  243. {
  244. char szBuffer[MAX_PATH];
  245. strcpy(szBuffer, "");
  246. if ( (TRUE != ::IsBadStringPtr(pszParam, MAX_PATH)) &&
  247.  (strlen(pszParam) > 0) )
  248. {
  249. DWORD dwIndex = 0;
  250. while ( (dwIndex < strlen(pszParam)) && (pszParam[dwIndex] == ' ') )
  251. dwIndex++;
  252. if (dwIndex < strlen(pszParam))
  253. strcpy(szBuffer, &pszParam[dwIndex]);
  254. } // if
  255. strcpy(pszResult, szBuffer);
  256. }
  257. //
  258. // Trims trailing spaces and control characters from a string
  259. //
  260. static void TrimRight(
  261. const char*  pszParam,
  262. char*        pszResult
  263. )
  264. {
  265. char szBuffer[MAX_PATH];
  266. strcpy(szBuffer, "");
  267. if ( (TRUE != ::IsBadStringPtr(pszParam, MAX_PATH)) &&
  268.  (strlen(pszParam) > 0) )
  269. {
  270. int nIndex = strlen(pszParam) - 1;
  271. while ( (nIndex >= 0) && (pszParam[nIndex] == ' ') )
  272. nIndex--;
  273. if (nIndex >= 0)
  274. {
  275. memcpy(
  276. (PBYTE)szBuffer, 
  277. (PBYTE)pszParam, 
  278. (nIndex + 1)
  279. ); 
  280. szBuffer[nIndex+1] = 0;
  281. } // if
  282. } // if
  283. strcpy(pszResult, szBuffer);
  284. }
  285. //
  286. // Trims leading and trailing spaces and control characters from a string
  287. //
  288. static void Trim(
  289. const char*  pszParam,
  290. char*        pszResult
  291. )
  292. {
  293. TrimLeft(pszParam, pszResult);
  294. TrimRight(pszParam, pszResult);
  295. }
  296. //
  297. // Return next entry of an comma separated string
  298. //
  299. static BOOL GetNextCommaSeparatedString(
  300. const char*  pszParam,
  301. char*        pszResult,
  302. DWORD        dwLength,
  303. long*        pnCommaPos
  304. )
  305. {
  306. *pnCommaPos = -1;
  307. BOOL   bResult = FALSE;
  308. char*  pdest;
  309. strcpy(pszResult, "");
  310. if (strlen(pszParam) > 0)
  311. {
  312. ::ZeroMemory((PBYTE)pszResult, dwLength);
  313. pdest = strstr(pszParam, ",");
  314. if (pdest)
  315. *pnCommaPos = pdest - pszParam - 1;
  316. else
  317. *pnCommaPos = strlen(pszParam);
  318. memcpy(
  319. (PBYTE)pszResult, 
  320. (PBYTE)pszParam, 
  321. ((*pnCommaPos) + 1)
  322. ); 
  323. (*pnCommaPos)++;
  324. Trim(pszResult, pszResult);
  325. bResult = TRUE;
  326. } // if
  327. return bResult;
  328. }
  329. //---------------------------------------------------------------------------
  330. // UnicodeToAnsi
  331. // 
  332. // Tranlsates Unicode to Ansi strings
  333. //---------------------------------------------------------------------------
  334. static BOOL UnicodeToAnsi(
  335. LPWSTR pszwUniString, 
  336. LPSTR  pszAnsiBuff,
  337. DWORD  dwAnsiBuffSize
  338. )
  339. {
  340. int  iRet ;
  341.     iRet = ::WideCharToMultiByte(
  342. CP_ACP,
  343. 0,
  344. pszwUniString,
  345. -1,
  346. pszAnsiBuff,
  347. dwAnsiBuffSize,
  348. NULL,
  349. NULL
  350. );
  351. return (0 != iRet);
  352. }
  353. #endif //_SYSUTILS_H_
  354. //--------------------- End of the file -------------------------------------