📄 libcpp.cpp
字号:
/*
This is a C++ run-time library for Windows kernel-mode drivers.
Copyright (C) 2004 Bo Brant閚.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
extern "C" {
#include <ntddk.h>
}
#include <libcpp.h>
typedef void (__cdecl *func_t)();
//
// Data segment with pointers to C++ initializers.
//
#pragma data_seg(".CRT$XCA")
func_t xc_a[] = { 0 };
#pragma data_seg(".CRT$XCZ")
func_t xc_z[] = { 0 };
#pragma data_seg()
#pragma comment(linker, "/merge:.CRT=.data")
//
// Simple class to keep track of functions registred to be called when
// unloading the driver. Since we only use this internaly from the load
// and unload functions it doesn't need to be thread safe.
//
class AtExitCall {
public:
AtExitCall(func_t f) : m_func(f), m_next(m_exit_list) { m_exit_list = this; }
~AtExitCall() { m_func(); m_exit_list = m_next; }
static run() { while (m_exit_list) delete m_exit_list; }
private:
func_t m_func;
AtExitCall* m_next;
static AtExitCall* m_exit_list;
};
AtExitCall* AtExitCall::m_exit_list = 0;
void* __cdecl operator new(size_t size)
{
return size ? ExAllocatePool(NonPagedPool, size) : 0;
}
void* __cdecl operator new(size_t size, POOL_TYPE type)
{
return size ? ExAllocatePool(type, size) : 0;
}
void __cdecl operator delete(void* p)
{
if (p) { ExFreePool(p); }
}
extern "C" {
//
// Calls functions the compiler has registred to call constructors
// for global and static objects.
//
void __cdecl libcpp_init()
{
for (func_t* f = xc_a; f < xc_z; f++) if (*f) (*f)();
}
//
// Calls functions the compiler has registred to call destructors
// for global and static objects.
//
void __cdecl libcpp_exit()
{
AtExitCall::run();
}
//
// Registers a function to be called when unloading the driver. If memory
// couldn't be allocated the function is called immediately since it never
// will be called otherwise.
//
int __cdecl atexit(func_t f)
{
return (new AtExitCall(f) == 0) ? (*f)(), 1 : 0;
}
} // extern "C"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -