// SunAllocHook.cpp #include "SunClientPrecompiledHeader.h" #include "SunAllocHook.h" const int ALLOC_PATTERN_LENGTH = 3; // ¿ØÁö ¾øÀ»¸¸ÇÑ°É WILDCARD·Î »ç¿ëÇÏÀÚ Á¤ °ãÄ¥¶§´Â ´Ù¸¥°ªÀ» DEFINEÇϸéµÈ´Ù. const int ALLOC_WILD_CARD = 999999; int AllocPattern[ALLOC_PATTERN_LENGTH] = {360, 540, 16}; DWORD g_AllocSize = 0; //------------------------------------------------------------------------------ /** */ int SunAllocHook( int nAllocType, void *pvData, size_t nSize, int nBlockUse, long lRequest, const unsigned char * szFileName, int nLine ) { static int iAllocPatternMatch = 0; static int iCurAllocPattern[ALLOC_PATTERN_LENGTH] = {0,}; static long lOldRequest = 0; if (lOldRequest == 0) { lOldRequest = lRequest; } else { if (lRequest > lOldRequest + 1) { _asm nop; } lOldRequest = lRequest; } if (nAllocType == _HOOK_ALLOC) { g_AllocSize += nSize; } else if (nAllocType == _HOOK_FREE) { g_AllocSize -= nSize; } if (iAllocPatternMatch < ALLOC_PATTERN_LENGTH) { iCurAllocPattern[iAllocPatternMatch] = nSize; iAllocPatternMatch++; } else { // Çϳª¾¿ ¾ÕÀ¸·Î ´ç±ä´Ù. for (int a = 0; a < ALLOC_PATTERN_LENGTH - 1; a++) { iCurAllocPattern[a] = iCurAllocPattern[a + 1]; } // ¸Ç³¡¿¡ »õ°Å¸¦ ³Ö´Â´Ù. iCurAllocPattern[ALLOC_PATTERN_LENGTH - 1] = nSize; } if (iAllocPatternMatch == ALLOC_PATTERN_LENGTH) { BOOL bTest = TRUE; for (int a = 0; a < ALLOC_PATTERN_LENGTH; a++) { if (AllocPattern[a] == ALLOC_WILD_CARD) { continue; } if (iCurAllocPattern[a] != AllocPattern[a]) { bTest = FALSE; break; } } if (bTest) { assert( !"¿øÇÏ´Â ÆÐÅÏÀ» ã¾Ò´Ù" ); } } return TRUE; }