ReactOS 0.4.16-dev-555-g690643f
except.c File Reference
#include <float.h>
#include <signal.h>
#include <stdarg.h>
#include <stdbool.h>
#include "ntstatus.h"
#include "windef.h"
#include "winbase.h"
#include "winternl.h"
#include "msvcrt.h"
#include "excpt.h"
#include "wincon.h"
#include "wine/debug.h"
#include "cppexcept.h"
Include dependency graph for except.c:

Go to the source code of this file.

Classes

struct  __std_exception_data
 

Macros

#define WIN32_NO_STATUS
 

Typedefs

typedef void(CDECLfloat_handler) (int, int)
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (seh)
 
static BOOL WINAPI msvcrt_console_handler (DWORD ctrlType)
 
void **CDECL __pxcptinfoptrs (void)
 
static LONG msvcrt_exception_filter (struct _EXCEPTION_POINTERS *except)
 
void msvcrt_init_signals (void)
 
void msvcrt_free_signals (void)
 
__sighandler_t CDECL signal (int sig, __sighandler_t func)
 
int CDECL raise (int sig)
 
int CDECL _XcptFilter (NTSTATUS ex, PEXCEPTION_POINTERS ptr)
 
int CDECL __intrinsic_abnormal_termination (void)
 
BOOL CDECL __uncaught_exception (void)
 
frame_info *CDECL _CreateFrameInfo (frame_info *fi, void *obj)
 
void CDECL _FindAndUnlinkFrame (frame_info *fi)
 
BOOL __cdecl _IsExceptionObjectToBeDestroyed (const void *obj)
 
void CDECL __DestructExceptionObject (EXCEPTION_RECORD *rec)
 
BOOL CDECL __CxxRegisterExceptionObject (EXCEPTION_POINTERS *ep, cxx_frame_info *frame_info)
 
void CDECL __CxxUnregisterExceptionObject (cxx_frame_info *frame_info, BOOL in_use)
 

Variables

static __sighandler_t sighandlers [NSIG] = { SIG_DFL }
 
struct {
   NTSTATUS   status
 
   int   signal
 
float_exception_map []
 

Macro Definition Documentation

◆ WIN32_NO_STATUS

#define WIN32_NO_STATUS

Definition at line 30 of file except.c.

Typedef Documentation

◆ float_handler

typedef void(CDECL * float_handler) (int, int)

Definition at line 78 of file except.c.

Function Documentation

◆ __CxxRegisterExceptionObject()

BOOL CDECL __CxxRegisterExceptionObject ( EXCEPTION_POINTERS ep,
cxx_frame_info frame_info 
)

Definition at line 444 of file except.c.

445{
447
448 TRACE("(%p, %p)\n", ep, frame_info);
449
450 if (!ep || !ep->ExceptionRecord)
451 {
452 frame_info->rec = (void*)-1;
453 frame_info->context = (void*)-1;
454 return TRUE;
455 }
456
457 frame_info->rec = data->exc_record;
458 frame_info->context = data->ctx_record;
459 data->exc_record = ep->ExceptionRecord;
460 data->ctx_record = ep->ContextRecord;
462 return TRUE;
463}
#define TRUE
Definition: types.h:120
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
thread_data_t * msvcrt_get_thread_data(void)
Definition: tls.c:31
frame_info *CDECL _CreateFrameInfo(frame_info *fi, void *obj)
Definition: except.c:348
#define TRACE(s)
Definition: solgame.cpp:4
PEXCEPTION_RECORD ExceptionRecord
Definition: rtltypes.h:200
PCONTEXT ContextRecord
Definition: rtltypes.h:201
ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]
Definition: compat.h:213

◆ __CxxUnregisterExceptionObject()

void CDECL __CxxUnregisterExceptionObject ( cxx_frame_info frame_info,
BOOL  in_use 
)

Definition at line 468 of file except.c.

469{
471
472 TRACE("(%p)\n", frame_info);
473
474 if(frame_info->rec == (void*)-1)
475 return;
476
477 _FindAndUnlinkFrame(&frame_info->frame_info);
478 if(data->exc_record->ExceptionCode == CXX_EXCEPTION && !in_use
479 && _IsExceptionObjectToBeDestroyed((void*)data->exc_record->ExceptionInformation[1]))
480 __DestructExceptionObject(data->exc_record);
481 data->exc_record = frame_info->rec;
482 data->ctx_record = frame_info->context;
483}
#define CXX_EXCEPTION
Definition: cppexcept.h:27
void CDECL __DestructExceptionObject(EXCEPTION_RECORD *rec)
Definition: except.c:409
void CDECL _FindAndUnlinkFrame(frame_info *fi)
Definition: except.c:363
BOOL __cdecl _IsExceptionObjectToBeDestroyed(const void *obj)
Definition: except.c:391

