class KernelObject
{
private:
int m_data;
public:
KernelObject()
{
m_data = 10;
}
~KernelObject()
{
m_data = 0;
}
void* __cdecl operator new(_In_ size_t count)
{
return (PVOID)ExAllocatePool(NonPagedPool, count);
}
void __cdecl operator delete(_In_ PVOID object)
{
ExFreePool(object);
}
};
KernelObject* obj1 =
(KernelObject*)ExAllocatePool(NonPagedPool, sizeof(KernelObject));
if (obj1 != NULL)
{
ExFreePool(obj1);
obj1 = NULL;
}
KernelObject* obj2 = new KernelObject();
if (obj2 != NULL)
{
delete obj2;
obj2 = NULL;
}
ExAllocatePool/ExFreePool을 사용해서 오브젝트를 할당하면 파라미터 값으로 넘어온 크기 만큼의 메모리가 할당되고 해제되지만 new/delete를 사용하면 오브젝트의 생성자와 소멸자도 호출합니다. 연산자 오버로딩을 사용해서 커널모드에서도 포팅할 수 있도록 한 것 같네요. 물론, 클래스 안에 연산자를 오버로딩 했기 때문에 일반 자료형에는 사용할 수 없습니다. new/delete 연산자 오버로딩을 전역적으로 정의하면 일반 자료형도 사용할 수 있지만 저는 꼭 그렇게까지 사용해야하나 싶네요. 일단은 커널에서 전역 데이터를 관리하는 객체를를 만들 때만 new/delete 연산자로 하는게 좋다고 생각합니다. 완벽하게 유저모드처럼 사용할 수 없으니 각자 입맛에 맞게 사용하면 될 것 같습니다.
댓글 없음:
댓글 쓰기