lmem.c
来自「wince下的源代码集合打包」· C语言 代码 · 共 490 行 · 第 1/2 页
C
490 行
@parm DWORD | dwFlags | HEAP_NO_SERIALIZE and HEAP_ZERO_MEM supported @parm DWORD | dwBytes | Desired size of block*/LPVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, DWORD dwBytes) { LPVOID p; DEBUGMSG(DBGLMEM, (L"HeapAlloc %8.8lx %8.8lx %8.8lx\r\n", hHeap,dwFlags,dwBytes)); if((dwFlags & ~(HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY)) || !hHeap) { DEBUGMSG(DBGLMEM, (L" HeapAlloc %8.8lx %8.8lx %8.8lx ==> %8.8lx\r\n", hHeap,dwFlags,dwBytes,0)); SetLastError(ERROR_INVALID_PARAMETER); return NULL; } EnterCriticalSection(&hcs); if (!(p=FixedHeapAlloc((pheap)hHeap,dwBytes,(dwFlags & HEAP_ZERO_MEMORY?1:0)))) SetLastError(ERROR_NOT_ENOUGH_MEMORY);#ifdef MEMTRACKING if (p) AddTrackedItem(((pheap)hHeap)->dwMemType,p,TCB,GetCurrentProcessId(),FixedHeapSize((pheap)hHeap,p),0,0);#endif CELOG_HeapAlloc(hHeap, dwFlags, dwBytes, (DWORD) p); DEBUGMSG(DBGLMEM, (L" HeapAlloc %8.8lx %8.8lx %8.8lx ==> %8.8lx\r\n", hHeap,dwFlags,dwBytes,p)); DEBUGCHK(!p || ((FixedHeapSize((pheap)hHeap,p) >= dwBytes) && (FixedHeapSize((pheap)hHeap,p) != (DWORD)-1))); LeaveCriticalSection(&hcs); return p; }/* @doc BOTH EXTERNAL @func BOOL | HeapFree | Frees a HeapAlloc'ed block of memory @parm HANDLE | hHeap | Handle returned from CreateHeap() @parm DWORD | dwFlags | HEAP_NO_SERIALIZE only @parm LPVOID | lpMem | Pointer to memory block*/BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) { BOOL retval; DEBUGMSG(DBGLMEM, (L"HeapFree %8.8lx %8.8lx %8.8lx\r\n",hHeap,dwFlags,lpMem)); if ((dwFlags & ~HEAP_NO_SERIALIZE) || !hHeap || !lpMem) { DEBUGMSG(DBGLMEM, (L" HeapFree %8.8lx %8.8lx %8.8lx ==> %8.8lx\r\n", hHeap,dwFlags,lpMem,0)); SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } EnterCriticalSection(&hcs); CELOG_HeapFree(hHeap, dwFlags, (DWORD)lpMem); retval = FixedHeapFree((pheap)hHeap,lpMem);#ifdef MEMTRACKING if (retval) DeleteTrackedItem(((pheap)hHeap)->dwMemType, lpMem);#endif DEBUGMSG(DBGLMEM, (L"HeapFree %8.8lx %8.8lx %8.8lx ==> %8.8lx\r\n",hHeap,dwFlags,lpMem,retval)); LeaveCriticalSection(&hcs); return retval;}/* @doc BOTH EXTERNAL @func DWORD | HeapSize | Returns the size of a HeapAlloc'ed block of memory @parm HANDLE | hHeap | Heap from which memory was alloc'ed @parm DWORD | dwFlags | can be HEAP_NO_SERIALIZE @parm LPVOID | lpMem | handle of local memory object to get size of @comm Follows the Win32 reference description without restrictions or modifications. */DWORD WINAPI HeapSize(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) { UINT retval; DEBUGMSG(DBGLMEM, (L"HeapSize %8.8lx\r\n",lpMem)); if (dwFlags & ~HEAP_NO_SERIALIZE) { DEBUGMSG(DBGLMEM, (L" HeapSize %8.8lx: Invalid parameter\r\n")); SetLastError(ERROR_INVALID_PARAMETER); return (DWORD)-1; } EnterCriticalSection(&hcs); retval = FixedHeapSize(hHeap,lpMem); DEBUGMSG(DBGLMEM, (L" HeapSize %8.8lx ==> %8.8lx\r\n",lpMem,retval)); LeaveCriticalSection(&hcs); return retval;}/* @doc BOTH EXTERNAL @func BOOL | HeapDestroy | Destroys a heap and releases its memory @parm HANDLE | hHeap | Handle returned from CreateHeap()*/BOOL WINAPI HeapDestroy(HANDLE hHeap) { pheap pHeap = (heap *)hHeap; pheap pHeapTrav, pHeapNext; vaheapalloc *pva, *pvanext; LPBYTE pMem;#ifdef MEMTRACKING LPVOID ptr;#endif DEBUGMSG(DBGLMEM, (L"HeapDestroy %8.8lx\r\n",hHeap)); if(!hHeap) { SetLastError(ERROR_INVALID_PARAMETER); DEBUGMSG(DBGLMEM, (L" HeapDestroy %8.8lx ==> %8.8lx\r\n", hHeap,0)); return FALSE; } CELOG_HeapDestroy(hHeap); EnterCriticalSection(&hcs); pva = pHeap->pVallocs; while (pva) { pvanext = pva->pnext;#if MEMTRACKING DeleteTrackedItem(pHeap->dwMemType, pva->pBase);#endif VirtualFree(pva->pBase,0,MEM_RELEASE); FixedHeapFree(hHeap,pva); pva = pvanext; } if (ProcessHeap.pNextHeap == pHeap) ProcessHeap.pNextHeap = pHeap->pNextHeap; else { pHeapTrav = ProcessHeap.pNextHeap; while (pHeapTrav->pNextHeap != pHeap) pHeapTrav = pHeapTrav->pNextHeap; pHeapTrav->pNextHeap = pHeap->pNextHeap; } pHeapTrav = pHeap; while (pHeapTrav) { pHeapNext = pHeapTrav->pGrowthHeap; if (pHeapTrav->pMem) {#ifdef MEMTRACKING ptr = pHeapTrav->pMem; do { if (HEAPTOPTR(ptr) != pHeapTrav) { // don't free heap itself if (!IsSigValid(pHeapTrav,ptr,1)) DEBUGCHK(0); if (ISINUSE(ptr)) DeleteTrackedItem(pHeapTrav->dwMemType, HEAPTOPTR(ptr)); } } while ((ptr = NEXTBLOCK(pHeapTrav, ptr)) != pHeapTrav->pMem);#endif pMem = pHeapTrav->pMem; VirtualFree(pMem,pHeap->dwMaximumSize,MEM_DECOMMIT); VirtualFree(pMem, 0, MEM_RELEASE); } pHeapTrav = pHeapNext; } LocalFree(pHeap);#ifdef MEMTRACKING DeleteTrackedItem(dwHeapMemType, hHeap);#endif LeaveCriticalSection(&hcs); return TRUE;}void CompactAllHeaps(void) { pheap pHeap, pHeap2; EnterCriticalSection(&hcs); for (pHeap = &ProcessHeap; pHeap; pHeap = pHeap->pNextHeap) for (pHeap2 = pHeap; pHeap2; pHeap2 = pHeap2->pGrowthHeap) FixedHeapCompact(pHeap2); LeaveCriticalSection(&hcs);}/* @doc BOTH EXTERNAL @func HANDLE | GetProcessHeap | Obtains a handle to the heap of the calling process*/HANDLE WINAPI GetProcessHeap(VOID) { return (HANDLE)&ProcessHeap;}BOOL FillInOneHeap(THSNAP *pSnap, heap *pBaseHeap, TH32HEAPENTRY **ppNext) { heap *pHeap; LPBYTE ptr; vaheapalloc *vaptr; for (pHeap = pBaseHeap; pHeap; pHeap = pHeap->pGrowthHeap) { if (ptr = pHeap->pMem) { do { if (!(*ppNext = (TH32HEAPENTRY *)THGrow(pSnap,sizeof(TH32HEAPENTRY)))) return FALSE; (*ppNext)->heapentry.dwSize = sizeof(TH32HEAPENTRY); (*ppNext)->heapentry.hHandle = (HANDLE)ptr; (*ppNext)->heapentry.dwAddress = (DWORD)ptr; (*ppNext)->heapentry.dwBlockSize = HDRSIZE + ITEMSIZE(ptr); (*ppNext)->heapentry.dwFlags = ISFREE(ptr) ? LF32_FREE : ISDEAD(ptr) ? LF32_FREE | LF32_DECOMMIT : LF32_FIXED; (*ppNext)->heapentry.dwLockCount = ISINUSE(ptr) ? 1 : 0; (*ppNext)->heapentry.dwResvd = 0; (*ppNext)->heapentry.th32ProcessID = GetCurrentProcessId(); (*ppNext)->heapentry.th32HeapID = (DWORD)pBaseHeap; ppNext = &(*ppNext)->pNext; } while ((ptr = NEXTBLOCK(pHeap, ptr)) != pHeap->pMem); } } for (vaptr = pBaseHeap->pVallocs; vaptr; vaptr = vaptr->pnext) { if (!(*ppNext = (TH32HEAPENTRY *)THGrow(pSnap,sizeof(TH32HEAPENTRY)))) return FALSE; (*ppNext)->heapentry.dwSize = sizeof(TH32HEAPENTRY); (*ppNext)->heapentry.hHandle = (HANDLE)vaptr->pBase; (*ppNext)->heapentry.dwAddress = (DWORD)vaptr->pBase; (*ppNext)->heapentry.dwBlockSize = vaptr->dwSize; (*ppNext)->heapentry.dwFlags = LF32_FIXED | LF32_BIGBLOCK; (*ppNext)->heapentry.dwLockCount = 1; (*ppNext)->heapentry.dwResvd = 0; (*ppNext)->heapentry.th32ProcessID = GetCurrentProcessId(); (*ppNext)->heapentry.th32HeapID = (DWORD)pBaseHeap; ppNext = &(*ppNext)->pNext; } *ppNext = 0; return TRUE;}BOOL GetHeapSnapshot(THSNAP *pSnap, BOOL bMainOnly, LPVOID *pDataPtr) { heap *pHeap; // Must set permissions since we're in a callback and it's possible pSnap is in an intermediate process // context we can no longer see. We don't need to restore the old permissions, since when we return // from this function, they'll be restored by the system SetProcPermissions((DWORD)-1); EnterCriticalSection(&hcs); if (bMainOnly) { if (!FillInOneHeap(pSnap,&ProcessHeap,(TH32HEAPENTRY **)pDataPtr)) { LeaveCriticalSection(&hcs); return FALSE; } } else { TH32HEAPLIST **ppNext; ppNext = (TH32HEAPLIST **)pDataPtr; for (pHeap = &ProcessHeap; pHeap; pHeap = pHeap->pNextHeap) { if (!(*ppNext = (TH32HEAPLIST *)THGrow(pSnap,sizeof(TH32HEAPLIST)))) { LeaveCriticalSection(&hcs); return FALSE; } (*ppNext)->heaplist.dwSize = sizeof(HEAPLIST32); (*ppNext)->heaplist.th32ProcessID = GetCurrentProcessId(); (*ppNext)->heaplist.th32HeapID = (DWORD)pHeap; (*ppNext)->heaplist.dwFlags = pHeap == &ProcessHeap ? HF32_DEFAULT : 0; if (!FillInOneHeap(pSnap,pHeap,&(*ppNext)->pHeapEntry)) { LeaveCriticalSection(&hcs); return FALSE; } ppNext = &(*ppNext)->pNext; } *ppNext = 0; } LeaveCriticalSection(&hcs); return TRUE;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?