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

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: fixes and cross bitness 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 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 module.size = ldr_data_table_entry.SizeOfImage; 246 module.size = ldr_data_table_entry.SizeOfImage;
247 module.timestamp = ldr_data_table_entry.TimeDateStamp; 247 module.timestamp = ldr_data_table_entry.TimeDateStamp;
248 process_info->modules_.push_back(module); 248 process_info->modules_.push_back(module);
249 if (cur == last) 249 if (cur == last)
250 break; 250 break;
251 } 251 }
252 252
253 return true; 253 return true;
254 } 254 }
255 255
256 bool ReadMemoryInfo(HANDLE process, ProcessInfo* process_info) {
257 DCHECK(process_info->memory_info_.empty());
258
259 SYSTEM_INFO system_info;
260 GetSystemInfo(&system_info);
261 const WinVMAddress min_address =
262 reinterpret_cast<WinVMAddress>(system_info.lpMinimumApplicationAddress);
263 const WinVMAddress max_address =
264 reinterpret_cast<WinVMAddress>(system_info.lpMaximumApplicationAddress);
265 MEMORY_BASIC_INFORMATION memory_basic_information;
266 for (WinVMAddress address = min_address; address <= max_address;
267 address += memory_basic_information.RegionSize) {
268 size_t result = VirtualQueryEx(process,
Mark Mentovai 2015/09/26 03:36:36 So if you ask about a 32-bit process from a 64-bit
scottmg 2015/09/26 04:08:53 Yeah, there's one very big region at: base_addr
269 reinterpret_cast<void*>(address),
270 &memory_basic_information,
271 sizeof(memory_basic_information));
272 if (result == 0) {
273 PLOG(ERROR) << "VirtualQueryEx";
274 return false;
275 }
276
277 process_info->memory_info_.push_back(
278 ProcessInfo::MemoryInfo(memory_basic_information));
279
280 if (memory_basic_information.RegionSize == 0) {
281 LOG(ERROR) << "RegionSize == 0";
282 return false;
283 }
284 }
285
286 return true;
287 }
288
256 ProcessInfo::Module::Module() : name(), dll_base(0), size(0), timestamp() { 289 ProcessInfo::Module::Module() : name(), dll_base(0), size(0), timestamp() {
257 } 290 }
258 291
259 ProcessInfo::Module::~Module() { 292 ProcessInfo::Module::~Module() {
260 } 293 }
261 294
295 ProcessInfo::MemoryInfo::MemoryInfo()
296 : base_address(0),
297 region_size(0),
298 allocation_base(0),
299 state(0),
300 allocation_protect(0),
301 protect(0),
302 type(0) {
303 }
304
305 ProcessInfo::MemoryInfo::MemoryInfo(const MEMORY_BASIC_INFORMATION& mbi)
306 : base_address(reinterpret_cast<WinVMAddress>(mbi.BaseAddress)),
307 region_size(mbi.RegionSize),
Mark Mentovai 2015/09/26 03:36:36 You need casts for the address fields but not the
scottmg 2015/09/26 04:08:53 Yeah, the size is a SIZE_T, but the addresses are
308 allocation_base(reinterpret_cast<WinVMAddress>(mbi.AllocationBase)),
309 state(mbi.State),
310 allocation_protect(mbi.AllocationProtect),
311 protect(mbi.Protect),
312 type(mbi.Type) {
313 }
314
315 ProcessInfo::MemoryInfo::~MemoryInfo() {
316 }
317
262 ProcessInfo::ProcessInfo() 318 ProcessInfo::ProcessInfo()
263 : process_id_(), 319 : process_id_(),
264 inherited_from_process_id_(), 320 inherited_from_process_id_(),
265 command_line_(), 321 command_line_(),
266 peb_address_(0), 322 peb_address_(0),
267 peb_size_(0), 323 peb_size_(0),
268 modules_(), 324 modules_(),
325 memory_info_(),
269 is_64_bit_(false), 326 is_64_bit_(false),
270 is_wow64_(false), 327 is_wow64_(false),
271 initialized_() { 328 initialized_() {
272 } 329 }
273 330
274 ProcessInfo::~ProcessInfo() { 331 ProcessInfo::~ProcessInfo() {
275 } 332 }
276 333
277 bool ProcessInfo::Initialize(HANDLE process) { 334 bool ProcessInfo::Initialize(HANDLE process) {
278 INITIALIZATION_STATE_SET_INITIALIZING(initialized_); 335 INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 370
314 result = is_64_bit_ ? ReadProcessData<process_types::internal::Traits64>( 371 result = is_64_bit_ ? ReadProcessData<process_types::internal::Traits64>(
315 process, peb_address_, this) 372 process, peb_address_, this)
316 : ReadProcessData<process_types::internal::Traits32>( 373 : ReadProcessData<process_types::internal::Traits32>(
317 process, peb_address_, this); 374 process, peb_address_, this);
318 if (!result) { 375 if (!result) {
319 LOG(ERROR) << "ReadProcessData failed"; 376 LOG(ERROR) << "ReadProcessData failed";
320 return false; 377 return false;
321 } 378 }
322 379
380 if (!ReadMemoryInfo(process, this)) {
381 LOG(ERROR) << "ReadMemoryInfo failed";
382 return false;
383 }
384
323 INITIALIZATION_STATE_SET_VALID(initialized_); 385 INITIALIZATION_STATE_SET_VALID(initialized_);
324 return true; 386 return true;
325 } 387 }
326 388
327 bool ProcessInfo::Is64Bit() const { 389 bool ProcessInfo::Is64Bit() const {
328 INITIALIZATION_STATE_DCHECK_VALID(initialized_); 390 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
329 return is_64_bit_; 391 return is_64_bit_;
330 } 392 }
331 393
332 bool ProcessInfo::IsWow64() const { 394 bool ProcessInfo::IsWow64() const {
(...skipping 21 matching lines...) Expand all
354 *peb_address = peb_address_; 416 *peb_address = peb_address_;
355 *peb_size = peb_size_; 417 *peb_size = peb_size_;
356 } 418 }
357 419
358 bool ProcessInfo::Modules(std::vector<Module>* modules) const { 420 bool ProcessInfo::Modules(std::vector<Module>* modules) const {
359 INITIALIZATION_STATE_DCHECK_VALID(initialized_); 421 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
360 *modules = modules_; 422 *modules = modules_;
361 return true; 423 return true;
362 } 424 }
363 425
426 const std::vector<ProcessInfo::MemoryInfo>& ProcessInfo::MemoryInformation()
427 const {
428 return memory_info_;
429 }
430
364 } // namespace crashpad 431 } // namespace crashpad
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698