71 lines
1.1 KiB
C
71 lines
1.1 KiB
C
|
#include "crt.h"
|
||
|
|
||
|
#define atexitBufferSize 32
|
||
|
|
||
|
char pureCallMessage[] = "PURE function call!";
|
||
|
|
||
|
char *__argv = 0;
|
||
|
|
||
|
void (__cdecl *atExitList[atexitBufferSize])();
|
||
|
int atExitFnNum = 0;
|
||
|
|
||
|
void exit()
|
||
|
{ int i;
|
||
|
|
||
|
for ( i = atExitFnNum - 1; i >= 0; i-- )
|
||
|
atExitList[i]();
|
||
|
|
||
|
__asm
|
||
|
{
|
||
|
mov eax, -1
|
||
|
int 0x40
|
||
|
};
|
||
|
};
|
||
|
|
||
|
int __cdecl atexit( void (__cdecl *func )( void ))
|
||
|
{
|
||
|
//
|
||
|
if ( atExitFnNum < atexitBufferSize )
|
||
|
{
|
||
|
//
|
||
|
atExitList[atExitFnNum++] = func;
|
||
|
return 0;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int __cdecl _purecall()
|
||
|
{
|
||
|
exit();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#pragma section(".CRT$XCA",long,read,write)
|
||
|
#pragma section(".CRT$XCZ",long,read,write)
|
||
|
typedef void (__cdecl *_PVFV)(void);
|
||
|
__declspec(allocate(".CRT$XCA")) _PVFV __xc_a[1] = { 0 };
|
||
|
__declspec(allocate(".CRT$XCZ")) _PVFV __xc_z[1] = { 0 };
|
||
|
//
|
||
|
#pragma comment(linker, "/merge:.CRT=.rdata")
|
||
|
//
|
||
|
void crtStartUp()
|
||
|
{_PVFV *pbegin;
|
||
|
|
||
|
_asm {fninit};
|
||
|
|
||
|
for ( pbegin = __xc_a; pbegin < __xc_z; pbegin++ )
|
||
|
{
|
||
|
//
|
||
|
if ( *pbegin != 0 )
|
||
|
(**pbegin)();
|
||
|
}
|
||
|
__argv = *((char **)0x1C);
|
||
|
main();
|
||
|
exit();
|
||
|
}
|
||
|
|
||
|
|