상세 컨텐츠

본문 제목

SIMPLE DEVICE DRIVER 예제 파악하기

청강컴정/시스템프로그래밍

by luckey 2009. 3. 12. 21:05

본문

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


관련글 더보기

댓글 영역