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

커널 드라이버를 C++로 개발하면 안 좋은점 (순전히 제 입장)
1. 직관적이지 않아서 디버깅이 불편하다 (복잡할수록 메모리를 추적하다가 머가리 깨짐)
2. STL(Standard Template Library)을 사용할 수 없다
3. 실행 속도가 느리다 (?)

사실, 1번 같은 경우는 리버싱 잘 하는 사람에게는 그닥 문제가 없습니다. 그리고 저도 그렇게 잘 해야만 제 가치가 올라가겠죠. 2번 같은 경우는 오래 전부터 그랬었고 막상 구현하다보면 그렇게 써야만 하는 일이 별로 없습니다. LIST_ENTRY나 RTL_GENERIC_TABLE을 잘 활용하면 아직까지는 왠만큼 커버가 됩니다. 3번은 아무래도 가급적 높은 성능을 내야 하는 커널 드라이버에게는 치명상입니다. 특히나 커널 모듈을 쓰는 이유가 높은 권한과 실시간으로 뭔가 할려고 사용하는건데 코드 복잡해지고 무거워지면 글쎄요.

아무튼 그래서 결론! 생성자와 소멸자를 사용할 수 있고, 변수와 함수를 하나의 덩어리로 묶어줄 수 있으면서 되도록이면 가상함수, 상속, 다형성을 이용하지 않는 클래스의 기본 기능만 사용하자! 입니다. (그럴거면 구조체로도 충분히 구현 가능하지만 -_-) 이렇게만 사용해도 꽤 복잡하지 않게 코딩할 수가 있습니다!

class Singleton final
{
private:
       static Singleton* m_Instance;
public:
       Singleton() {}
       ~Singleton() {}

       static Singleton* GetInstance(VOID)
       {       
              if (m_Instance == NULL)
              {             
                     m_Instance = new Singleton();
              } 

              return m_Instance;
       }

       void Release(VOID)
       {
              if (m_Instance != NULL)
              {
                     delete m_Instance;
                     m_Instance = NULL;
              }
       }
};

Singleton* Singleton::m_Instance = NULL;

단순한 싱글톤 패턴입니다. 윈도우에서 제공하는 함수에 콜백함수를 등록하는 멤버 함수는 클래스에 의해 가려져 있으면 호출이 불가능해서 컴파일조차 되지 않습니다. 그냥 뭐랄까. 전역변수를 여기저기 뿌려 놓으면 관리하기도 힘들고, 코드가 지저분하니깐 관련 있는 기능을 한 곳에 모아서 관리하는 느낌이랄까요. 일단은 이 정도가 최선인 것 같습니다. 더 많은 기능을 써야 한다면 그 때 추가해보는걸로...

댓글 없음:

댓글 쓰기

Microcurruption Addis Ababa

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