(Win32 : WindowsProgramming-32) Driver Example

Posted by : at

Category : win32   WindowsProgramming


Driver와 API

  • Driver 소스에서는 Win32 API를 사용할 수 없다.
    • 생각해보면 당연한게 Win32 API는 User Mode 주소에 있기에 Win32 API를 쓰자고 User Mode메모리를 모두 올리는게 이상하다
    • Kernel API를 사용해야 한다.
  • printf() : 내부적으로 Win32를 사용 Driver에서는 사용불가
  • strlen() : Win32를 사용하지 않지만 Driver에서는 ANSI가 아닌 UNICODE를 사용하기에 불편

Driver Example

  • 프로세스의 생성(CreateProcess), 종료(ExitProcess/TerminateProcess)를 감시하기 위한 API를 만들어보자.
  • 참고로 Kernel API 중 (PsSetCreateProcessNotifyRoutine)을 이용시 프로세스의 생성/종료를 통보 받을 수 있다.
#pragma warning(disable:4100)

#include <ntddk.h>

void foo(HANDLE ParentId, HANDLE ProcessId, BOOLEAN Create)
{
    if(Create)
        DbgPrint("Create Process : %d", ProcessId);
    else
        DbgPrint("Terminated Process : %d", ProcessId);
}

void DriverUnload(PDRIVER_OBJECT pDriver)
{
    DbgPrint("Ex2 : DriverUnload");
    PsSetCreateProcessNotifyRoutine(foo, TRUE/*foo라는 함수의 등록을 취소하겠다*/);
}

extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath)
{
    DbgPrint("Ex2 : DriverEntry");

    pDriver->DriverUnload = DriverUnload;

    PsSetCreateProcessNotifyRoutine(foo, FALSE/*foo 라는 함수를 등록하겠다*/);

    return STATUS_SUCCESS;
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links