◆ __DestructExceptionObject()

void CDECL __DestructExceptionObject ( EXCEPTION_RECORD rec)

Definition at line 409 of file except.c.

410{
412 void *object = (void*)rec->ExceptionInformation[1];
413
414 TRACE("(%p)\n", rec);
415
416 if (rec->ExceptionCode != CXX_EXCEPTION) return;
417#ifndef __x86_64__
418 if (rec->NumberParameters != 3) return;
419#else
420 if (rec->NumberParameters != 4) return;
421#endif
424
425 if (!info || !info->destructor)
426 return;
427
428#if defined(__i386__)
429#ifdef _MSC_VER
430 ((void(__fastcall*)(void*))info->destructor)(object);
431#else
432 __asm__ __volatile__("call *%0" : : "r" (info->destructor), "c" (object) : "eax", "edx", "memory");
433#endif
434#elif defined(__x86_64__)
435 ((void (__cdecl*)(void*))(info->destructor+rec->ExceptionInformation[3]))(object);
436#else
437 ((void (__cdecl*)(void*))info->destructor)(object);
438#endif
439}
#define __cdecl
Definition: accygwin.h:79
#define CXX_FRAME_MAGIC_VC6
Definition: cppexcept.h:24
#define CXX_FRAME_MAGIC_VC8
Definition: cppexcept.h:26
#define __fastcall
Definition: sync.c:38
__asm__(".p2align 4, 0x90\n" ".seh_proc __seh2_global_filter_func\n" "__seh2_global_filter_func:\n" "\tsub %rbp, %rax\n" "\tpush %rbp\n" "\t.seh_pushreg %rbp\n" "\tsub $32, %rsp\n" "\t.seh_stackalloc 32\n" "\t.seh_endprologue\n" "\tsub %rax, %rdx\n" "\tmov %rdx, %rbp\n" "\tjmp *%r8\n" "__seh2_global_filter_func_exit:\n" "\t.p2align 4\n" "\tadd $32, %rsp\n" "\tpop %rbp\n" "\tret\n" "\t.seh_endproc")
DWORD ExceptionCode
Definition: compat.h:208
DWORD NumberParameters
Definition: compat.h:212

Referenced by __CxxUnregisterExceptionObject().

◆ __intrinsic_abnormal_termination()

int CDECL __intrinsic_abnormal_termination ( void  )

Definition at line 289 of file except.c.

290{
291 FIXME("(void)stub\n");
292 return 0;
293}
#define FIXME(fmt,...)
Definition: precomp.h:53

◆ __pxcptinfoptrs()

void **CDECL __pxcptinfoptrs ( void  )

Definition at line 73 of file except.c.

74{
75 return (void**)&msvcrt_get_thread_data()->xcptinfo;
76}

Referenced by msvcrt_exception_filter(), and raise().

◆ __uncaught_exception()

BOOL CDECL __uncaught_exception ( void  )

Definition at line 299 of file except.c.

300{
301 return msvcrt_get_thread_data()->processing_throw != 0;
302}

◆ _CreateFrameInfo()

frame_info *CDECL _CreateFrameInfo ( frame_info fi,
void obj 
)

Definition at line 348 of file except.c.

349{
351
352 TRACE("(%p, %p)\n", fi, obj);
353
354 fi->next = data->frame_info_head;
355 data->frame_info_head = fi;
356 fi->object = obj;
357 return fi;
358}

Referenced by __CxxRegisterExceptionObject().

◆ _FindAndUnlinkFrame()

void CDECL _FindAndUnlinkFrame ( frame_info fi)

Definition at line 363 of file except.c.

364{
366 frame_info *cur = data->frame_info_head;
367
368 TRACE("(%p)\n", fi);
369
370 if (cur == fi)
371 {
372 data->frame_info_head = cur->next;
373 return;
374 }
375
376 for (; cur->next; cur = cur->next)
377 {
378 if (cur->next == fi)
379 {
380 cur->next = fi->next;
381 return;
382 }
383 }
384
385 ERR("frame not found, native crashes in this case\n");
386}
#define ERR(fmt,...)
Definition: precomp.h:57
FxCollectionEntry * cur

