Blob Blame History Raw
#ifndef _PSXSEH_H_
#define _PSXSEH_H_


enum __unwind_reason_code;

struct _nt_exception_record;
struct _nt_dispatcher_context;

struct __unwind_exception;
struct __unwind_context;




typedef void __thread_context;

typedef enum __unwind_reason_code(*__unwind_personality_routine)(
	int, int, uintptr_t,
	struct __unwind_exception *,
	struct __unwind_context *);

typedef void (*__unwind_exception_cleanup_routine)(
	enum __unwind_reason_code,
	struct __unwind_exception *);



struct __seh_vtbl {
	int    (*seh_exception_filter)(
		struct _nt_exception_record *,
		void *,
		__thread_context *,
		struct _nt_dispatcher_context *,
		__unwind_personality_routine);

	int    (*seh_exception_handler)(
		struct _nt_exception_record *,
		uintptr_t,
		__thread_context *,
		struct _nt_dispatcher_context *);

	int    (*seh_unwind_raise_exception)(
		struct __unwind_exception *);

	void   (*seh_unwind_delete_exception)(
		struct __unwind_exception *);

	void   (*seh_unwind_resume)(
		struct __unwind_exception *);

	int    (*seh_unwind_resume_or_rethrow)(
		struct __unwind_exception *);

	int    (*seh_unwind_force)(
		struct __unwind_exception *,
		int (*)(
			int, int, uintptr_t,
			struct __unwind_exception *,
			struct __unwind_context *,
			void *),
		void *);

	void * (*seh_unwind_get_language_specific_data)(
		struct __unwind_context *);

	int    (*seh_unwind_backtrace)(
		enum __unwind_reason_code (*)(
			struct __unwind_context *,
			void *),
		void *);

	int    (*seh_unwind_calltrace)();


	uintptr_t (*seh_unwind_get_ip)(const struct __unwind_context *);
	void      (*seh_unwind_set_ip)(struct __unwind_context *, uintptr_t);

	uintptr_t (*seh_unwind_get_gr)(const struct __unwind_context *, int);
	void      (*seh_unwind_set_gr)(struct __unwind_context *, int, uintptr_t);

	uintptr_t (*seh_unwind_get_data_rel_base)(const struct __unwind_context *);
	uintptr_t (*seh_unwind_get_text_rel_base)(const struct __unwind_context *);

	uintptr_t (*seh_unwind_get_cfa)(const struct __unwind_context *);
	uintptr_t (*seh_unwind_get_ip_info)(const struct __unwind_context *, int *);

	uintptr_t (*seh_unwind_get_region_start)(const struct __unwind_context *);
	void *    (*seh_unwind_find_enclosing_function)(const void *);

	int       (*__seh_vtbl_reserved[12]);
};

#endif