Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(604)

Side by Side Diff: util/win/process_info.cc

Issue 1369833002: win: Gather memory information (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@save-peb-stuff
Patch Set: . Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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,
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 PLOG(ERROR) << "ReadProcessMemory " << __FUNCSIG__; 97 PLOG(ERROR) << "ReadProcessMemory " << __FUNCSIG__;
98 return false; 98 return false;
99 } 99 }
100 if (bytes_read != sizeof(T)) { 100 if (bytes_read != sizeof(T)) {
101 LOG(ERROR) << "ReadProcessMemory " << __FUNCSIG__ << " incorrect size"; 101 LOG(ERROR) << "ReadProcessMemory " << __FUNCSIG__ << " incorrect size";
102 return false; 102 return false;
103 } 103 }
104 return true; 104 return true;
105 } 105 }
106 106
107 // Map from Traits to an MEMORY_BASIC_INFORMATIIONxx.
108 template <class Traits>
109 struct MemoryBasicInformationForTraits;
110
111 template <>
112 struct MemoryBasicInformationForTraits<process_types::internal::Traits32> {
113 using type = MEMORY_BASIC_INFORMATION32;
114 };
115
116 template <>
117 struct MemoryBasicInformationForTraits<process_types::internal::Traits64> {
118 using type = MEMORY_BASIC_INFORMATION64;
119 };
120
107 } // namespace 121 } // namespace
108 122
109 template <class Traits> 123 template <class Traits>
110 bool GetProcessBasicInformation(HANDLE process, 124 bool GetProcessBasicInformation(HANDLE process,
111 bool is_wow64, 125 bool is_wow64,
112 ProcessInfo* process_info, 126 ProcessInfo* process_info,
113 WinVMAddress* peb_address, 127 WinVMAddress* peb_address,
114 WinVMSize* peb_size) { 128 WinVMSize* peb_size) {
115 ULONG bytes_returned; 129 ULONG bytes_returned;
116 process_types::PROCESS_BASIC_INFORMATION<Traits> process_basic_information; 130 process_types::PROCESS_BASIC_INFORMATION<Traits> process_basic_information;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 module.size = ldr_data_table_entry.SizeOfImage; 260 module.size = ldr_data_table_entry.SizeOfImage;
247 module.timestamp = ldr_data_table_entry.TimeDateStamp; 261 module.timestamp = ldr_data_table_entry.TimeDateStamp;
248 process_info->modules_.push_back(module); 262 process_info->modules_.push_back(module);
249 if (cur == last) 263 if (cur == last)
250 break; 264 break;
251 } 265 }
252 266
253 return true; 267 return true;
254 } 268 }
255 269
270 template <class Traits>
271 bool ReadMemoryInfo(HANDLE process, ProcessInfo* process_info) {
272 DCHECK(process_info->memory_info_.empty());
273
274 SYSTEM_INFO system_info;
275 GetSystemInfo(&system_info);
276 uint64_t min_address =
Mark Mentovai 2015/09/26 02:02:14 const WinVMAddress?
scottmg 2015/09/26 03:12:36 Done.
277 reinterpret_cast<uint64_t>(system_info.lpMinimumApplicationAddress);
278 uint64_t max_address =
279 reinterpret_cast<uint64_t>(system_info.lpMaximumApplicationAddress);
Mark Mentovai 2015/09/26 02:02:14 Is this correct for 64-reads-32-on-64?
scottmg 2015/09/26 03:12:36 Hmm, good point, that's tricky. After playing arou
280 uint64_t address = min_address;
281 while (address <= max_address) {
Mark Mentovai 2015/09/26 02:02:14 for (WinVMAddress address = min_address; address <
scottmg 2015/09/26 03:12:36 Done.
282 MemoryBasicInformationForTraits<Traits>::type memory_basic_information;
283 size_t result = VirtualQueryEx(
284 process,
285 reinterpret_cast<void*>(address),
286 reinterpret_cast<MEMORY_BASIC_INFORMATION*>(&memory_basic_information),
287 sizeof(memory_basic_information));
288 if (result == 0) {
289 PLOG(ERROR) << "VirtualQueryEx";
290 return false;
291 }
292
293 process_info->memory_info_.push_back(
294 ProcessInfo::MemoryInfo(memory_basic_information));
295
296 address += memory_basic_information.RegionSize;
Mark Mentovai 2015/09/26 02:02:14 DCHECK_GT(RegionSize, 0); so that a very busted m
scottmg 2015/09/26 03:12:36 Done. (if with LOG rather than DCHECK)
297 }
298
299 return true;
300 }
301
256 ProcessInfo::Module::Module() : name(), dll_base(0), size(0), timestamp() { 302 ProcessInfo::Module::Module() : name(), dll_base(0), size(0), timestamp() {
257 } 303 }
258 304
259 ProcessInfo::Module::~Module() { 305 ProcessInfo::Module::~Module() {
260 } 306 }
261 307
308 ProcessInfo::MemoryInfo::MemoryInfo()
309 : base_address(0),
310 region_size(0),
311 allocation_base(0),
312 state(0),
313 allocation_protect(0),
314 protect(0),
315 type(0) {
316 }
317
318 template <class MBI>
319 ProcessInfo::MemoryInfo::MemoryInfo(const MBI& mbi)
320 : base_address(mbi.BaseAddress),
321 region_size(mbi.RegionSize),
322 allocation_base(mbi.AllocationBase),
323 state(mbi.State),
324 allocation_protect(mbi.AllocationProtect),
325 protect(mbi.Protect),
326 type(mbi.Type) {
327 }
328
329 ProcessInfo::MemoryInfo::~MemoryInfo() {
330 }
331
262 ProcessInfo::ProcessInfo() 332 ProcessInfo::ProcessInfo()
263 : process_id_(), 333 : process_id_(),
264 inherited_from_process_id_(), 334 inherited_from_process_id_(),
265 command_line_(), 335 command_line_(),
266 peb_address_(0), 336 peb_address_(0),
267 peb_size_(0), 337 peb_size_(0),
268 modules_(), 338 modules_(),
339 memory_info_(),
269 is_64_bit_(false), 340 is_64_bit_(false),
270 is_wow64_(false), 341 is_wow64_(false),
271 initialized_() { 342 initialized_() {
272 } 343 }
273 344
274 ProcessInfo::~ProcessInfo() { 345 ProcessInfo::~ProcessInfo() {
275 } 346 }
276 347
277 bool ProcessInfo::Initialize(HANDLE process) { 348 bool ProcessInfo::Initialize(HANDLE process) {
278 INITIALIZATION_STATE_SET_INITIALIZING(initialized_); 349 INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 384
314 result = is_64_bit_ ? ReadProcessData<process_types::internal::Traits64>( 385 result = is_64_bit_ ? ReadProcessData<process_types::internal::Traits64>(
315 process, peb_address_, this) 386 process, peb_address_, this)
316 : ReadProcessData<process_types::internal::Traits32>( 387 : ReadProcessData<process_types::internal::Traits32>(
317 process, peb_address_, this); 388 process, peb_address_, this);
318 if (!result) { 389 if (!result) {
319 LOG(ERROR) << "ReadProcessData failed"; 390 LOG(ERROR) << "ReadProcessData failed";
320 return false; 391 return false;
321 } 392 }
322 393
394 result =
395 is_64_bit_
396 ? ReadMemoryInfo<process_types::internal::Traits64>(process, this)
397 : ReadMemoryInfo<process_types::internal::Traits32>(process, this);
398 if (!result) {
399 LOG(ERROR) << "ReadMemoryInfo failed";
400 return false;
401 }
402
323 INITIALIZATION_STATE_SET_VALID(initialized_); 403 INITIALIZATION_STATE_SET_VALID(initialized_);
324 return true; 404 return true;
325 } 405 }
326 406
327 bool ProcessInfo::Is64Bit() const { 407 bool ProcessInfo::Is64Bit() const {
328 INITIALIZATION_STATE_DCHECK_VALID(initialized_); 408 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
329 return is_64_bit_; 409 return is_64_bit_;
330 } 410 }
331 411
332 bool ProcessInfo::IsWow64() const { 412 bool ProcessInfo::IsWow64() const {
(...skipping 21 matching lines...) Expand all
354 *peb_address = peb_address_; 434 *peb_address = peb_address_;
355 *peb_size = peb_size_; 435 *peb_size = peb_size_;
356 } 436 }
357 437
358 bool ProcessInfo::Modules(std::vector<Module>* modules) const { 438 bool ProcessInfo::Modules(std::vector<Module>* modules) const {
359 INITIALIZATION_STATE_DCHECK_VALID(initialized_); 439 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
360 *modules = modules_; 440 *modules = modules_;
361 return true; 441 return true;
362 } 442 }
363 443
444 const std::vector<ProcessInfo::MemoryInfo>& ProcessInfo::MemoryInformation()
445 const {
446 return memory_info_;
447 }
448
364 } // namespace crashpad 449 } // namespace crashpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698