Referenced by __CxxUnregisterExceptionObject().

◆ _IsExceptionObjectToBeDestroyed()

BOOL __cdecl _IsExceptionObjectToBeDestroyed ( const void obj)

Definition at line 391 of file except.c.

392{
394
395 TRACE( "%p\n", obj );
396
397 for (cur = msvcrt_get_thread_data()->frame_info_head; cur; cur = cur->next)
398 {
399 if (cur->object == obj)
400 return FALSE;
401 }
402
403 return TRUE;
404}
#define FALSE
Definition: types.h:117

Referenced by __CxxUnregisterExceptionObject().

◆ _XcptFilter()

int CDECL _XcptFilter ( NTSTATUS  ex,
PEXCEPTION_POINTERS  ptr 
)

Definition at line 278 of file except.c.

279{
280 TRACE("(%08x,%p)\n", ex, ptr);
281 /* I assume ptr->ExceptionRecord->ExceptionCode is the same as ex */
283}
static PVOID ptr
Definition: dispmode.c:27
static LONG msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
Definition: except.c:95
Definition: comerr.c:44

◆ msvcrt_console_handler()

static BOOL WINAPI msvcrt_console_handler ( DWORD  ctrlType)
static

Definition at line 52 of file except.c.

53{
54 BOOL ret = FALSE;
55
56 switch (ctrlType)
57 {
58 case CTRL_C_EVENT:
60 {
63 ret = TRUE;
64 }
65 break;
66 }
67 return ret;
68}
#define SIGINT
Definition: signal.h:23
#define SIG_IGN
Definition: signal.h:48
unsigned int BOOL
Definition: ntddk_ex.h:94
static __sighandler_t sighandlers[NSIG]
Definition: except.c:50
int ret
#define CTRL_C_EVENT
Definition: wincon.h:68

Referenced by msvcrt_free_signals(), and msvcrt_init_signals().

◆ msvcrt_exception_filter()

static LONG msvcrt_exception_filter ( struct _EXCEPTION_POINTERS except)
static

Definition at line 95 of file except.c.

96{
98 __sighandler_t handler;
99
100 if (!except || !except->ExceptionRecord)
102
103 switch (except->ExceptionRecord->ExceptionCode)
104 {
107 {
108 if (handler != SIG_IGN)
109 {
111
112 old_ep = *ep;
113 *ep = except;
116 *ep = old_ep;
117 }
119 }
120 break;
121 /* According to msdn,
122 * the FPE signal handler takes as a second argument the type of
123 * floating point exception.
124 */
132 if ((handler = sighandlers[SIGFPE]) != SIG_DFL)
133 {
134 if (handler != SIG_IGN)
135 {
137 unsigned int i;
138 int float_signal = _FPE_INVALID;
139
141 for (i = 0; i < ARRAY_SIZE(float_exception_map); i++)
142 {
144 except->ExceptionRecord->ExceptionCode)
145 {
146 float_signal = float_exception_map[i].signal;
147 break;
148 }
149 }
150
151 old_ep = *ep;
152 *ep = except;
153 ((float_handler)handler)(SIGFPE, float_signal);
154 *ep = old_ep;
155 }
157 }
158 break;
161 if ((handler = sighandlers[SIGILL]) != SIG_DFL)
162 {
163 if (handler != SIG_IGN)
164 {
166
167 old_ep = *ep;
168 *ep = except;
171 *ep = old_ep;
172 }
174 }
175 break;
176 }
177 return ret;
178}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define except(x)
Definition: btrfs_drv.h:136
#define SIG_DFL
Definition: signal.h:47
#define SIGILL
Definition: signal.h:25
#define SIGFPE
Definition: signal.h:30
#define SIGSEGV
Definition: signal.h:33
UINT(* handler)(MSIPACKAGE *)
Definition: action.c:7512
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define _FPE_INVALID
Definition: float.h:99
#define EXCEPTION_CONTINUE_SEARCH
Definition: excpt.h:91
#define EXCEPTION_CONTINUE_EXECUTION
Definition: excpt.h:92
long LONG
Definition: pedump.c:60
static const struct @4354 float_exception_map[]
void **CDECL __pxcptinfoptrs(void)
Definition: except.c:73
void(CDECL * float_handler)(int, int)
Definition: except.c:78
Definition: ps.c:97
#define EXCEPTION_FLT_STACK_CHECK
Definition: winbase.h:347
#define EXCEPTION_FLT_UNDERFLOW
Definition: winbase.h:348
#define EXCEPTION_FLT_OVERFLOW
Definition: winbase.h:346
#define EXCEPTION_FLT_DENORMAL_OPERAND
Definition: winbase.h:342
#define EXCEPTION_FLT_INEXACT_RESULT
Definition: winbase.h:344
#define EXCEPTION_ILLEGAL_INSTRUCTION
Definition: winbase.h:353
#define EXCEPTION_ACCESS_VIOLATION
Definition: winbase.h:337
#define EXCEPTION_FLT_INVALID_OPERATION
Definition: winbase.h:345
#define EXCEPTION_PRIV_INSTRUCTION
Definition: winbase.h:351
#define EXCEPTION_FLT_DIVIDE_BY_ZERO
Definition: winbase.h:343

