/****************************************************************************** * IMalloc32_Alloc [VTABLE] */ static LPVOID WINAPI IMalloc_fnAlloc(LPMALLOC iface, DWORD cb) { LPVOID addr; TRACE("(%d)\n",cb); if(Malloc32.pSpy) { DWORD preAllocResult; EnterCriticalSection(&IMalloc32_SpyCS); preAllocResult = IMallocSpy_PreAlloc(Malloc32.pSpy, cb); if ((cb != 0) && (preAllocResult == 0)) { /* PreAlloc can force Alloc to fail, but not if cb == 0 */ TRACE("returning null\n"); LeaveCriticalSection(&IMalloc32_SpyCS); return NULL; } } addr = HeapAlloc(GetProcessHeap(),0,cb); if(Malloc32.pSpy) { addr = IMallocSpy_PostAlloc(Malloc32.pSpy, addr); if (addr) AddMemoryLocation(addr); LeaveCriticalSection(&IMalloc32_SpyCS); } TRACE("--(%p)\n",addr); return addr; }
/****************************************************************************** * IMalloc32_Realloc [VTABLE] */ static LPVOID WINAPI IMalloc_fnRealloc(LPMALLOC iface,LPVOID pv,DWORD cb) { LPVOID pNewMemory; TRACE("(%p,%d)\n",pv,cb); if(Malloc32.pSpy) { LPVOID pRealMemory; BOOL fSpyed; EnterCriticalSection(&IMalloc32_SpyCS); fSpyed = RemoveMemoryLocation(pv); cb = IMallocSpy_PreRealloc(Malloc32.pSpy, pv, cb, &pRealMemory, fSpyed); /* check if can release the spy */ if(Malloc32.SpyReleasePending && !Malloc32.SpyedAllocationsLeft) { IMallocSpy_Release(Malloc32.pSpy); Malloc32.SpyReleasePending = FALSE; Malloc32.pSpy = NULL; LeaveCriticalSection(&IMalloc32_SpyCS); } if (0==cb) { /* PreRealloc can force Realloc to fail */ if (Malloc32.pSpy) LeaveCriticalSection(&IMalloc32_SpyCS); return NULL; } pv = pRealMemory; } if (!pv) pNewMemory = HeapAlloc(GetProcessHeap(),0,cb); else if (cb) pNewMemory = HeapReAlloc(GetProcessHeap(),0,pv,cb); else { HeapFree(GetProcessHeap(),0,pv); pNewMemory = NULL; } if(Malloc32.pSpy) { pNewMemory = IMallocSpy_PostRealloc(Malloc32.pSpy, pNewMemory, TRUE); if (pNewMemory) AddMemoryLocation(pNewMemory); LeaveCriticalSection(&IMalloc32_SpyCS); } TRACE("--(%p)\n",pNewMemory); return pNewMemory; }