KMemBase.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:9k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //---------------------------------------------------------------------------
  2. // Sword3 Engine (c) 1999-2000 by Kingsoft
  3. //
  4. // File: KMemBase.cpp
  5. // Date: 2000.08.08
  6. // Code: WangWei(Daphnis)
  7. // Desc: Memory base functions
  8. //---------------------------------------------------------------------------
  9. #include "KWin32.h"
  10. #include "KDebug.h"
  11. #include "KNode.h"
  12. #include "KList.h"
  13. #include "KMemBase.h"
  14. #include <string.h>
  15. //---------------------------------------------------------------------------
  16. class KMemNode : public KNode
  17. {
  18. public:
  19. DWORD m_dwMemSize;//内存大小
  20. DWORD m_dwMemSign;//内存标志
  21. };
  22. //---------------------------------------------------------------------------
  23. class KMemList : public KList
  24. {
  25. public:
  26. ~KMemList()
  27. {
  28. KMemNode* pNode = (KMemNode*)GetHead();
  29. while (pNode)
  30. {
  31. g_DebugLog("KMemList::Leak Detected, Size = %d", pNode->m_dwMemSize);
  32. pNode = (KMemNode*)pNode->GetNext();
  33. }
  34. };
  35. void ShowUsage()
  36. {
  37. KMemNode* pNode = (KMemNode*)GetHead();
  38. DWORD dwMemSize = 0;
  39. while (pNode)
  40. {
  41. dwMemSize += pNode->m_dwMemSize;
  42. pNode = (KMemNode*)pNode->GetNext();
  43. }
  44. g_DebugLog("Memory Usage Size = %d KB", dwMemSize / 1024);
  45. }
  46. };
  47. static KMemList m_MemList;
  48. //---------------------------------------------------------------------------
  49. #define MEMSIGN 1234567890
  50. //---------------------------------------------------------------------------
  51. // 函数: g_MemInfo
  52. // 功能: Memory Infomation
  53. // 参数: void
  54. // 返回: void
  55. //---------------------------------------------------------------------------
  56. ENGINE_API void g_MemInfo()
  57. {
  58. // MEMORYSTATUS stat;
  59. // GlobalMemoryStatus(&stat);
  60. // g_DebugLog("Total Physical Memory = %d MB", stat.dwTotalPhys >> 20);
  61. // g_DebugLog("Total Virtual Memory = %d MB", stat.dwTotalVirtual >> 20);
  62. // g_DebugLog("%d percent of memory is in use.", stat.dwMemoryLoad);
  63. }
  64. //---------------------------------------------------------------------------
  65. // 函数: g_MemAlloc
  66. // 功能: 分配内存
  67. // 参数: dwSize 内存块大小
  68. // 返回: lpMem (lpMem = NULL 表示分配失败)
  69. //---------------------------------------------------------------------------
  70. ENGINE_API LPVOID g_MemAlloc(DWORD dwSize)
  71. {
  72. // HANDLE hHeap = GetProcessHeap();
  73. PBYTE  lpMem = NULL;
  74. DWORD  dwHeapSize = dwSize + sizeof(KMemNode);
  75. // lpMem = (PBYTE)HeapAlloc(hHeap, 0, dwHeapSize);
  76. lpMem = (PBYTE)new char[dwHeapSize];
  77. if (NULL == lpMem)
  78. {
  79. g_MessageBox("g_MemAlloc() Failed, Size = %d", dwSize);
  80. return NULL;
  81. }
  82. KMemNode* pNode = (KMemNode*)lpMem;
  83. pNode->m_pPrev = NULL;
  84. pNode->m_pNext = NULL;
  85. pNode->m_dwMemSize = dwSize;
  86. pNode->m_dwMemSign = MEMSIGN;
  87. m_MemList.AddHead(pNode);
  88. return (lpMem + sizeof(KMemNode));
  89. // return 0;
  90. }
  91. //---------------------------------------------------------------------------
  92. // 函数: g_MemFree
  93. // 功能: 释放内存
  94. // 参数: lpMem 要释放的内存指针
  95. // 返回: void
  96. //---------------------------------------------------------------------------
  97. ENGINE_API void g_MemFree(LPVOID lpMem)
  98. {
  99. // HANDLE hHeap = GetProcessHeap();
  100. if (lpMem == NULL)
  101. return;
  102. lpMem = (PBYTE)lpMem - sizeof(KMemNode);
  103. KMemNode* pNode = (KMemNode *)lpMem;
  104. if (pNode->m_dwMemSign != MEMSIGN)
  105. {
  106. g_MessageBox("g_MemFree() Failed, Size = %d", pNode->m_dwMemSize);
  107. return;
  108. }
  109. pNode->Remove();
  110. // HeapFree(hHeap, 0, lpMem);
  111. delete[] lpMem;
  112. }
  113. //---------------------------------------------------------------------------
  114. // 函数: MemoryCopy
  115. // 功能: 内存拷贝
  116. // 参数: lpDest : 目标内存块
  117. // lpSrc : 源内存块
  118. // dwLen : 拷贝长度
  119. // 返回: void
  120. //---------------------------------------------------------------------------
  121. ENGINE_API void g_MemCopy(PVOID lpDest, PVOID lpSrc, DWORD dwLen)
  122. {
  123. #ifdef WIN32
  124. __asm
  125. {
  126. mov edi, lpDest
  127. mov esi, lpSrc
  128. mov ecx, dwLen
  129. mov     ebx, ecx
  130. shr     ecx, 2
  131. rep     movsd
  132. mov     ecx, ebx
  133. and     ecx, 3
  134. rep     movsb
  135. }
  136. #else
  137.      memcpy(lpDest, lpSrc, dwLen);
  138. #endif
  139. }
  140. //---------------------------------------------------------------------------
  141. // 函数: MemoryCopyMmx
  142. // 功能: 内存拷贝(MMX版本)
  143. // 参数: lpDest : 目标内存块
  144. // lpSrc : 源内存块
  145. // dwLen : 拷贝长度
  146. // 返回: void
  147. //---------------------------------------------------------------------------
  148. ENGINE_API void g_MemCopyMmx(PVOID lpDest, PVOID lpSrc, DWORD dwLen)
  149. {
  150. #ifdef WIN32
  151. __asm
  152. {
  153. mov edi, lpDest
  154. mov esi, lpSrc
  155. mov ecx, dwLen
  156. mov     ebx, ecx
  157. shr     ecx, 3
  158. jcxz loc_copy_mmx2
  159. loc_copy_mmx1:
  160. movq mm0, [esi]
  161. add esi, 8
  162. movq [edi], mm0
  163. add edi, 8
  164. dec ecx
  165. jnz loc_copy_mmx1
  166. loc_copy_mmx2:
  167. mov     ecx, ebx
  168. and     ecx, 7
  169. rep     movsb
  170. emms
  171. }
  172. #else
  173.      memcpy(lpDest, lpSrc, dwLen);
  174. #endif
  175. }
  176. //---------------------------------------------------------------------------
  177. // 函数: MemoryComp
  178. // 功能: 内存比较
  179. // 参数: lpDest : 内存块1
  180. // lpSrc : 内存块2
  181. // dwLen : 比较长度
  182. // 返回: TRUE : 相同
  183. // FALSE : 不同
  184. //---------------------------------------------------------------------------
  185. ENGINE_API BOOL g_MemComp(PVOID lpDest, PVOID lpSrc, DWORD dwLen)
  186. {
  187. #ifdef WIN32
  188. __asm
  189. {
  190. mov edi, lpDest
  191. mov esi, lpSrc
  192. mov ecx, dwLen
  193. mov     ebx, ecx
  194. shr     ecx, 2
  195. rep     cmpsd
  196. jne loc_not_equal
  197. mov     ecx, ebx
  198. and     ecx, 3
  199. rep     cmpsb
  200. jne loc_not_equal
  201. };
  202. return TRUE;
  203. loc_not_equal:
  204. return FALSE;
  205. #else
  206.      return (0 == memcmp(lpDest, lpSrc, dwLen));
  207. #endif
  208. }
  209. //---------------------------------------------------------------------------
  210. // 函数: MemoryFill
  211. // 功能: 内存填充
  212. // 参数: lpDest : 内存地址
  213. // dwLen : 内存长度
  214. // byFill : 填充字节
  215. // 返回: void
  216. //---------------------------------------------------------------------------
  217. ENGINE_API void g_MemFill(PVOID lpDest, DWORD dwLen, BYTE byFill)
  218. {
  219. #ifdef WIN32
  220. __asm
  221. {
  222. mov edi, lpDest
  223. mov ecx, dwLen
  224. mov al, byFill
  225. mov ah, al
  226. mov bx, ax
  227. shl eax, 16
  228. mov ax, bx
  229. mov ebx, ecx
  230. shr ecx, 2
  231. rep     stosd
  232. mov     ecx, ebx
  233. and ecx, 3
  234. rep     stosb
  235. }
  236. #else
  237.      memset(lpDest, byFill, dwLen);
  238. #endif
  239. }
  240. //---------------------------------------------------------------------------
  241. // 函数: MemoryFill
  242. // 功能: 内存填充
  243. // 参数: lpDest : 内存地址
  244. // dwLen : 内存长度
  245. // wFill : 填充字
  246. // 返回: void
  247. //---------------------------------------------------------------------------
  248. ENGINE_API void g_MemFill(PVOID lpDest, DWORD dwLen, WORD wFill)
  249. {
  250. #ifdef WIN32
  251. __asm
  252. {
  253. mov edi, lpDest
  254. mov ecx, dwLen
  255. mov ax, wFill
  256. mov bx, ax
  257. shl eax, 16
  258. mov ax, bx
  259. mov ebx, ecx
  260. shr ecx, 1
  261. rep     stosd
  262. mov     ecx, ebx
  263. and ecx, 1
  264. rep     stosw
  265. }
  266. #else
  267.      memset(lpDest, wFill & 0xff, dwLen);
  268. #endif
  269. }
  270. //---------------------------------------------------------------------------
  271. // 函数: MemoryFill
  272. // 功能: 内存填充
  273. // 参数: lpDest : 内存地址
  274. // dwLen : 内存长度
  275. // dwFill : 填充字
  276. // 返回: void
  277. //---------------------------------------------------------------------------
  278. ENGINE_API void g_MemFill(PVOID lpDest, DWORD dwLen, DWORD dwFill)
  279. {
  280. #ifdef WIN32
  281. __asm
  282. {
  283. mov edi, lpDest
  284. mov ecx, dwLen
  285. mov eax, dwFill
  286. rep     stosd
  287. }
  288. #else
  289.      memset(lpDest, dwFill & 0xff, dwLen);
  290. #endif
  291. }
  292. //---------------------------------------------------------------------------
  293. // 函数: MemoryZero
  294. // 功能: 内存清零
  295. // 参数: lpDest : 内存地址
  296. // dwLen : 内存长度
  297. // 返回: void
  298. //---------------------------------------------------------------------------
  299. ENGINE_API void g_MemZero(PVOID lpDest, DWORD dwLen)
  300. {
  301. #ifdef WIN32
  302. __asm
  303. {
  304. mov ecx, dwLen
  305. mov edi, lpDest
  306. xor     eax, eax
  307. mov ebx, ecx
  308. shr ecx, 2
  309. rep     stosd
  310. mov     ecx, ebx
  311. and ecx, 3
  312. rep     stosb
  313. }
  314. #else
  315.      memset(lpDest, 0, dwLen);
  316. #endif
  317. }
  318. //---------------------------------------------------------------------------
  319. // 函数: MemoryXore
  320. // 功能: 内存异或
  321. // 参数: lpDest : 内存地址
  322. // dwLen : 内存长度
  323. // dwXor : 异或字节
  324. // 返回: void
  325. //---------------------------------------------------------------------------
  326. ENGINE_API void g_MemXore(PVOID lpDest, DWORD dwLen, DWORD dwXor)
  327. {
  328. #ifdef WIN32
  329. __asm
  330. {
  331. mov edi, lpDest
  332. mov ecx, dwLen
  333. mov eax, dwXor
  334. shr ecx, 2
  335. cmp ecx, 0
  336. jle loc_xor_exit
  337. loc_xor_loop:
  338. xor [edi], eax
  339. add edi, 4
  340. dec ecx
  341. jnz loc_xor_loop
  342. loc_xor_exit:
  343. }
  344. #else
  345.      unsigned long *ptr = (unsigned long *)lpDest;
  346.      while((long)dwLen > 0) {
  347.        *ptr++ ^= dwXor;
  348.        dwLen -= sizeof(unsigned long);
  349.      }
  350. #endif
  351. }