You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.0 KiB
104 lines
2.0 KiB
#include <windows.h>
|
|
#include <stdio.h>
|
|
|
|
int __cdecl main(int, char **, char **);
|
|
|
|
typedef void (__cdecl *_PVFV)(void);
|
|
|
|
#pragma data_seg(".CRT$XIA")
|
|
_PVFV __xi_a[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XIZ")
|
|
_PVFV __xi_z[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XCA")
|
|
_PVFV __xc_a[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XCZ")
|
|
_PVFV __xc_z[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XPA")
|
|
_PVFV __xp_a[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XPZ")
|
|
_PVFV __xp_z[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XTA")
|
|
_PVFV __xt_a[] = { NULL };
|
|
|
|
|
|
#pragma data_seg(".CRT$XTZ")
|
|
_PVFV __xt_z[] = { NULL };
|
|
|
|
#if defined(_IA64_)
|
|
#pragma comment(linker, "/merge:.CRT=.srdata")
|
|
#else
|
|
#pragma comment(linker, "/merge:.CRT=.rdata")
|
|
#endif
|
|
|
|
#pragma data_seg() /* reset */
|
|
|
|
_PVFV *__onexitbegin;
|
|
_PVFV *__onexitend;
|
|
|
|
static void
|
|
_initterm (
|
|
_PVFV * pfbegin,
|
|
_PVFV * pfend
|
|
)
|
|
{
|
|
/*
|
|
* walk the table of function pointers from the bottom up, until
|
|
* the end is encountered. Do not skip the first entry. The initial
|
|
* value of pfbegin points to the first valid entry. Do not try to
|
|
* execute what pfend points to. Only entries before pfend are valid.
|
|
*/
|
|
while ( pfbegin < pfend ) {
|
|
/*
|
|
* if current table entry is non-NULL, call thru it.
|
|
*/
|
|
if ( *pfbegin != NULL )
|
|
(**pfbegin)();
|
|
++pfbegin;
|
|
}
|
|
}
|
|
|
|
void
|
|
mainNoCRTStartup(
|
|
void
|
|
)
|
|
{
|
|
__try {
|
|
|
|
// do C initializations
|
|
_initterm( __xi_a, __xi_z );
|
|
// do C++ initializations
|
|
_initterm( __xc_a, __xc_z );
|
|
|
|
main(1, 0, 0);
|
|
|
|
} __except ( EXCEPTION_EXECUTE_HANDLER ) {
|
|
|
|
}
|
|
|
|
__try {
|
|
// Do C++ terminators
|
|
_initterm(__onexitbegin, __onexitend);
|
|
|
|
// do pre-terminators
|
|
_initterm(__xp_a, __xp_z);
|
|
|
|
// do C terminiators
|
|
_initterm(__xt_a, __xt_z);
|
|
|
|
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
|
|
|
}
|
|
}
|
|
|