| Index: snapshot/win/exception_snapshot_win.cc
|
| diff --git a/snapshot/win/exception_snapshot_win.cc b/snapshot/win/exception_snapshot_win.cc
|
| index 1156baf35d4b37852d20521a6ea91fb87d2b30d0..731669ad49cd41c58a5d26ae2abdb1cfb6c9b252 100644
|
| --- a/snapshot/win/exception_snapshot_win.cc
|
| +++ b/snapshot/win/exception_snapshot_win.cc
|
| @@ -17,7 +17,6 @@
|
| #include "snapshot/win/cpu_context_win.h"
|
| #include "snapshot/win/process_reader_win.h"
|
| #include "util/win/nt_internals.h"
|
| -#include "util/win/process_structs.h"
|
|
|
| namespace crashpad {
|
| namespace internal {
|
| @@ -51,48 +50,41 @@ bool ExceptionSnapshotWin::Initialize(ProcessReaderWin* process_reader,
|
| }
|
|
|
| if (!found_thread) {
|
| - LOG(ERROR) << "thread ID " << thread_id << "not found in process";
|
| + LOG(ERROR) << "thread ID " << thread_id << " not found in process";
|
| return false;
|
| } else {
|
| thread_id_ = thread_id;
|
| }
|
|
|
| - EXCEPTION_POINTERS exception_pointers;
|
| - if (!process_reader->ReadMemory(exception_pointers_address,
|
| - sizeof(EXCEPTION_POINTERS),
|
| - &exception_pointers)) {
|
| - LOG(ERROR) << "EXCEPTION_POINTERS read failed";
|
| - return false;
|
| - }
|
| - if (!exception_pointers.ExceptionRecord) {
|
| - LOG(ERROR) << "null ExceptionRecord";
|
| - return false;
|
| - }
|
| -
|
| -#if defined(ARCH_CPU_64_BITS)
|
| - if (process_reader->Is64Bit()) {
|
| +#if defined(ARCH_CPU_32_BITS)
|
| + const bool is_64_bit = false;
|
| + using Context32 = CONTEXT;
|
| +#elif defined(ARCH_CPU_64_BITS)
|
| + const bool is_64_bit = process_reader->Is64Bit();
|
| + using Context32 = WOW64_CONTEXT;
|
| + if (is_64_bit) {
|
| CONTEXT context_record;
|
| - if (!InitializeFromExceptionPointers<EXCEPTION_RECORD64>(
|
| - *process_reader, exception_pointers, &context_record)) {
|
| + if (!InitializeFromExceptionPointers<EXCEPTION_RECORD64,
|
| + process_types::EXCEPTION_POINTERS64>(
|
| + *process_reader, exception_pointers_address, &context_record)) {
|
| return false;
|
| }
|
| context_.architecture = kCPUArchitectureX86_64;
|
| context_.x86_64 = &context_union_.x86_64;
|
| InitializeX64Context(context_record, context_.x86_64);
|
| - } else {
|
| - CHECK(false) << "TODO(scottmg) WOW64";
|
| - return false;
|
| }
|
| -#else
|
| - CONTEXT context_record;
|
| - if (!InitializeFromExceptionPointers<EXCEPTION_RECORD32>(
|
| - *process_reader, exception_pointers, &context_record)) {
|
| - return false;
|
| +#endif
|
| + if (!is_64_bit) {
|
| + Context32 context_record;
|
| + if (!InitializeFromExceptionPointers<EXCEPTION_RECORD32,
|
| + process_types::EXCEPTION_POINTERS32>(
|
| + *process_reader, exception_pointers_address, &context_record)) {
|
| + return false;
|
| + }
|
| + context_.architecture = kCPUArchitectureX86;
|
| + context_.x86 = &context_union_.x86;
|
| + InitializeX86Context(context_record, context_.x86);
|
| }
|
| - context_.architecture = kCPUArchitectureX86;
|
| - context_.x86 = &context_union_.x86;
|
| - InitializeX86Context(context_record, context_.x86);
|
| -#endif // ARCH_CPU_64_BITS
|
|
|
| INITIALIZATION_STATE_SET_VALID(initialized_);
|
| return true;
|
| @@ -128,14 +120,28 @@ const std::vector<uint64_t>& ExceptionSnapshotWin::Codes() const {
|
| return codes_;
|
| }
|
|
|
| -template <class ExceptionRecordType, class ContextType>
|
| +template <class ExceptionRecordType,
|
| + class ExceptionPointersType,
|
| + class ContextType>
|
| bool ExceptionSnapshotWin::InitializeFromExceptionPointers(
|
| const ProcessReaderWin& process_reader,
|
| - const EXCEPTION_POINTERS& exception_pointers,
|
| + WinVMAddress exception_pointers_address,
|
| ContextType* context_record) {
|
| + ExceptionPointersType exception_pointers;
|
| + if (!process_reader.ReadMemory(exception_pointers_address,
|
| + sizeof(exception_pointers),
|
| + &exception_pointers)) {
|
| + LOG(ERROR) << "EXCEPTION_POINTERS read failed";
|
| + return false;
|
| + }
|
| + if (!exception_pointers.ExceptionRecord) {
|
| + LOG(ERROR) << "null ExceptionRecord";
|
| + return false;
|
| + }
|
| +
|
| ExceptionRecordType first_record;
|
| if (!process_reader.ReadMemory(
|
| - reinterpret_cast<WinVMAddress>(exception_pointers.ExceptionRecord),
|
| + static_cast<WinVMAddress>(exception_pointers.ExceptionRecord),
|
| sizeof(first_record),
|
| &first_record)) {
|
| LOG(ERROR) << "ExceptionRecord";
|
| @@ -152,7 +158,7 @@ bool ExceptionSnapshotWin::InitializeFromExceptionPointers(
|
| }
|
|
|
| if (!process_reader.ReadMemory(
|
| - reinterpret_cast<WinVMAddress>(exception_pointers.ContextRecord),
|
| + static_cast<WinVMAddress>(exception_pointers.ContextRecord),
|
| sizeof(*context_record),
|
| context_record)) {
|
| LOG(ERROR) << "ContextRecord";
|
|
|