커널 드라이버 C++로 개발해보기 1탄

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 연산자로 하는게 좋다고 생각합니다. 완벽하게 유저모드처럼 사용할 수 없으니 각자 입맛에 맞게 사용하면 될 것 같습니다.

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

11 Microcurruption의 Addis Ababa다. 4482: 3f40 0a00 mov #0xa, r15 4486: b012 5045 call #0x4550 <putchar> 448a: 8193 0...