modCheck.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #include "modCheck.h"
  2. #include <set>
  3. #include <string>
  4. #include <list>
  5. using namespace std;
  6. class modCheckLock
  7. {
  8. public:
  9. modCheckLock() {
  10. static bool isInit = false;
  11. if (!isInit)
  12. {
  13. InitializeCriticalSection(&cs_);
  14. isInit = true;
  15. }
  16. EnterCriticalSection(&cs_);
  17. }
  18. ~modCheckLock() {
  19. LeaveCriticalSection(&cs_);
  20. }
  21. private:
  22. modCheckLock(const modCheckLock&);
  23. modCheckLock& operator=(const modCheckLock&);
  24. private:
  25. static CRITICAL_SECTION cs_;
  26. };
  27. CRITICAL_SECTION modCheckLock::cs_;
  28. void InitResource(toolkitResource &m_resource)
  29. {
  30. ZeroMemory(&m_resource, sizeof(toolkitResource));
  31. m_resource.g_mgr = 0;
  32. m_resource.g_initialized = 0;
  33. m_resource.hprintf_index = 0;
  34. ZeroMemory(m_resource.hprintf_buffer, sizeof(m_resource.hprintf_buffer));
  35. ZeroMemory(m_resource.szCrashID, sizeof(m_resource.szCrashID));
  36. }
  37. class modInfo
  38. {
  39. public:
  40. modInfo(string name)
  41. :m_name(name)
  42. {
  43. InitResource(m_resource);
  44. }
  45. bool operator == (const string name){
  46. return name == this->m_name;
  47. }
  48. void AddModThread(DWORD threadId){
  49. m_threadArr.insert(threadId);
  50. }
  51. bool findModThread(DWORD threadId){
  52. return m_threadArr.end() != m_threadArr.find(threadId);
  53. }
  54. toolkitResource *getResource()
  55. {
  56. return &m_resource;
  57. }
  58. string m_name;
  59. friend BOOL toolkit_setAssign(void *assign);
  60. friend BOOL toolkit_setThreadGroupByAssign(void *assign);
  61. set<DWORD> m_threadArr;
  62. private:
  63. toolkitResource m_resource;
  64. void *m_assign;
  65. };
  66. list<modInfo*> g_modInfoArr;
  67. modInfo* findModInfo(string name)
  68. {
  69. for (list<modInfo*>::iterator i = g_modInfoArr.begin(); i != g_modInfoArr.end(); i++)
  70. {
  71. if (**i == name)
  72. return *i;
  73. }
  74. return NULL;
  75. }
  76. modInfo *findModInfoByThreadId()
  77. {
  78. DWORD threadId = GetCurrentThreadId();
  79. for (list<modInfo*>::iterator i = g_modInfoArr.begin(); i != g_modInfoArr.end(); i++)
  80. {
  81. if ((*i)->findModThread(threadId))
  82. return *i;
  83. }
  84. return NULL;
  85. }
  86. TOOLKIT_API BOOL toolkit_checkThreadInName(DWORD threadId, const char *name)
  87. {
  88. if (NULL == name)
  89. return false;
  90. modCheckLock curLock;
  91. for (list<modInfo*>::iterator i = g_modInfoArr.begin(); i != g_modInfoArr.end(); i++)
  92. {
  93. if (string(name) == (*i)->m_name && (*i)->findModThread(threadId))
  94. return true;
  95. }
  96. return false;
  97. }
  98. TOOLKIT_API BOOL toolkit_CreateModuleInfo(const char *name)
  99. {
  100. if (NULL == name)
  101. return false;
  102. if (NULL != findModInfo(name))
  103. toolkit_DestoryModuleInfo(name);
  104. modCheckLock curLock;
  105. modInfo *curModInfo = new modInfo(name);
  106. g_modInfoArr.push_back(curModInfo);
  107. return true;
  108. }
  109. TOOLKIT_API BOOL toolkit_DestoryModuleInfo(const char *name)
  110. {
  111. if (NULL == name)
  112. return false;
  113. modCheckLock curLock;
  114. for (list<modInfo*>::iterator i = g_modInfoArr.begin(); i != g_modInfoArr.end(); i++)
  115. {
  116. if (**i == name)
  117. {
  118. delete *i;
  119. g_modInfoArr.erase(i);
  120. return true;
  121. }
  122. }
  123. return false;
  124. }
  125. TOOLKIT_API BOOL toolkit_SetthreadGroup(DWORD threadId, const char *name)
  126. {
  127. if (NULL == name)
  128. return false;
  129. modCheckLock curLock;
  130. modInfo *curModInfo = findModInfo(name);
  131. if (NULL == curModInfo)
  132. return false;
  133. curModInfo->AddModThread(threadId);
  134. return true;
  135. }
  136. TOOLKIT_API BOOL toolkit_TerminateThreadExcept(DWORD exceptThreadId, const char *name)
  137. {
  138. if (NULL == name)
  139. return false;
  140. modCheckLock curLock;
  141. modInfo *curModInfo = findModInfo(name);
  142. if (NULL == curModInfo)
  143. return false;
  144. for (set<DWORD>::iterator i = curModInfo->m_threadArr.begin(); i != curModInfo->m_threadArr.end(); i++)
  145. {
  146. if (*i != exceptThreadId)
  147. {
  148. HANDLE currThread = OpenThread(PROCESS_ALL_ACCESS, FALSE, *i);
  149. if (currThread != NULL) //Ïß³Ìδ½áÊø
  150. {
  151. TerminateThread(currThread, -1);
  152. }
  153. }
  154. }
  155. return true;
  156. }
  157. toolkitResource* toolkit_getResource()
  158. {
  159. static toolkitResource *spShellResource = NULL;
  160. modCheckLock curLock;
  161. modInfo *curMod = findModInfoByThreadId();
  162. if (NULL != curMod)
  163. return curMod->getResource();
  164. else if ((NULL != spShellResource))
  165. return spShellResource;
  166. else
  167. {
  168. //MessageBox(NULL,NULL, NULL, 0);
  169. spShellResource = new toolkitResource();
  170. InitResource(*spShellResource);
  171. return spShellResource;
  172. }
  173. return NULL;
  174. }
  175. BOOL toolkit_setAssign(void *assign)
  176. {
  177. if (NULL == assign)
  178. return FALSE;
  179. modCheckLock curLock;
  180. modInfo *curMod = findModInfoByThreadId();
  181. if (NULL != curMod)
  182. {
  183. curMod->m_assign = assign;
  184. return TRUE;
  185. }
  186. return FALSE;
  187. }
  188. BOOL toolkit_setThreadGroupByAssign(void *assign)
  189. {
  190. if (NULL == assign)
  191. return FALSE;
  192. modCheckLock curLock;
  193. for (list<modInfo*>::iterator i = g_modInfoArr.begin(); i != g_modInfoArr.end(); i++)
  194. {
  195. if ((*i)->m_assign == assign)
  196. {
  197. (*i)->AddModThread(GetCurrentThreadId());
  198. return TRUE;
  199. }
  200. }
  201. return FALSE;
  202. }