//NTDDK.H 파일을 포함하는 문장이다. 이 파일을 포함해야 앞으로 나오는 모든 구조체, 자료형, DDK 함수를 사용할 수 있다.
#include <ntddk.h>
//DEVICE_EXTENSION 구조체를 정의하는 문장
typedef struct
{
//NextLayerDeviceObject 포인터 변수 선언
PDEVICE_OBJECT NextLayerDeviceObject;
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//SIMPLE_AddDevice 함수
NTSTATUS
SIMPLE_AddDevice
(
IN
PDRIVER_OBJECT DriverObject,
IN
PDEVICE_OBJECT PhysicalDeviceObject;
)
{
NTSTATUS returnStatus = STATUS_SUCCESS;
PDEVICE_OBJECT DeviceObject = NULL;
PDEVICE_EXTENSION deviceExtension;
//IoCreateDevice() 함수 : DEVICE_OBJECT를 생성하는 함수
//DEVICE_OBJECT는 대표적인 Context중에 하나이다.(일종의 주변장치를 표현하는 Context)
returnStatus = IoCreateDevice
(
DriverObject,
sizeof(DEVICE_EXTENSION),
NULL,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&DeviceObject
);
//개발자가 의미를 부여하여 사용하고 싶은 메모리의 주소를 담을 수 있도록 지원한다.
//이러한 메모리를 deviceExtension이라고 한다.
//예를 들어 이 장치가 어떤 장치이며 어떤 입출력 주소를 사용하는지 등의 장치 종속적인 정보를 보관/사용한다.
deviceExtension = DeviceObject -> DeviceExtension;
deviceExtension -> NextLayerDeviceObject =
IoAttachDeviceToDeviceStack (
DeviceObject,
PhysicalDeviceObject
);
DeviceObject -> Flags &= ~DO_DEVICE_INITALIZING;
return returnStatus;
}
NTSTATUS
SIMPLE_PnpDispatch
(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
PIO_STACK_LOCATION pStack;
PDEVICE_EXTENSION deviceExtension;
NTSTATUS returnStatus = STATUS_SUCCESS;
PDEVICE_OBJECT NextLayerDeviceObject;
pStack = IoGetCurrentIrpStackLocation ( Irp );
deviceExtension = DeviceObject->DeviceExtension;
NextLayerDeviceObject = deviceExtension->NextLayerDeviceObject;
switch ( pStack->MinorFunction )
{
case IRP_MN_REMOVE_DEVICE :
{
IoDetachDevice ( NextLayerDeviceObject );
IoDeleteDevice ( DeviceObject );
}
break;
}
IoSkipCurrentIrpStackLocation( Irp );
returnStatus = IoCallDriver(NextLayerDeviceObject, Irp);
return returnStatus;
}
VOID
SIMPLE_Unload
(
IN PDRIVER_OBJECT DriverObject
)
{
}
//extern "c" //C++에서 작업을 할경우 함수이름이 바뀌는것을 방지하기 위해서 반드시 작성한다.!!!
NTSTATUS
//자료형(실제 내용은 int 이다.) - 무언가 상태를 나타낸다.
DriverEntry
//이름이 정해져 있다.(중요!!!!) - DriverEntry@AACFAEFDAFEFFASDFV : C++로 작성되었을경우 함수다형성 때문에 이와같이 될 수도 있다. (맹글링현상)
(
//P는 포인터이다. P가 붙으면 주소값이 들어간다는걸 의미한다.
IN PDRIVER_OBJECT DriverObject,
//들어간다. (함수 안으로) IN은 공백이다 소스 작성자가 오해하지 말라고 써준다.
IN PUNICODE_STRING RegistryPath
//들어간다.
)
{
//드라이버 개발시 성공은 0이다.
NTSTATUS returnStatus = STATUS_SUCCESS;
//성공 : 0,
// -> 왼쪽에 있는것은 주소이다.
// 어떤 포인터 내에 있는 변수에 값을 넣는다.
//SIMPLE_Unload, SIMPLE_AddDevice, SIMPLE_PnpDispatch는 함수명이다.!!!
DriverObject->DriverUnload = SIMPLE_Unload; //SIMPLE_Unload
DriverObject->DriverExtension->AddDevice = SIMPLE_AddDevice; //SIMPLE_AddDevice
//어떤 포인터안에 있는 배열안에 있는 []번째 주소에 값을 넣는다.
DriverObject->MajorFunction[IRP_MJ_PNP] = SIMPLE_PnpDispatch; //SIMPLE_PnpDispatch
return returnStatus;
}
댓글 영역