//
*************************************************************************
//
*************************************************************************
typedef void (__cdecl *PFN_T)();
//
*************************************************************************
class AtExitCall
{
public:
AtExitCall(PFN_T pF)
{
m_pF = pF;
m_Next = m_ListHeader;
m_ListHeader = this;
}
~AtExitCall(void)
{
m_pF();
m_ListHeader = this->m_Next;
}
static void Run()
{
while
(m_ListHeader)
delete m_ListHeader;
}
PFN_T m_pF;
AtExitCall* m_Next;
static AtExitCall* m_ListHeader;
static NTSTATUS m_Status;
};
//
*************************************************************************
__declspec(selectany) AtExitCall* AtExitCall::m_ListHeader = NULL;
__declspec(selectany) NTSTATUS AtExitCall::m_Status = STATUS_SUCCESS;
//
*************************************************************************
__declspec(selectany) PFN_T xc_a[1] = {0};
__declspec(selectany) PFN_T xc_z[1] = {0};
__declspec(allocate(
".CRT$XCA"
)) __declspec(selectany) PFN_T xc_a[1] = {0};
__declspec(allocate(
".CRT$XCZ"
)) __declspec(selectany) PFN_T xc_z[1] = {0};
//
*************************************************************************
inline NTSTATUS cpplib_Startup()
{
for
(PFN_T *pF = xc_a;pF < xc_z;pF++)
if
(*pF)
(*pF)();
return
AtExitCall::m_Status;
}
//
*************************************************************************
inline void cpplib_Exit()
{
AtExitCall::Run();
}
//
*************************************************************************
extern
"C"
inline int __cdecl atexit(PFN_T pF)
{
return
(new AtExitCall(pF) == 0) ? (*pF)(), AtExitCall::m_Status = STATUS_UNSUCCESSFUL, 1 : 0;
}
//
*************************************************************************
extern
"C"
inline int _cdecl puts(const char *p)
{
DbgPrint(p);
return
0;
}
//
*************************************************************************
extern
"C"
inline void _cdecl
exit
(int Code)
{
KeBugCheck(Code);
}
//
*************************************************************************