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;
}