- add sources.
[platform/framework/web/crosswalk.git] / src / chrome_frame / crash_reporting / veh_test.h
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 #ifndef CHROME_FRAME_CRASH_REPORTING_VEH_TEST_H_
5 #define CHROME_FRAME_CRASH_REPORTING_VEH_TEST_H_
6
7 #include <windows.h>
8 #include "base/logging.h"
9
10 #ifndef EXCEPTION_CHAIN_END
11 #define EXCEPTION_CHAIN_END ((struct _EXCEPTION_REGISTRATION_RECORD*)-1)
12 #if !defined(_WIN32_WINNT_WIN8)
13 typedef struct _EXCEPTION_REGISTRATION_RECORD {
14   struct _EXCEPTION_REGISTRATION_RECORD* Next;
15   PVOID Handler;
16 } EXCEPTION_REGISTRATION_RECORD;
17 // VEH handler flags settings.
18 // These are grabbed from winnt.h for PocketPC.
19 // Only EXCEPTION_NONCONTINUABLE in defined in "regular" winnt.h
20 // #define EXCEPTION_NONCONTINUABLE 0x1    // Noncontinuable exception
21 #define EXCEPTION_UNWINDING 0x2         // Unwind is in progress
22 #define EXCEPTION_EXIT_UNWIND 0x4       // Exit unwind is in progress
23 #define EXCEPTION_STACK_INVALID 0x8     // Stack out of limits or unaligned
24 #define EXCEPTION_NESTED_CALL 0x10      // Nested exception handler call
25 #define EXCEPTION_TARGET_UNWIND 0x20    // Target unwind in progress
26 #define EXCEPTION_COLLIDED_UNWIND 0x40  // Collided exception handler call
27
28 #define EXCEPTION_UNWIND (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND | \
29     EXCEPTION_TARGET_UNWIND | EXCEPTION_COLLIDED_UNWIND)
30
31 #define IS_UNWINDING(Flag)  (((Flag) & EXCEPTION_UNWIND) != 0)
32 #define IS_DISPATCHING(Flag)  (((Flag) & EXCEPTION_UNWIND) == 0)
33 #define IS_TARGET_UNWIND(Flag)  ((Flag) & EXCEPTION_TARGET_UNWIND)
34 #endif  // !defined(_WIN32_WINNT_WIN8)
35 #endif  // EXCEPTION_CHAIN_END
36
37 class ExceptionInfo : public _EXCEPTION_POINTERS {
38  public:
39   ExceptionInfo() {
40     Clear();
41   }
42
43   ExceptionInfo(DWORD code, void* address) {
44     Clear();
45     Set(code, address, 0);
46   }
47
48   void Set(DWORD code, void* address, DWORD flags) {
49     er_.ExceptionCode = code;
50     er_.ExceptionAddress = address;
51     er_.ExceptionFlags = flags;
52     ctx_.Eip = reinterpret_cast<DWORD>(address);
53   }
54
55   EXCEPTION_RECORD er_;
56   CONTEXT ctx_;
57  private:
58   void Clear() {
59     ExceptionRecord = &er_;
60     ContextRecord = &ctx_;
61     ZeroMemory(&er_, sizeof(er_));
62     ZeroMemory(&ctx_, sizeof(ctx_));
63   }
64 };
65
66 struct SEHChain {
67   SEHChain(const void* p, ...) {
68     va_list vl;
69     va_start(vl, p);
70     int i = 0;
71     for (; p; ++i) {
72       CHECK(i + 1 < arraysize(chain_));
73       chain_[i].Handler =
74           reinterpret_cast<PEXCEPTION_ROUTINE>(const_cast<void*>(p));
75       chain_[i].Next = &chain_[i + 1];
76       p = va_arg(vl, const void*);
77     }
78
79     chain_[i].Next = EXCEPTION_CHAIN_END;
80   }
81
82   EXCEPTION_REGISTRATION_RECORD chain_[25];
83 };
84
85 struct StackHelper {
86   StackHelper(const void* p, ...) {
87     va_list vl;
88     va_start(vl, p);
89     count_ = 0;
90     for (; p; ++count_) {
91       CHECK(count_ < arraysize(stack_));
92       stack_[count_] = p;
93       p = va_arg(vl, const void*);
94     }
95   }
96   const void* stack_[64];
97   WORD count_;
98 };
99
100 #endif  // CHROME_FRAME_CRASH_REPORTING_VEH_TEST_H_