//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 // // File: trackva.cxx // // Contents: Track virtual address reservations made through VirtualAlloc // // History: 15-Mar-96 dlee Created. // // Notes: No header/tail checking is done in this allocator. // Assumes all entry points are called under a lock. // //---------------------------------------------------------------------------- #include #pragma hdrstop DECLARE_DEBUG( va ); DECLARE_INFOLEVEL( va ); #define vaDebugOut(x) vaInlineDebugOut x const unsigned VM_SIZE = 0x80000000; const unsigned VM_GRANULARITY = 0x00010000; const unsigned VM_REPORTUNIT = 2; inline OffsetInArray( PVOID lpAddr ) { return ((ULONG)lpAddr / VM_GRANULARITY) * VM_REPORTUNIT; } inline SizeToCount( ULONG cb ) { return ((ULONG)(cb + VM_GRANULARITY - 1) / VM_GRANULARITY) * VM_REPORTUNIT; } //+------------------------------------------------------------------------- // // Function: RecordVirtualAlloc, private // // Synopsis: Record VirtualAlloc Memory reservations in the pbVmTracker // array // //+------------------------------------------------------------------------- char * pbVmTracker = 0; void RecordVirtualAlloc( char * pszSig, PVOID lpAddr, DWORD dwSize) { if (pbVmTracker == 0) { pbVmTracker = (char*) VirtualAlloc( 0, (VM_SIZE/VM_GRANULARITY) * VM_REPORTUNIT, MEM_COMMIT, PAGE_READWRITE ); RecordVirtualAlloc( "Vmtracker", pbVmTracker, VM_SIZE/VM_GRANULARITY ); } unsigned iOff = OffsetInArray( lpAddr ); unsigned cbSize = SizeToCount( dwSize ); char *psz = &pbVmTracker[ iOff ]; char * pszIn = pszSig; while (cbSize--) { *psz++ = *pszIn++; if (*pszIn == '\0') pszIn = pszSig; } } //+------------------------------------------------------------------------- // // Function: TrackVirtualAlloc, public // // Synopsis: Track VirtualAlloc Memory reservations // //+------------------------------------------------------------------------- PVOID TrackVirtualAlloc( char * pszSig, PVOID lpAddr, DWORD dwSize, DWORD flAllocationType, DWORD flProtect ) { PVOID lpRet = VirtualAlloc( lpAddr, dwSize, flAllocationType, flProtect ); if ( flAllocationType == MEM_RESERVE || (lpAddr == 0 && flAllocationType == MEM_COMMIT) ) { if ( 0 == lpRet ) { // vaDebugOut(( DEB_WARN, // "VirtualAlloc with MEM_RESERVE for tag %s failed\n", // pszSig )); } else { RecordVirtualAlloc( pszSig, lpRet, dwSize ); } } return lpRet; } BOOL TrackVirtualFree( PVOID lpAddr, DWORD dwSize, DWORD flFreeType ) { BOOL fRet = VirtualFree( lpAddr, dwSize, flFreeType ); if ( !fRet ) { // vaDebugOut(( DEB_WARN, // "VirtualFree( %08x, %08x, %d ) failed\n", // lpAddr, dwSize, flFreeType )); } else if ( flFreeType == MEM_RELEASE ) { unsigned iOff = OffsetInArray( lpAddr ); pbVmTracker[ iOff ] = '\0'; } return fRet; } PVOID TrackMapViewOfFile ( char * pszSig, HANDLE hMap, DWORD fWrite, DWORD offHigh, DWORD offLow, DWORD cb ) { void* buf = MapViewOfFile ( hMap, fWrite, offHigh, offLow, cb ); if ( 0 != buf ) { RecordVirtualAlloc( pszSig, buf, cb ); } else { // vaDebugOut(( DEB_WARN, // "MapViewOfFile for tag %s failed\n", // pszSig )); } return buf; } BOOL TrackUnmapViewOfFile( PVOID lpAddr ) { if ( !UnmapViewOfFile(lpAddr) ) { // vaDebugOut(( DEB_WARN, // "UnMapViewOfFile (%08x) failed\n", // lpAddr )); return FALSE; } else { unsigned iOff = OffsetInArray( lpAddr ); pbVmTracker[ iOff ] = '\0'; return TRUE; } }