| OLD | NEW |
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
| 13 // limitations under the License. | 13 // limitations under the License. |
| 14 | 14 |
| 15 #include "util/win/process_info.h" | 15 #include "util/win/process_info.h" |
| 16 | 16 |
| 17 #include <imagehlp.h> | 17 #include <dbghelp.h> |
| 18 #include <intrin.h> | 18 #include <intrin.h> |
| 19 #include <wchar.h> | 19 #include <wchar.h> |
| 20 | 20 |
| 21 #include "base/files/file_path.h" | 21 #include "base/files/file_path.h" |
| 22 #include "base/memory/scoped_ptr.h" | 22 #include "base/memory/scoped_ptr.h" |
| 23 #include "build/build_config.h" | 23 #include "build/build_config.h" |
| 24 #include "gtest/gtest.h" | 24 #include "gtest/gtest.h" |
| 25 #include "test/paths.h" | 25 #include "test/paths.h" |
| 26 #include "test/win/child_launcher.h" | 26 #include "test/win/child_launcher.h" |
| 27 #include "util/file/file_io.h" | 27 #include "util/file/file_io.h" |
| 28 #include "util/misc/uuid.h" | 28 #include "util/misc/uuid.h" |
| 29 #include "util/win/scoped_handle.h" | 29 #include "util/win/scoped_handle.h" |
| 30 | 30 |
| 31 namespace crashpad { | 31 namespace crashpad { |
| 32 namespace test { | 32 namespace test { |
| 33 namespace { | 33 namespace { |
| 34 | 34 |
| 35 const wchar_t kNtdllName[] = L"\\ntdll.dll"; | 35 const wchar_t kNtdllName[] = L"\\ntdll.dll"; |
| 36 | 36 |
| 37 time_t GetTimestampForModule(HMODULE module) { | |
| 38 char filename[MAX_PATH]; | |
| 39 // `char` and GetModuleFileNameA because ImageLoad is ANSI only. | |
| 40 if (!GetModuleFileNameA(module, filename, arraysize(filename))) | |
| 41 return 0; | |
| 42 LOADED_IMAGE* loaded_image = ImageLoad(filename, nullptr); | |
| 43 return loaded_image->FileHeader->FileHeader.TimeDateStamp; | |
| 44 } | |
| 45 | |
| 46 bool IsProcessWow64(HANDLE process_handle) { | 37 bool IsProcessWow64(HANDLE process_handle) { |
| 47 static decltype(IsWow64Process)* is_wow64_process = | 38 static decltype(IsWow64Process)* is_wow64_process = |
| 48 reinterpret_cast<decltype(IsWow64Process)*>( | 39 reinterpret_cast<decltype(IsWow64Process)*>( |
| 49 GetProcAddress(LoadLibrary(L"kernel32.dll"), "IsWow64Process")); | 40 GetProcAddress(LoadLibrary(L"kernel32.dll"), "IsWow64Process")); |
| 50 if (!is_wow64_process) | 41 if (!is_wow64_process) |
| 51 return false; | 42 return false; |
| 52 BOOL is_wow64; | 43 BOOL is_wow64; |
| 53 if (!is_wow64_process(process_handle, &is_wow64)) { | 44 if (!is_wow64_process(process_handle, &is_wow64)) { |
| 54 PLOG(ERROR) << "IsWow64Process"; | 45 PLOG(ERROR) << "IsWow64Process"; |
| 55 return false; | 46 return false; |
| 56 } | 47 } |
| 57 return is_wow64; | 48 return is_wow64; |
| 58 } | 49 } |
| 59 | 50 |
| 60 void VerifyAddressInInCodePage(const ProcessInfo& process_info, | 51 void VerifyAddressInInCodePage(const ProcessInfo& process_info, |
| 61 WinVMAddress code_address) { | 52 WinVMAddress code_address) { |
| 62 // Make sure the child code address is an code page address with the right | 53 // Make sure the child code address is an code page address with the right |
| 63 // information. | 54 // information. |
| 64 const std::vector<ProcessInfo::MemoryInfo>& memory_info = | 55 const std::vector<MEMORY_BASIC_INFORMATION64>& memory_info = |
| 65 process_info.MemoryInformation(); | 56 process_info.MemoryInfo(); |
| 66 bool found_region = false; | 57 bool found_region = false; |
| 67 for (const auto& mi : memory_info) { | 58 for (const auto& mi : memory_info) { |
| 68 if (mi.base_address <= code_address && | 59 if (mi.BaseAddress <= code_address && |
| 69 mi.base_address + mi.region_size > code_address) { | 60 mi.BaseAddress + mi.RegionSize > code_address) { |
| 70 EXPECT_EQ(MEM_COMMIT, mi.state); | 61 EXPECT_EQ(MEM_COMMIT, mi.State); |
| 71 EXPECT_EQ(PAGE_EXECUTE_READ, mi.protect); | 62 EXPECT_EQ(PAGE_EXECUTE_READ, mi.Protect); |
| 72 EXPECT_EQ(MEM_IMAGE, mi.type); | 63 EXPECT_EQ(MEM_IMAGE, mi.Type); |
| 73 EXPECT_FALSE(found_region); | 64 EXPECT_FALSE(found_region); |
| 74 found_region = true; | 65 found_region = true; |
| 75 } | 66 } |
| 76 } | 67 } |
| 77 EXPECT_TRUE(found_region); | 68 EXPECT_TRUE(found_region); |
| 78 } | 69 } |
| 79 | 70 |
| 80 TEST(ProcessInfo, Self) { | 71 TEST(ProcessInfo, Self) { |
| 81 ProcessInfo process_info; | 72 ProcessInfo process_info; |
| 82 ASSERT_TRUE(process_info.Initialize(GetCurrentProcess())); | 73 ASSERT_TRUE(process_info.Initialize(GetCurrentProcess())); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 103 ASSERT_GE(modules.size(), 2u); | 94 ASSERT_GE(modules.size(), 2u); |
| 104 const wchar_t kSelfName[] = L"\\crashpad_util_test.exe"; | 95 const wchar_t kSelfName[] = L"\\crashpad_util_test.exe"; |
| 105 ASSERT_GE(modules[0].name.size(), wcslen(kSelfName)); | 96 ASSERT_GE(modules[0].name.size(), wcslen(kSelfName)); |
| 106 EXPECT_EQ(kSelfName, | 97 EXPECT_EQ(kSelfName, |
| 107 modules[0].name.substr(modules[0].name.size() - wcslen(kSelfName))); | 98 modules[0].name.substr(modules[0].name.size() - wcslen(kSelfName))); |
| 108 ASSERT_GE(modules[1].name.size(), wcslen(kNtdllName)); | 99 ASSERT_GE(modules[1].name.size(), wcslen(kNtdllName)); |
| 109 EXPECT_EQ( | 100 EXPECT_EQ( |
| 110 kNtdllName, | 101 kNtdllName, |
| 111 modules[1].name.substr(modules[1].name.size() - wcslen(kNtdllName))); | 102 modules[1].name.substr(modules[1].name.size() - wcslen(kNtdllName))); |
| 112 | 103 |
| 113 EXPECT_EQ(modules[0].dll_base, | 104 EXPECT_EQ(reinterpret_cast<uintptr_t>(GetModuleHandle(nullptr)), |
| 114 reinterpret_cast<uintptr_t>(GetModuleHandle(nullptr))); | 105 modules[0].dll_base); |
| 115 EXPECT_EQ(modules[1].dll_base, | 106 EXPECT_EQ(reinterpret_cast<uintptr_t>(GetModuleHandle(L"ntdll.dll")), |
| 116 reinterpret_cast<uintptr_t>(GetModuleHandle(L"ntdll.dll"))); | 107 modules[1].dll_base); |
| 117 | 108 |
| 118 EXPECT_GT(modules[0].size, 0); | 109 EXPECT_GT(modules[0].size, 0); |
| 119 EXPECT_GT(modules[1].size, 0); | 110 EXPECT_GT(modules[1].size, 0); |
| 120 | 111 |
| 121 EXPECT_EQ(modules[0].timestamp, | 112 EXPECT_EQ(GetTimestampForLoadedLibrary(GetModuleHandle(nullptr)), |
| 122 GetTimestampForModule(GetModuleHandle(nullptr))); | 113 modules[0].timestamp); |
| 123 // System modules are forced to particular stamps and the file header values | 114 // System modules are forced to particular stamps and the file header values |
| 124 // don't match the on-disk times. Just make sure we got some data here. | 115 // don't match the on-disk times. Just make sure we got some data here. |
| 125 EXPECT_GT(modules[1].timestamp, 0); | 116 EXPECT_GT(modules[1].timestamp, 0); |
| 126 | 117 |
| 127 // Find something we know is a code address and confirm expected memory | 118 // Find something we know is a code address and confirm expected memory |
| 128 // information settings. | 119 // information settings. |
| 129 VerifyAddressInInCodePage(process_info, | 120 VerifyAddressInInCodePage(process_info, |
| 130 reinterpret_cast<WinVMAddress>(_ReturnAddress())); | 121 reinterpret_cast<WinVMAddress>(_ReturnAddress())); |
| 131 } | 122 } |
| 132 | 123 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 194 TEST(ProcessInfo, OtherProcessWOW64) { | 185 TEST(ProcessInfo, OtherProcessWOW64) { |
| 195 #ifndef NDEBUG | 186 #ifndef NDEBUG |
| 196 TestOtherProcess(FILE_PATH_LITERAL("..\\..\\out\\Debug")); | 187 TestOtherProcess(FILE_PATH_LITERAL("..\\..\\out\\Debug")); |
| 197 #else | 188 #else |
| 198 TestOtherProcess(FILE_PATH_LITERAL("..\\..\\out\\Release")); | 189 TestOtherProcess(FILE_PATH_LITERAL("..\\..\\out\\Release")); |
| 199 #endif | 190 #endif |
| 200 } | 191 } |
| 201 #endif // ARCH_CPU_64_BITS | 192 #endif // ARCH_CPU_64_BITS |
| 202 | 193 |
| 203 TEST(ProcessInfo, AccessibleRangesNone) { | 194 TEST(ProcessInfo, AccessibleRangesNone) { |
| 204 std::vector<ProcessInfo::MemoryInfo> memory_info; | 195 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 205 MEMORY_BASIC_INFORMATION mbi = {0}; | 196 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 206 | 197 |
| 207 mbi.BaseAddress = 0; | 198 mbi.BaseAddress = 0; |
| 208 mbi.RegionSize = 10; | 199 mbi.RegionSize = 10; |
| 209 mbi.State = MEM_FREE; | 200 mbi.State = MEM_FREE; |
| 210 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 201 memory_info.push_back(mbi); |
| 211 | 202 |
| 212 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 203 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 213 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(2, 4), | 204 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(2, 4), |
| 214 memory_info); | 205 memory_info); |
| 215 | 206 |
| 216 EXPECT_TRUE(result.empty()); | 207 EXPECT_TRUE(result.empty()); |
| 217 } | 208 } |
| 218 | 209 |
| 219 TEST(ProcessInfo, AccessibleRangesOneInside) { | 210 TEST(ProcessInfo, AccessibleRangesOneInside) { |
| 220 std::vector<ProcessInfo::MemoryInfo> memory_info; | 211 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 221 MEMORY_BASIC_INFORMATION mbi = {0}; | 212 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 222 | 213 |
| 223 mbi.BaseAddress = 0; | 214 mbi.BaseAddress = 0; |
| 224 mbi.RegionSize = 10; | 215 mbi.RegionSize = 10; |
| 225 mbi.State = MEM_COMMIT; | 216 mbi.State = MEM_COMMIT; |
| 226 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 217 memory_info.push_back(mbi); |
| 227 | 218 |
| 228 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 219 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 229 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(2, 4), | 220 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(2, 4), |
| 230 memory_info); | 221 memory_info); |
| 231 | 222 |
| 232 ASSERT_EQ(1u, result.size()); | 223 ASSERT_EQ(1u, result.size()); |
| 233 EXPECT_EQ(2, result[0].base()); | 224 EXPECT_EQ(2, result[0].base()); |
| 234 EXPECT_EQ(4, result[0].size()); | 225 EXPECT_EQ(4, result[0].size()); |
| 235 } | 226 } |
| 236 | 227 |
| 237 TEST(ProcessInfo, AccessibleRangesOneTruncatedSize) { | 228 TEST(ProcessInfo, AccessibleRangesOneTruncatedSize) { |
| 238 std::vector<ProcessInfo::MemoryInfo> memory_info; | 229 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 239 MEMORY_BASIC_INFORMATION mbi = {0}; | 230 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 240 | 231 |
| 241 mbi.BaseAddress = 0; | 232 mbi.BaseAddress = 0; |
| 242 mbi.RegionSize = 10; | 233 mbi.RegionSize = 10; |
| 243 mbi.State = MEM_COMMIT; | 234 mbi.State = MEM_COMMIT; |
| 244 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 235 memory_info.push_back(mbi); |
| 245 | 236 |
| 246 mbi.BaseAddress = reinterpret_cast<void*>(10); | 237 mbi.BaseAddress = 10; |
| 247 mbi.RegionSize = 20; | 238 mbi.RegionSize = 20; |
| 248 mbi.State = MEM_FREE; | 239 mbi.State = MEM_FREE; |
| 249 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 240 memory_info.push_back(mbi); |
| 250 | 241 |
| 251 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 242 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 252 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), | 243 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), |
| 253 memory_info); | 244 memory_info); |
| 254 | 245 |
| 255 ASSERT_EQ(1u, result.size()); | 246 ASSERT_EQ(1u, result.size()); |
| 256 EXPECT_EQ(5, result[0].base()); | 247 EXPECT_EQ(5, result[0].base()); |
| 257 EXPECT_EQ(5, result[0].size()); | 248 EXPECT_EQ(5, result[0].size()); |
| 258 } | 249 } |
| 259 | 250 |
| 260 TEST(ProcessInfo, AccessibleRangesOneMovedStart) { | 251 TEST(ProcessInfo, AccessibleRangesOneMovedStart) { |
| 261 std::vector<ProcessInfo::MemoryInfo> memory_info; | 252 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 262 MEMORY_BASIC_INFORMATION mbi = {0}; | 253 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 263 | 254 |
| 264 mbi.BaseAddress = 0; | 255 mbi.BaseAddress = 0; |
| 265 mbi.RegionSize = 10; | 256 mbi.RegionSize = 10; |
| 266 mbi.State = MEM_FREE; | 257 mbi.State = MEM_FREE; |
| 267 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 258 memory_info.push_back(mbi); |
| 268 | 259 |
| 269 mbi.BaseAddress = reinterpret_cast<void*>(10); | 260 mbi.BaseAddress = 10; |
| 270 mbi.RegionSize = 20; | 261 mbi.RegionSize = 20; |
| 271 mbi.State = MEM_COMMIT; | 262 mbi.State = MEM_COMMIT; |
| 272 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 263 memory_info.push_back(mbi); |
| 273 | 264 |
| 274 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 265 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 275 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), | 266 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), |
| 276 memory_info); | 267 memory_info); |
| 277 | 268 |
| 278 ASSERT_EQ(1u, result.size()); | 269 ASSERT_EQ(1u, result.size()); |
| 279 EXPECT_EQ(10, result[0].base()); | 270 EXPECT_EQ(10, result[0].base()); |
| 280 EXPECT_EQ(5, result[0].size()); | 271 EXPECT_EQ(5, result[0].size()); |
| 281 } | 272 } |
| 282 | 273 |
| 283 TEST(ProcessInfo, ReserveIsInaccessible) { | 274 TEST(ProcessInfo, ReserveIsInaccessible) { |
| 284 std::vector<ProcessInfo::MemoryInfo> memory_info; | 275 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 285 MEMORY_BASIC_INFORMATION mbi = {0}; | 276 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 286 | 277 |
| 287 mbi.BaseAddress = 0; | 278 mbi.BaseAddress = 0; |
| 288 mbi.RegionSize = 10; | 279 mbi.RegionSize = 10; |
| 289 mbi.State = MEM_RESERVE; | 280 mbi.State = MEM_RESERVE; |
| 290 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 281 memory_info.push_back(mbi); |
| 291 | 282 |
| 292 mbi.BaseAddress = reinterpret_cast<void*>(10); | 283 mbi.BaseAddress = 10; |
| 293 mbi.RegionSize = 20; | 284 mbi.RegionSize = 20; |
| 294 mbi.State = MEM_COMMIT; | 285 mbi.State = MEM_COMMIT; |
| 295 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 286 memory_info.push_back(mbi); |
| 296 | 287 |
| 297 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 288 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 298 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), | 289 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), |
| 299 memory_info); | 290 memory_info); |
| 300 | 291 |
| 301 ASSERT_EQ(1u, result.size()); | 292 ASSERT_EQ(1u, result.size()); |
| 302 EXPECT_EQ(10, result[0].base()); | 293 EXPECT_EQ(10, result[0].base()); |
| 303 EXPECT_EQ(5, result[0].size()); | 294 EXPECT_EQ(5, result[0].size()); |
| 304 } | 295 } |
| 305 | 296 |
| 306 TEST(ProcessInfo, PageGuardIsInaccessible) { | 297 TEST(ProcessInfo, PageGuardIsInaccessible) { |
| 307 std::vector<ProcessInfo::MemoryInfo> memory_info; | 298 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 308 MEMORY_BASIC_INFORMATION mbi = {0}; | 299 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 309 | 300 |
| 310 mbi.BaseAddress = 0; | 301 mbi.BaseAddress = 0; |
| 311 mbi.RegionSize = 10; | 302 mbi.RegionSize = 10; |
| 312 mbi.State = MEM_COMMIT; | 303 mbi.State = MEM_COMMIT; |
| 313 mbi.Protect = PAGE_GUARD; | 304 mbi.Protect = PAGE_GUARD; |
| 314 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 305 memory_info.push_back(mbi); |
| 315 | 306 |
| 316 mbi.BaseAddress = reinterpret_cast<void*>(10); | 307 mbi.BaseAddress = 10; |
| 317 mbi.RegionSize = 20; | 308 mbi.RegionSize = 20; |
| 318 mbi.State = MEM_COMMIT; | 309 mbi.State = MEM_COMMIT; |
| 319 mbi.Protect = 0; | 310 mbi.Protect = 0; |
| 320 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 311 memory_info.push_back(mbi); |
| 321 | 312 |
| 322 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 313 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 323 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), | 314 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), |
| 324 memory_info); | 315 memory_info); |
| 325 | 316 |
| 326 ASSERT_EQ(1u, result.size()); | 317 ASSERT_EQ(1u, result.size()); |
| 327 EXPECT_EQ(10, result[0].base()); | 318 EXPECT_EQ(10, result[0].base()); |
| 328 EXPECT_EQ(5, result[0].size()); | 319 EXPECT_EQ(5, result[0].size()); |
| 329 } | 320 } |
| 330 | 321 |
| 331 TEST(ProcessInfo, PageNoAccessIsInaccessible) { | 322 TEST(ProcessInfo, PageNoAccessIsInaccessible) { |
| 332 std::vector<ProcessInfo::MemoryInfo> memory_info; | 323 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 333 MEMORY_BASIC_INFORMATION mbi = {0}; | 324 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 334 | 325 |
| 335 mbi.BaseAddress = 0; | 326 mbi.BaseAddress = 0; |
| 336 mbi.RegionSize = 10; | 327 mbi.RegionSize = 10; |
| 337 mbi.State = MEM_COMMIT; | 328 mbi.State = MEM_COMMIT; |
| 338 mbi.Protect = PAGE_NOACCESS; | 329 mbi.Protect = PAGE_NOACCESS; |
| 339 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 330 memory_info.push_back(mbi); |
| 340 | 331 |
| 341 mbi.BaseAddress = reinterpret_cast<void*>(10); | 332 mbi.BaseAddress = 10; |
| 342 mbi.RegionSize = 20; | 333 mbi.RegionSize = 20; |
| 343 mbi.State = MEM_COMMIT; | 334 mbi.State = MEM_COMMIT; |
| 344 mbi.Protect = 0; | 335 mbi.Protect = 0; |
| 345 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 336 memory_info.push_back(mbi); |
| 346 | 337 |
| 347 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 338 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 348 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), | 339 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), |
| 349 memory_info); | 340 memory_info); |
| 350 | 341 |
| 351 ASSERT_EQ(1u, result.size()); | 342 ASSERT_EQ(1u, result.size()); |
| 352 EXPECT_EQ(10, result[0].base()); | 343 EXPECT_EQ(10, result[0].base()); |
| 353 EXPECT_EQ(5, result[0].size()); | 344 EXPECT_EQ(5, result[0].size()); |
| 354 } | 345 } |
| 355 | 346 |
| 356 TEST(ProcessInfo, AccessibleRangesCoalesced) { | 347 TEST(ProcessInfo, AccessibleRangesCoalesced) { |
| 357 std::vector<ProcessInfo::MemoryInfo> memory_info; | 348 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 358 MEMORY_BASIC_INFORMATION mbi = {0}; | 349 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 359 | 350 |
| 360 mbi.BaseAddress = 0; | 351 mbi.BaseAddress = 0; |
| 361 mbi.RegionSize = 10; | 352 mbi.RegionSize = 10; |
| 362 mbi.State = MEM_FREE; | 353 mbi.State = MEM_FREE; |
| 363 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 354 memory_info.push_back(mbi); |
| 364 | 355 |
| 365 mbi.BaseAddress = reinterpret_cast<void*>(10); | 356 mbi.BaseAddress = 10; |
| 366 mbi.RegionSize = 2; | 357 mbi.RegionSize = 2; |
| 367 mbi.State = MEM_COMMIT; | 358 mbi.State = MEM_COMMIT; |
| 368 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 359 memory_info.push_back(mbi); |
| 369 | 360 |
| 370 mbi.BaseAddress = reinterpret_cast<void*>(12); | 361 mbi.BaseAddress = 12; |
| 371 mbi.RegionSize = 5; | 362 mbi.RegionSize = 5; |
| 372 mbi.State = MEM_COMMIT; | 363 mbi.State = MEM_COMMIT; |
| 373 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 364 memory_info.push_back(mbi); |
| 374 | 365 |
| 375 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 366 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 376 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(11, 4), | 367 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(11, 4), |
| 377 memory_info); | 368 memory_info); |
| 378 | 369 |
| 379 ASSERT_EQ(1u, result.size()); | 370 ASSERT_EQ(1u, result.size()); |
| 380 EXPECT_EQ(11, result[0].base()); | 371 EXPECT_EQ(11, result[0].base()); |
| 381 EXPECT_EQ(4, result[0].size()); | 372 EXPECT_EQ(4, result[0].size()); |
| 382 } | 373 } |
| 383 | 374 |
| 384 TEST(ProcessInfo, AccessibleRangesMiddleUnavailable) { | 375 TEST(ProcessInfo, AccessibleRangesMiddleUnavailable) { |
| 385 std::vector<ProcessInfo::MemoryInfo> memory_info; | 376 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 386 MEMORY_BASIC_INFORMATION mbi = {0}; | 377 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 387 | 378 |
| 388 mbi.BaseAddress = 0; | 379 mbi.BaseAddress = 0; |
| 389 mbi.RegionSize = 10; | 380 mbi.RegionSize = 10; |
| 390 mbi.State = MEM_COMMIT; | 381 mbi.State = MEM_COMMIT; |
| 391 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 382 memory_info.push_back(mbi); |
| 392 | 383 |
| 393 mbi.BaseAddress = reinterpret_cast<void*>(10); | 384 mbi.BaseAddress = 10; |
| 394 mbi.RegionSize = 5; | 385 mbi.RegionSize = 5; |
| 395 mbi.State = MEM_FREE; | 386 mbi.State = MEM_FREE; |
| 396 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 387 memory_info.push_back(mbi); |
| 397 | 388 |
| 398 mbi.BaseAddress = reinterpret_cast<void*>(15); | 389 mbi.BaseAddress = 15; |
| 399 mbi.RegionSize = 100; | 390 mbi.RegionSize = 100; |
| 400 mbi.State = MEM_COMMIT; | 391 mbi.State = MEM_COMMIT; |
| 401 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 392 memory_info.push_back(mbi); |
| 402 | 393 |
| 403 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 394 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 404 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 45), | 395 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 45), |
| 405 memory_info); | 396 memory_info); |
| 406 | 397 |
| 407 ASSERT_EQ(2u, result.size()); | 398 ASSERT_EQ(2u, result.size()); |
| 408 EXPECT_EQ(5, result[0].base()); | 399 EXPECT_EQ(5, result[0].base()); |
| 409 EXPECT_EQ(5, result[0].size()); | 400 EXPECT_EQ(5, result[0].size()); |
| 410 EXPECT_EQ(15, result[1].base()); | 401 EXPECT_EQ(15, result[1].base()); |
| 411 EXPECT_EQ(35, result[1].size()); | 402 EXPECT_EQ(35, result[1].size()); |
| 412 } | 403 } |
| 413 | 404 |
| 414 TEST(ProcessInfo, RequestedBeforeMap) { | 405 TEST(ProcessInfo, RequestedBeforeMap) { |
| 415 std::vector<ProcessInfo::MemoryInfo> memory_info; | 406 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 416 MEMORY_BASIC_INFORMATION mbi = {0}; | 407 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 417 | 408 |
| 418 mbi.BaseAddress = reinterpret_cast<void*>(10); | 409 mbi.BaseAddress = 10; |
| 419 mbi.RegionSize = 10; | 410 mbi.RegionSize = 10; |
| 420 mbi.State = MEM_COMMIT; | 411 mbi.State = MEM_COMMIT; |
| 421 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 412 memory_info.push_back(mbi); |
| 422 | 413 |
| 423 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 414 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 424 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), | 415 GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10), |
| 425 memory_info); | 416 memory_info); |
| 426 | 417 |
| 427 ASSERT_EQ(1u, result.size()); | 418 ASSERT_EQ(1u, result.size()); |
| 428 EXPECT_EQ(10, result[0].base()); | 419 EXPECT_EQ(10, result[0].base()); |
| 429 EXPECT_EQ(5, result[0].size()); | 420 EXPECT_EQ(5, result[0].size()); |
| 430 } | 421 } |
| 431 | 422 |
| 432 TEST(ProcessInfo, RequestedAfterMap) { | 423 TEST(ProcessInfo, RequestedAfterMap) { |
| 433 std::vector<ProcessInfo::MemoryInfo> memory_info; | 424 std::vector<MEMORY_BASIC_INFORMATION64> memory_info; |
| 434 MEMORY_BASIC_INFORMATION mbi = {0}; | 425 MEMORY_BASIC_INFORMATION64 mbi = {0}; |
| 435 | 426 |
| 436 mbi.BaseAddress = reinterpret_cast<void*>(10); | 427 mbi.BaseAddress = 10; |
| 437 mbi.RegionSize = 10; | 428 mbi.RegionSize = 10; |
| 438 mbi.State = MEM_COMMIT; | 429 mbi.State = MEM_COMMIT; |
| 439 memory_info.push_back(ProcessInfo::MemoryInfo(mbi)); | 430 memory_info.push_back(mbi); |
| 440 | 431 |
| 441 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = | 432 std::vector<CheckedRange<WinVMAddress, WinVMSize>> result = |
| 442 GetReadableRangesOfMemoryMap( | 433 GetReadableRangesOfMemoryMap( |
| 443 CheckedRange<WinVMAddress, WinVMSize>(15, 100), memory_info); | 434 CheckedRange<WinVMAddress, WinVMSize>(15, 100), memory_info); |
| 444 | 435 |
| 445 ASSERT_EQ(1u, result.size()); | 436 ASSERT_EQ(1u, result.size()); |
| 446 EXPECT_EQ(15, result[0].base()); | 437 EXPECT_EQ(15, result[0].base()); |
| 447 EXPECT_EQ(5, result[0].size()); | 438 EXPECT_EQ(5, result[0].size()); |
| 448 } | 439 } |
| 449 | 440 |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 EXPECT_FALSE(ReadProcessMemory(current_process, | 506 EXPECT_FALSE(ReadProcessMemory(current_process, |
| 516 reserve_region, | 507 reserve_region, |
| 517 into.get(), | 508 into.get(), |
| 518 kBlockSize * 6, | 509 kBlockSize * 6, |
| 519 &bytes_read)); | 510 &bytes_read)); |
| 520 } | 511 } |
| 521 | 512 |
| 522 } // namespace | 513 } // namespace |
| 523 } // namespace test | 514 } // namespace test |
| 524 } // namespace crashpad | 515 } // namespace crashpad |
| OLD | NEW |