1 #![allow(nonstandard_style)]
5 use libc::{c_long, c_ulong, c_void};
7 pub type DWORD = c_ulong;
8 pub type LONG = c_long;
9 pub type ULONG_PTR = usize;
10 pub type LPVOID = *mut c_void;
12 pub const EXCEPTION_MAXIMUM_PARAMETERS: usize = 15;
13 pub const EXCEPTION_NONCONTINUABLE: DWORD = 0x1; // Noncontinuable exception
14 pub const EXCEPTION_UNWINDING: DWORD = 0x2; // Unwind is in progress
15 pub const EXCEPTION_EXIT_UNWIND: DWORD = 0x4; // Exit unwind is in progress
16 pub const EXCEPTION_TARGET_UNWIND: DWORD = 0x20; // Target unwind in progress
17 pub const EXCEPTION_COLLIDED_UNWIND: DWORD = 0x40; // Collided exception handler call
18 pub const EXCEPTION_UNWIND: DWORD = EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND |
19 EXCEPTION_TARGET_UNWIND |
20 EXCEPTION_COLLIDED_UNWIND;
23 pub struct EXCEPTION_RECORD {
24 pub ExceptionCode: DWORD,
25 pub ExceptionFlags: DWORD,
26 pub ExceptionRecord: *mut EXCEPTION_RECORD,
27 pub ExceptionAddress: LPVOID,
28 pub NumberParameters: DWORD,
29 pub ExceptionInformation: [LPVOID; EXCEPTION_MAXIMUM_PARAMETERS],
33 pub struct EXCEPTION_POINTERS {
34 pub ExceptionRecord: *mut EXCEPTION_RECORD,
35 pub ContextRecord: *mut CONTEXT,
38 pub enum UNWIND_HISTORY_TABLE {}
41 pub struct RUNTIME_FUNCTION {
42 pub BeginAddress: DWORD,
43 pub EndAddress: DWORD,
44 pub UnwindData: DWORD,
50 pub struct DISPATCHER_CONTEXT {
51 pub ControlPc: LPVOID,
52 pub ImageBase: LPVOID,
53 pub FunctionEntry: *const RUNTIME_FUNCTION,
54 pub EstablisherFrame: LPVOID,
56 pub ContextRecord: *const CONTEXT,
57 pub LanguageHandler: LPVOID,
58 pub HandlerData: *const u8,
59 pub HistoryTable: *const UNWIND_HISTORY_TABLE,
63 pub enum EXCEPTION_DISPOSITION {
64 ExceptionContinueExecution,
65 ExceptionContinueSearch,
66 ExceptionNestedException,
67 ExceptionCollidedUnwind,
69 pub use self::EXCEPTION_DISPOSITION::*;
73 pub fn RaiseException(dwExceptionCode: DWORD,
74 dwExceptionFlags: DWORD,
75 nNumberOfArguments: DWORD,
76 lpArguments: *const ULONG_PTR);
78 pub fn RtlUnwindEx(TargetFrame: LPVOID,
80 ExceptionRecord: *const EXCEPTION_RECORD,
82 OriginalContext: *const CONTEXT,
83 HistoryTable: *const UNWIND_HISTORY_TABLE);
85 pub fn _CxxThrowException(pExceptionObject: *mut c_void, pThrowInfo: *mut u8);