ApiInfo.cpp
上传用户:nbcables
上传日期:2007-01-11
资源大小:1243k
文件大小:3k
源码类别:

钩子与API截获

开发平台:

Visual C++

  1. // APIInfo.cpp: implementation of the CAPIInfo class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include <windows.h>
  5. #include "APIInfo.h"
  6. #include "util.h"
  7. //////////////////////////////////////////////////////////////////////
  8. // Construction/Destruction
  9. //////////////////////////////////////////////////////////////////////
  10. #ifdef WIN95
  11. APIINFO g_apiinfo_buf[1000];
  12. #endif
  13. CAPIInfo::CAPIInfo()
  14. {
  15. m_count =0;
  16. m_pInfo =NULL;
  17. }
  18. CAPIInfo::~CAPIInfo()
  19. {
  20. DeleteAll();
  21. }
  22. APIINFO *CAPIInfo::Add(char *module_name, char *api_name, char *my_api_name,
  23. int param_count, APIFUNC old_api, APIFUNC my_api, char *my_friend_api_name, int start_pos)
  24. {
  25. #ifdef WIN95
  26. APIINFO *pinfo =(APIINFO *)&g_apiinfo_buf[m_count];
  27. #else
  28. APIINFO *pinfo =(APIINFO *)malloc(sizeof(APIINFO));
  29. #endif
  30. strcpy(pinfo->module_name, module_name);
  31. strcpy(pinfo->api_name, api_name);
  32. strcpy(pinfo->my_api_name, my_api_name);
  33. pinfo->param_count =param_count;
  34. pinfo->old_api =old_api;
  35. pinfo->my_api =my_api;
  36. if(my_friend_api_name)
  37. strcpy(pinfo->my_friend_api_name, my_friend_api_name);
  38. else pinfo->my_friend_api_name[0] =0;
  39. pinfo->start_pos =start_pos;
  40. pinfo->f_hooked =false;
  41. #ifdef WIN95
  42. pinfo->hMutex =CreateMutex(NULL, FALSE, api_name);
  43. #endif
  44. #ifdef WINNT
  45. InitializeCriticalSection(&pinfo->cs);
  46. #endif
  47. pinfo->pnext =NULL;
  48. APIINFO *pinfo2 =m_pInfo;
  49. while(pinfo2 !=NULL && pinfo2->pnext !=NULL)
  50. pinfo2 =pinfo2->pnext;
  51. if(pinfo2 ==NULL) m_pInfo =pinfo;             // this is head of m_pInfo
  52. else pinfo2->pnext =pinfo;
  53. m_count++;
  54. return pinfo;
  55. }
  56. int CAPIInfo::DeleteAll()
  57. {
  58. APIINFO *pinfo =m_pInfo, *pinfo2;
  59. while(pinfo)
  60. {
  61. pinfo2 =pinfo;
  62. pinfo =pinfo->pnext;
  63. #ifdef WIN95
  64. if (pinfo2->hMutex)
  65. CloseHandle(pinfo2->hMutex);
  66. #else
  67. DeleteCriticalSection(&pinfo2->cs);
  68. free(pinfo2);
  69. #endif
  70. }
  71. m_pInfo =NULL;
  72. m_count =0;
  73. return 0;
  74. }
  75. APIINFO *CAPIInfo::FindByMyAPI(APIFUNC my_api)
  76. {
  77. APIINFO *pinfo =m_pInfo;
  78. while(pinfo)
  79. {
  80. if(pinfo->my_api ==my_api)
  81. break;
  82. pinfo =pinfo->pnext;
  83. }
  84. return pinfo;
  85. }
  86. APIINFO *CAPIInfo::FindByOldAPI(APIFUNC old_api)
  87. {
  88. APIINFO *pinfo =m_pInfo;
  89. while(pinfo)
  90. {
  91. if((BYTE *)pinfo->old_api+pinfo->start_pos ==(BYTE *)old_api)
  92. break;
  93. pinfo =pinfo->pnext;
  94. }
  95. return pinfo;
  96. }
  97. APIINFO *CAPIInfo::FindByAPIName(char *api_name)
  98. {
  99. APIINFO *pinfo =m_pInfo;
  100. while(pinfo)
  101. {
  102. if(!strcmp(pinfo->api_name, api_name))
  103. break;
  104. pinfo =pinfo->pnext;
  105. }
  106. return pinfo;
  107. }
  108. APIINFO *CAPIInfo::FindByMyAPIName(char *my_api_name)
  109. {
  110. APIINFO *pinfo =m_pInfo;
  111. while(pinfo)
  112. {
  113. if(!strcmp(pinfo->my_api_name, my_api_name))
  114. break;
  115. pinfo =pinfo->pnext;
  116. }
  117. return pinfo;
  118. }
  119. int CAPIInfo::lock(APIINFO *pinfo)
  120. {
  121. #ifdef WIN95
  122. if((pinfo->m_hMutex =OpenMutex(MUTEX_ALL_ACCESS, FALSE, pinfo->api_name)) !=NULL)
  123. WaitForSingleObject(pinfo->m_hMutex, INFINITE);
  124. #else
  125. EnterCriticalSection(&pinfo->cs);
  126. #endif
  127. return 0;
  128. }
  129. int CAPIInfo::unlock(APIINFO *pinfo)
  130. {
  131. #ifdef WIN95
  132. if(pinfo->m_hMutex)
  133. {
  134. ReleaseMutex(pinfo->m_hMutex);
  135. CloseHandle(pinfo->m_hMutex);
  136. pinfo->m_hMutex =NULL;
  137. }
  138. #else
  139. LeaveCriticalSection(&pinfo->cs);
  140. #endif
  141. return 0;
  142. }