// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_FRAME_CRASH_REPORTING_VEH_TEST_H_ #define CHROME_FRAME_CRASH_REPORTING_VEH_TEST_H_ #include #include "base/logging.h" #ifndef EXCEPTION_CHAIN_END #define EXCEPTION_CHAIN_END ((struct _EXCEPTION_REGISTRATION_RECORD*)-1) typedef struct _EXCEPTION_REGISTRATION_RECORD { struct _EXCEPTION_REGISTRATION_RECORD* Next; PVOID Handler; } EXCEPTION_REGISTRATION_RECORD; #endif // EXCEPTION_CHAIN_END class ExceptionInfo : public _EXCEPTION_POINTERS { public: ExceptionInfo() { Clear(); } ExceptionInfo(DWORD code, void* address) { Clear(); Set(code, address, 0); } void Set(DWORD code, void* address, DWORD flags) { er_.ExceptionCode = code; er_.ExceptionAddress = address; er_.ExceptionFlags = flags; ctx_.Eip = reinterpret_cast(address); } EXCEPTION_RECORD er_; CONTEXT ctx_; private: void Clear() { ExceptionRecord = &er_; ContextRecord = &ctx_; ZeroMemory(&er_, sizeof(er_)); ZeroMemory(&ctx_, sizeof(ctx_)); } }; struct SEHChain { SEHChain(const void* p, ...) { va_list vl; va_start(vl, p); int i = 0; for (; p; ++i) { CHECK(i + 1 < arraysize(chain_)); chain_[i].Handler = const_cast(p); chain_[i].Next = &chain_[i + 1]; p = va_arg(vl, const void*); } chain_[i].Next = EXCEPTION_CHAIN_END; } EXCEPTION_REGISTRATION_RECORD chain_[25]; }; struct StackHelper { StackHelper(const void* p, ...) { va_list vl; va_start(vl, p); count_ = 0; for (; p; ++count_) { CHECK(count_ < arraysize(stack_)); stack_[count_] = p; p = va_arg(vl, const void*); } } const void* stack_[64]; WORD count_; }; #endif // CHROME_FRAME_CRASH_REPORTING_VEH_TEST_H_