| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Static class for hooking Win32 API routines. | 5 // Static class for hooking Win32 API routines. |
| 6 | 6 |
| 7 // Some notes about how to hook Memory Allocation Routines in Windows. | 7 // Some notes about how to hook Memory Allocation Routines in Windows. |
| 8 // | 8 // |
| 9 // For our purposes we do not hook the libc routines. There are two | 9 // For our purposes we do not hook the libc routines. There are two |
| 10 // reasons for this. First, the libc routines all go through HeapAlloc | 10 // reasons for this. First, the libc routines all go through HeapAlloc |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 210 } | 210 } |
| 211 | 211 |
| 212 static LPVOID WINAPI Perftools_HeapReAlloc(HANDLE hHeap, DWORD dwFlags, | 212 static LPVOID WINAPI Perftools_HeapReAlloc(HANDLE hHeap, DWORD dwFlags, |
| 213 LPVOID lpMem, SIZE_T dwBytes) { | 213 LPVOID lpMem, SIZE_T dwBytes) { |
| 214 // Don't call realloc, but instead do a free/malloc. The problem is that | 214 // Don't call realloc, but instead do a free/malloc. The problem is that |
| 215 // the builtin realloc may either expand a buffer, or it may simply | 215 // the builtin realloc may either expand a buffer, or it may simply |
| 216 // just call free/malloc. If so, we will already have tracked the new | 216 // just call free/malloc. If so, we will already have tracked the new |
| 217 // block via Perftools_HeapAlloc. | 217 // block via Perftools_HeapAlloc. |
| 218 | 218 |
| 219 LPVOID rv = Perftools_HeapAlloc(hHeap, dwFlags, dwBytes); | 219 LPVOID rv = Perftools_HeapAlloc(hHeap, dwFlags, dwBytes); |
| 220 DCHECK_EQ((HEAP_REALLOC_IN_PLACE_ONLY & dwFlags), 0); | 220 DCHECK_EQ((HEAP_REALLOC_IN_PLACE_ONLY & dwFlags), 0u); |
| 221 | 221 |
| 222 // If there was an old buffer, now copy the data to the new buffer. | 222 // If there was an old buffer, now copy the data to the new buffer. |
| 223 if (lpMem != 0) { | 223 if (lpMem != 0) { |
| 224 size_t size = HeapSize(hHeap, 0, lpMem); | 224 size_t size = HeapSize(hHeap, 0, lpMem); |
| 225 if (size > dwBytes) | 225 if (size > dwBytes) |
| 226 size = dwBytes; | 226 size = dwBytes; |
| 227 // Note: size could be 0; HeapAlloc does allocate 0 length buffers. | 227 // Note: size could be 0; HeapAlloc does allocate 0 length buffers. |
| 228 memcpy(rv, lpMem, size); | 228 memcpy(rv, lpMem, size); |
| 229 Perftools_HeapFree(hHeap, dwFlags, lpMem); | 229 Perftools_HeapFree(hHeap, dwFlags, lpMem); |
| 230 } | 230 } |
| (...skipping 28 matching lines...) Expand all Loading... |
| 259 return result; | 259 return result; |
| 260 } | 260 } |
| 261 | 261 |
| 262 static BOOL WINAPI Perftools_VirtualFreeEx(HANDLE process, LPVOID address, | 262 static BOOL WINAPI Perftools_VirtualFreeEx(HANDLE process, LPVOID address, |
| 263 SIZE_T size, DWORD type) { | 263 SIZE_T size, DWORD type) { |
| 264 int chunk_size = size; | 264 int chunk_size = size; |
| 265 MEMORY_BASIC_INFORMATION info; | 265 MEMORY_BASIC_INFORMATION info; |
| 266 CHECK(VirtualQuery(address, &info, sizeof(info))); | 266 CHECK(VirtualQuery(address, &info, sizeof(info))); |
| 267 if (chunk_size == 0) | 267 if (chunk_size == 0) |
| 268 chunk_size = info.RegionSize; | 268 chunk_size = info.RegionSize; |
| 269 bool decommit = (info.State & MEM_COMMIT); | 269 bool decommit = (info.State & MEM_COMMIT) != 0; |
| 270 | 270 |
| 271 if (decommit) | 271 if (decommit) |
| 272 MemoryHook::hook()->OnUntrack(0, reinterpret_cast<int32>(address), | 272 MemoryHook::hook()->OnUntrack(0, reinterpret_cast<int32>(address), |
| 273 chunk_size); | 273 chunk_size); |
| 274 | 274 |
| 275 return patch_VirtualFreeEx()(process, address, size, type); | 275 return patch_VirtualFreeEx()(process, address, size, type); |
| 276 } | 276 } |
| 277 | 277 |
| 278 static base::Lock known_maps_lock; | 278 static base::Lock known_maps_lock; |
| 279 static std::map<void*, int> known_maps; | 279 static std::map<void*, int> known_maps; |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 553 } | 553 } |
| 554 | 554 |
| 555 void MemoryHook::OnUntrack(HANDLE heap, int32 id, int32 size) { | 555 void MemoryHook::OnUntrack(HANDLE heap, int32 id, int32 size) { |
| 556 // Don't notify about allocations to our internal heap. | 556 // Don't notify about allocations to our internal heap. |
| 557 if (heap == heap_) | 557 if (heap == heap_) |
| 558 return; | 558 return; |
| 559 | 559 |
| 560 if (watcher_) | 560 if (watcher_) |
| 561 watcher_->OnUntrack(heap, id, size); | 561 watcher_->OnUntrack(heap, id, size); |
| 562 } | 562 } |
| OLD | NEW |