Index: util/win/process_info.cc |
diff --git a/util/win/process_info.cc b/util/win/process_info.cc |
index bfc83a60936f18f6a4784421692bc99a7f41e34a..fa413cc3c8c51ecd04b2f6e5b96dfbc037defad7 100644 |
--- a/util/win/process_info.cc |
+++ b/util/win/process_info.cc |
@@ -21,6 +21,7 @@ |
#include "base/logging.h" |
#include "base/strings/stringprintf.h" |
+#include "base/template_util.h" |
#include "build/build_config.h" |
#include "util/numeric/safe_assignment.h" |
#include "util/win/ntstatus_logging.h" |
@@ -107,10 +108,23 @@ bool ReadStruct(HANDLE process, WinVMAddress at, T* into) { |
return true; |
} |
-bool RegionIsAccessible(const ProcessInfo::MemoryInfo& memory_info) { |
- return memory_info.state == MEM_COMMIT && |
- (memory_info.protect & PAGE_NOACCESS) == 0 && |
- (memory_info.protect & PAGE_GUARD) == 0; |
+bool RegionIsAccessible(const MEMORY_BASIC_INFORMATION64& memory_info) { |
+ return memory_info.State == MEM_COMMIT && |
+ (memory_info.Protect & PAGE_NOACCESS) == 0 && |
+ (memory_info.Protect & PAGE_GUARD) == 0; |
+} |
+ |
+MEMORY_BASIC_INFORMATION64 MemoryBasicInformationToMemoryBasicInformation64( |
+ const MEMORY_BASIC_INFORMATION& mbi) { |
+ MEMORY_BASIC_INFORMATION64 mbi64 = {0}; |
+ mbi64.BaseAddress = reinterpret_cast<ULONGLONG>(mbi.BaseAddress); |
+ mbi64.AllocationBase = reinterpret_cast<ULONGLONG>(mbi.AllocationBase); |
+ mbi64.AllocationProtect = mbi.AllocationProtect; |
+ mbi64.RegionSize = mbi.RegionSize; |
+ mbi64.State = mbi.State; |
+ mbi64.Protect = mbi.Protect; |
+ mbi64.Type = mbi.Type; |
+ return mbi64; |
} |
} // namespace |
@@ -288,7 +302,8 @@ bool ReadMemoryInfo(HANDLE process, bool is_64_bit, ProcessInfo* process_info) { |
} |
process_info->memory_info_.push_back( |
- ProcessInfo::MemoryInfo(memory_basic_information)); |
+ MemoryBasicInformationToMemoryBasicInformation64( |
+ memory_basic_information)); |
if (memory_basic_information.RegionSize == 0) { |
LOG(ERROR) << "RegionSize == 0"; |
@@ -305,19 +320,6 @@ ProcessInfo::Module::Module() : name(), dll_base(0), size(0), timestamp() { |
ProcessInfo::Module::~Module() { |
} |
-ProcessInfo::MemoryInfo::MemoryInfo(const MEMORY_BASIC_INFORMATION& mbi) |
- : base_address(reinterpret_cast<WinVMAddress>(mbi.BaseAddress)), |
- region_size(mbi.RegionSize), |
- allocation_base(reinterpret_cast<WinVMAddress>(mbi.AllocationBase)), |
- state(mbi.State), |
- allocation_protect(mbi.AllocationProtect), |
- protect(mbi.Protect), |
- type(mbi.Type) { |
-} |
- |
-ProcessInfo::MemoryInfo::~MemoryInfo() { |
-} |
- |
ProcessInfo::ProcessInfo() |
: process_id_(), |
inherited_from_process_id_(), |
@@ -426,8 +428,7 @@ bool ProcessInfo::Modules(std::vector<Module>* modules) const { |
return true; |
} |
-const std::vector<ProcessInfo::MemoryInfo>& ProcessInfo::MemoryInformation() |
- const { |
+const std::vector<MEMORY_BASIC_INFORMATION64>& ProcessInfo::MemoryInfo() const { |
INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
return memory_info_; |
} |
@@ -435,39 +436,43 @@ const std::vector<ProcessInfo::MemoryInfo>& ProcessInfo::MemoryInformation() |
std::vector<CheckedRange<WinVMAddress, WinVMSize>> |
ProcessInfo::GetReadableRanges( |
const CheckedRange<WinVMAddress, WinVMSize>& range) const { |
- return GetReadableRangesOfMemoryMap(range, MemoryInformation()); |
+ return GetReadableRangesOfMemoryMap(range, MemoryInfo()); |
} |
std::vector<CheckedRange<WinVMAddress, WinVMSize>> GetReadableRangesOfMemoryMap( |
const CheckedRange<WinVMAddress, WinVMSize>& range, |
- const std::vector<ProcessInfo::MemoryInfo>& memory_info) { |
+ const std::vector<MEMORY_BASIC_INFORMATION64>& memory_info) { |
using Range = CheckedRange<WinVMAddress, WinVMSize>; |
// Find all the ranges that overlap the target range, maintaining their order. |
- std::vector<ProcessInfo::MemoryInfo> overlapping; |
+ std::vector<MEMORY_BASIC_INFORMATION64> overlapping; |
for (const auto& mi : memory_info) { |
- if (range.OverlapsRange(Range(mi.base_address, mi.region_size))) |
+ static_assert(base::is_same<decltype(mi.BaseAddress), WinVMAddress>::value, |
+ "expected range address to be WinVMAddress"); |
+ static_assert(base::is_same<decltype(mi.RegionSize), WinVMSize>::value, |
+ "expected range size to be WinVMSize"); |
+ if (range.OverlapsRange(Range(mi.BaseAddress, mi.RegionSize))) |
overlapping.push_back(mi); |
} |
if (overlapping.empty()) |
return std::vector<Range>(); |
// For the first and last, trim to the boundary of the incoming range. |
- ProcessInfo::MemoryInfo& front = overlapping.front(); |
- WinVMAddress original_front_base_address = front.base_address; |
- front.base_address = std::max(front.base_address, range.base()); |
- front.region_size = |
- (original_front_base_address + front.region_size) - front.base_address; |
+ MEMORY_BASIC_INFORMATION64& front = overlapping.front(); |
+ WinVMAddress original_front_base_address = front.BaseAddress; |
+ front.BaseAddress = std::max(front.BaseAddress, range.base()); |
+ front.RegionSize = |
+ (original_front_base_address + front.RegionSize) - front.BaseAddress; |
- ProcessInfo::MemoryInfo& back = overlapping.back(); |
- WinVMAddress back_end = back.base_address + back.region_size; |
- back.region_size = std::min(range.end(), back_end) - back.base_address; |
+ MEMORY_BASIC_INFORMATION64& back = overlapping.back(); |
+ WinVMAddress back_end = back.BaseAddress + back.RegionSize; |
+ back.RegionSize = std::min(range.end(), back_end) - back.BaseAddress; |
// Discard all non-accessible. |
overlapping.erase(std::remove_if(overlapping.begin(), |
overlapping.end(), |
- [](const ProcessInfo::MemoryInfo& mi) { |
- return !RegionIsAccessible(mi); |
+ [](const MEMORY_BASIC_INFORMATION64& mbi) { |
+ return !RegionIsAccessible(mbi); |
}), |
overlapping.end()); |
if (overlapping.empty()) |
@@ -476,7 +481,7 @@ std::vector<CheckedRange<WinVMAddress, WinVMSize>> GetReadableRangesOfMemoryMap( |
// Convert to return type. |
std::vector<Range> as_ranges; |
for (const auto& mi : overlapping) { |
- as_ranges.push_back(Range(mi.base_address, mi.region_size)); |
+ as_ranges.push_back(Range(mi.BaseAddress, mi.RegionSize)); |
DCHECK(as_ranges.back().IsValid()); |
} |