Referenced by _XcptFilter().

◆ msvcrt_free_signals()

void msvcrt_free_signals ( void  )

Definition at line 185 of file except.c.

186{
188}
BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleCtrlHandler(PHANDLER_ROUTINE HandlerRoutine, BOOL Add)
Definition: console.c:2109
static BOOL WINAPI msvcrt_console_handler(DWORD ctrlType)
Definition: except.c:52

◆ msvcrt_init_signals()

void msvcrt_init_signals ( void  )

Definition at line 180 of file except.c.

◆ raise()

int CDECL raise ( int  sig)

Definition at line 228 of file except.c.

229{
230 __sighandler_t handler;
231
232 TRACE("(%d)\n", sig);
233
234 switch (sig)
235 {
236 case SIGFPE:
237 case SIGILL:
238 case SIGSEGV:
239 handler = sighandlers[sig];
240 if (handler == SIG_DFL) _exit(3);
241 if (handler != SIG_IGN)
242 {
244
245 sighandlers[sig] = SIG_DFL;
246
247 old_ep = *ep;
248 *ep = NULL;
249 if (sig == SIGFPE)
251 else
252 handler(sig);
253 *ep = old_ep;
254 }
255 break;
256 case SIGABRT:
257 case SIGINT:
258 case SIGTERM:
259 case SIGBREAK:
260 handler = sighandlers[sig];
261 if (handler == SIG_DFL) _exit(3);
262 if (handler != SIG_IGN)
263 {
264 sighandlers[sig] = SIG_DFL;
265 handler(sig);
266 }
267 break;
268 default:
269 return -1;
270 }
271 return 0;
272}
void _exit(int exitcode)
Definition: _exit.c:25
#define SIGTERM
Definition: signal.h:39
#define SIGABRT
Definition: signal.h:28
#define SIGBREAK
Definition: signal.h:40
#define NULL
Definition: types.h:112
#define _FPE_EXPLICITGEN
Definition: float.h:109

◆ signal()

__sighandler_t CDECL signal ( int  sig,
__sighandler_t  func 
)

Definition at line 196 of file except.c.

197{
198 __sighandler_t ret = SIG_ERR;
199
200 TRACE("(%d, %p)\n", sig, func);
201
202 if (func == SIG_ERR) return SIG_ERR;
203
204 switch (sig)
205 {
206 /* Cases handled internally. Note SIGTERM is never generated by Windows,
207 * so we effectively mask it.
208 */
209 case SIGABRT:
210 case SIGFPE:
211 case SIGILL:
212 case SIGSEGV:
213 case SIGINT:
214 case SIGTERM:
215 case SIGBREAK:
216 ret = sighandlers[sig];
217 sighandlers[sig] = func;
218 break;
219 default:
220 ret = SIG_ERR;
221 }
222 return ret;
223}
#define SIG_ERR
Definition: signal.h:52
GLenum func
Definition: glext.h:6028

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( seh  )

Variable Documentation

◆ 

const struct { ... } float_exception_map[]

◆ sighandlers

__sighandler_t sighandlers[NSIG] = { SIG_DFL }
static

Definition at line 50 of file except.c.

Referenced by msvcrt_console_handler(), msvcrt_exception_filter(), raise(), and signal().

◆ signal

◆ status

Definition at line 83 of file except.c.