한 걸음씩..

[Device Driver] AddDevice routine 본문

프로그래밍

[Device Driver] AddDevice routine

반엘 2013. 9. 2. 09:30


       AddDevice routine 이 하는 역할

1. Device Context 생성한다

2. 자신의 DeviceObject를 Device Stack 에 포함 시킨다


NTSTATUS SampleAddDevice(

PDRIVER_OBJECT pDriverObject,

PDEVICE_OBJECT pPhysicalDeviceObject

)

{

PDEVICE_EXTENSION pDeviceExtension;

PDEVICE_OBJECT pDeviceObject;

NTSTATUS status = STATUS_SUCCESS;

//Device Context 생성

//생성된 Device Object는 IRP가 전달되는 Device Driver 내에 모든 IRP 명령어 처리기로 항상 전달되는 값으로 사용된다

status = IoCreateDevice( 

pDriverObject,

sizeof(DEVICE_EXTENSION),

NULL,

FILE_DEVICE_UNKNOWN,

0,

FALSE,

&pDeviceObject // 생성된 Device Object 리턴

);

if(!NT_SUCCESS(status))

return STATUS_UNSUCCESSFUL;

pDeviceExtension = (PDEVICE_EXTENSION)pDeviceObject->DeviceExtension;

RtlZeroMemory( pDeviceExtension, sizeof(DEVICE_EXTENSION));

//디바이스 스택 위로 또다른 Device Object가 참여하는 것을 허용

pDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

pDeviceExtension->pLowerDeviceObject = IoAttachDeviceToDeviceStack(

pDeviceObject;

pPhysicalDeviceObject);

return status;

}



       Device Context



Device Driver는 하나의 장치마다 각각 하나의 문맥(Context)를 가질 수 있다

따라서 AddDevice는 DriverEntry와 다르게 장치가 연결될 때 마다 호출되어 Device Context 를 생성한다

IoCreateDevice 함수의 두번째 인자로 sizeof(DEVICE_EXTENSION) 값을 사용하여 생성되는 Device Object내에 

DeviceExtension 구조체 크기만큼의 보조 메모리를 생성하도록 요청한다

DeviceExtension 구조체에는 문맥에 따라서 각각의 장치가 유지해야할 전역적인 변수들을 보관할 수 있다



출처 : 디바이스 드라이버 구조와 원리 그리고 제작 노하우