mirror of
https://github.com/reactos/reactos.git
synced 2024-11-11 17:21:17 +00:00
c424146e2c
svn path=/branches/cmake-bringup/; revision=48236
86 lines
1.7 KiB
C
86 lines
1.7 KiB
C
/**
|
|
* This file has no copyright assigned and is placed in the Public Domain.
|
|
* This file is part of the w64 mingw-runtime package.
|
|
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <stdlib.h>
|
|
#include <setjmp.h>
|
|
|
|
typedef void (*func_ptr) (void);
|
|
extern func_ptr __CTOR_LIST__[];
|
|
extern func_ptr __DTOR_LIST__[];
|
|
|
|
static HMODULE hMsvcrt = NULL;
|
|
static int free_Msvcrt = 0;
|
|
|
|
typedef void __cdecl flongjmp(jmp_buf _Buf,int _Value);
|
|
|
|
flongjmp *fctMsvcrtLongJmp = NULL;
|
|
|
|
void __do_global_dtors (void);
|
|
void __do_global_ctors (void);
|
|
void __main (void);
|
|
|
|
void
|
|
__do_global_dtors (void)
|
|
{
|
|
static func_ptr *p = __DTOR_LIST__ + 1;
|
|
|
|
while (*p)
|
|
{
|
|
(*(p)) ();
|
|
p++;
|
|
}
|
|
if (free_Msvcrt && hMsvcrt)
|
|
{
|
|
free_Msvcrt = 0;
|
|
FreeLibrary (hMsvcrt);
|
|
hMsvcrt = NULL;
|
|
}
|
|
}
|
|
|
|
void
|
|
__do_global_ctors (void)
|
|
{
|
|
unsigned long nptrs = (unsigned long) (ptrdiff_t) __CTOR_LIST__[0];
|
|
unsigned long i;
|
|
|
|
if (!hMsvcrt) {
|
|
hMsvcrt = GetModuleHandleA ("msvcr80.dll");
|
|
if (!hMsvcrt)
|
|
hMsvcrt = GetModuleHandleA ("msvcr70.dll");
|
|
if (!hMsvcrt)
|
|
hMsvcrt = GetModuleHandleA ("msvcrt.dll");
|
|
if (!hMsvcrt) {
|
|
hMsvcrt = LoadLibraryA ("msvcrt.dll");
|
|
free_Msvcrt = 1;
|
|
}
|
|
fctMsvcrtLongJmp = (flongjmp *) GetProcAddress( hMsvcrt, "longjmp");
|
|
}
|
|
|
|
if (nptrs == (unsigned long) -1)
|
|
{
|
|
for (nptrs = 0; __CTOR_LIST__[nptrs + 1] != 0; nptrs++);
|
|
}
|
|
|
|
for (i = nptrs; i >= 1; i--)
|
|
{
|
|
__CTOR_LIST__[i] ();
|
|
}
|
|
|
|
atexit (__do_global_dtors);
|
|
}
|
|
|
|
static int initialized = 0;
|
|
|
|
void
|
|
__main (void)
|
|
{
|
|
if (!initialized)
|
|
{
|
|
initialized = 1;
|
|
__do_global_ctors ();
|
|
}
|
|
}
|