| Index: util/win/process_info.cc | 
| diff --git a/util/win/process_info.cc b/util/win/process_info.cc | 
| index ed5262c7f7cc9d7f2d2958d3c7c74a1b69a7b9a6..6d70fa0d448eb35e4a8361b0d08e5c7c05d9b5b8 100644 | 
| --- a/util/win/process_info.cc | 
| +++ b/util/win/process_info.cc | 
| @@ -16,6 +16,8 @@ | 
|  | 
| #include <winternl.h> | 
|  | 
| +#include <limits> | 
| + | 
| #include "base/logging.h" | 
| #include "base/strings/stringprintf.h" | 
| #include "build/build_config.h" | 
| @@ -253,15 +255,17 @@ bool ReadProcessData(HANDLE process, | 
| return true; | 
| } | 
|  | 
| -bool ReadMemoryInfo(HANDLE process, ProcessInfo* process_info) { | 
| +bool ReadMemoryInfo(HANDLE process, bool is_64_bit, ProcessInfo* process_info) { | 
| DCHECK(process_info->memory_info_.empty()); | 
|  | 
| -  SYSTEM_INFO system_info; | 
| -  GetSystemInfo(&system_info); | 
| -  const WinVMAddress min_address = | 
| -      reinterpret_cast<WinVMAddress>(system_info.lpMinimumApplicationAddress); | 
| -  const WinVMAddress max_address = | 
| -      reinterpret_cast<WinVMAddress>(system_info.lpMaximumApplicationAddress); | 
| +  const WinVMAddress min_address = 0; | 
| +  // We can't use GetSystemInfo() to get the address space range for another | 
| +  // process. VirtualQueryEx() will fail with ERROR_INVALID_PARAMETER if the | 
| +  // address is above the highest memory address accessible to the process, so | 
| +  // we just probe the entire potential range (2^32 for x86, or 2^64 for x64). | 
| +  const WinVMAddress max_address = is_64_bit | 
| +                                       ? std::numeric_limits<uint64_t>::max() | 
| +                                       : std::numeric_limits<uint32_t>::max(); | 
| MEMORY_BASIC_INFORMATION memory_basic_information; | 
| for (WinVMAddress address = min_address; address <= max_address; | 
| address += memory_basic_information.RegionSize) { | 
| @@ -270,6 +274,8 @@ bool ReadMemoryInfo(HANDLE process, ProcessInfo* process_info) { | 
| &memory_basic_information, | 
| sizeof(memory_basic_information)); | 
| if (result == 0) { | 
| +      if (GetLastError() == ERROR_INVALID_PARAMETER) | 
| +        break; | 
| PLOG(ERROR) << "VirtualQueryEx"; | 
| return false; | 
| } | 
| @@ -367,7 +373,7 @@ bool ProcessInfo::Initialize(HANDLE process) { | 
| return false; | 
| } | 
|  | 
| -  if (!ReadMemoryInfo(process, this)) { | 
| +  if (!ReadMemoryInfo(process, is_64_bit_, this)) { | 
| LOG(ERROR) << "ReadMemoryInfo failed"; | 
| return false; | 
| } | 
|  |