ReactOS 0.4.16-dev-1946-g52006dd
longjmp.c File Reference
#include <setjmp.h>
#include <intrin.h>
Include dependency graph for longjmp.c:

Go to the source code of this file.

Macros

#define _JUMP_BUFFER_COOKIE   0x56433230
 

Typedefs

typedef void(__stdcallPUNWIND_ROUTINE) (const _JUMP_BUFFER *)
 

Functions

void __cdecl _global_unwind2 (void *Registration)
 
void _stdcall _seh_longjmp_unwind (const _JUMP_BUFFER *_Buf)
 
 __declspec (noreturn)
 

Macro Definition Documentation

◆ _JUMP_BUFFER_COOKIE

#define _JUMP_BUFFER_COOKIE   0x56433230

Definition at line 11 of file longjmp.c.

Typedef Documentation

◆ PUNWIND_ROUTINE

typedef void(__stdcall * PUNWIND_ROUTINE) (const _JUMP_BUFFER *)

Definition at line 15 of file longjmp.c.

Function Documentation

◆ __declspec()

__declspec ( noreturn  )

Definition at line 19 of file longjmp.c.

28{
29 const _JUMP_BUFFER* jumpBuffer = (_JUMP_BUFFER*)_Buf;
30
31 /* Ensure _Value is non-zero */
32 _Value = (_Value == 0) ? 1 : _Value;
33
34 /* Check if the exception registration is from a previous function */
35 if (jumpBuffer->Registration != __readfsdword(0))
36 {
37 /* Do a global unwind to the function that owns the target SEH frame */
38 _global_unwind2((void*)jumpBuffer->Registration);
39 }
40
41 /* Check if we have a registration */
42 if (jumpBuffer->Registration != 0)
43 {
44 /* Check if this is a _setjmp3 buffer */
45 if (jumpBuffer->Cookie == _JUMP_BUFFER_COOKIE)
46 {
47 /* Call the unwind function if it is set */
48 PUNWIND_ROUTINE unwindFunc = (PUNWIND_ROUTINE)jumpBuffer->UnwindFunc;
49 if (unwindFunc != NULL)
50 {
51 unwindFunc(jumpBuffer);
52 }
53 }
54 else if (jumpBuffer->Registration != 0xFFFFFFFF)
55 {
56 /* This is a legacy _setjmp buffer, use old style unwind */
57 _seh_longjmp_unwind(jumpBuffer);
58 }
59 }
60
61 __longjmp_nounwind(jumpBuffer, _Value);
62}
_In_ _Value
#define NULL
Definition: types.h:112
void(__stdcall * PUNWIND_ROUTINE)(const _JUMP_BUFFER *)
Definition: longjmp.c:15
void __cdecl _global_unwind2(void *Registration)
void _stdcall _seh_longjmp_unwind(const _JUMP_BUFFER *_Buf)
#define _JUMP_BUFFER_COOKIE
Definition: longjmp.c:11
PPC_QUAL unsigned long __readfsdword(const unsigned long Offset)
Definition: intrin_ppc.h:382
if(dx< 0)
Definition: linetemp.h:194

◆ _global_unwind2()

void __cdecl _global_unwind2 ( void Registration)

◆ _seh_longjmp_unwind()

void _stdcall _seh_longjmp_unwind ( const _JUMP_BUFFER *  _Buf)