안녕하세요 신경준입니다.
윈도우 드라이버를 개발하는 새로운 방법인 WDF는 UMDF(User Mode Driver Foundation) 과 KMDF(Kernel Mode Driver Foundation)으로 나누어집니다. 이름에서 알수 있듯이 드라이버를 유저모드에서도 드라이버를 개발할 수 있습니다. UMDF에 대한 자세한 내용은 WDF문서를 참조해 주십시오
오늘 블로그에 말씀드릴 내용은 KMDF 오브젝트 생성입니다.
[KMDF에서 오브젝트 생성하기]
1. 오브젝트 구성(Configuration) 구조체(WDF_OBJECT_CONFIG)가 존재하면 이 구조체를 초기화하고 값을 대입한다.
오브젝트 구성 구조체는 해당 오브젝트에 연관돼 있는 종속적인 정보에 대한 포인터를 가진다. 예를 들어 드라이버 이벤트 콜백함수에 대한 포인터에 대한 정보를 가진다.
2. 필요하면 오브젝트 속성(Attributes) 구조체를 초기화하고 값을 대입한다.
미리 정의된 WDF_OBJECT_ATTRIBUTES_INIT 매크로를 사용해서 초기화 할 수 있다. 그리고 WDF_OBJECT_ATTRIBUTES_INIT 이 함수는 동기화 레벨이 WdfExecutionLevelInheritFromParent에 종속되어서 에서 동작한다. 부모 오브젝트와 같은 값으로 설정된다.
The WDF_OBJECT_ATTRIBUTES_INIT function sets the ExecutionLevel member of the specified WDF_OBJECT_ATTRIBUTES
structure to WdfExecutionLevelInheritFromParent, and it sets the SynchronizationScope member to
WdfSynchronizationScopeInheritFrom
3. 오브젝트를 생성하기 위해 오브젝트 생성 메소드를 호출한다.
생성 메소드를 호출하면 오브젝트의 핸들을 생성해서 반환한다. 드라이버는 이후 오브젝트를 참조하기 위해서는 생성한 핸들을 사용한다. 내부적으로 생성 메소드는 아래와 같은 처리를 해서 핸들을 생성한다.
-오브젝트와 컨텍스트 영역을 non paged pool 메모리 영역에 할당한다.
-디폴트 값이나 드라이버의 필요한 값으로 오브젝트 속성을 초기화 한다.
-오브젝트의 컨텍스트 영역을 0으로 초기화 한다.
-오브젝트의 이벤트 콜백 포인터를 저장하고 오브젝트 종속적인 특성값을 설정해 오브젝트를 구성 설정한다.
만약 오브젝트 핸들 생성에 실패하면 프레임 워크는 오브젝트를 자동적으로 삭제 한다.
위에서 설명한 내용 이해를 좀 더 쉽게 하기 위해서 WDF에서 제공하는 샘플소스코드를 간단하게 보겠습니다.
NTSTATUS status;
WDFDEVICE device;
WDF_IO_QUEUE_CONFIG ioQueueConfig;
PDEVICE_CONTEXT pDevContext;
WDFQUEUE queue;
...
//
// We will create a separate sequential queue and configure it
// to receive read requests. We also need to register a EvtIoStop
// handler so that we can acknowledge requests that are pending
// at the target driver.
//
//1. 오브젝트 구성(Configuration) 구조체(WDF_OBJECT_CONFIG)가 존재하면 이 구조체를 초기화하고 값을 대입한다.
WDF_IO_QUEUE_CONFIG_INIT(&ioQueueConfig, WdfIoQueueDispatchSequential);
// 오브젝트 구성 구조체에 콜백 함수를 등록한다.
ioQueueConfig.EvtIoRead = OsrFxEvtIoRead;
ioQueueConfig.EvtIoStop = OsrFxEvtIoStop;
// 오브젝트 생성 메소드(WdfIoQueueCreate)를 이용해서 오브젝트 핸들(&queue )을 생성한다.
status = WdfIoQueueCreate(
device,
&ioQueueConfig,
WDF_NO_OBJECT_ATTRIBUTES, //오브젝트 속성은 없는것(WDF_NO_OBJECT_ATTRIBUTES)으로 설정한다.
&queue // queue handle
);
if (!NT_SUCCESS (status)) {
//만약 오브젝트 핸들 생성에 실패하면 프레임 워크는 오브젝트를 자동적으로 삭제 한다.
TraceEvents(TRACE_LEVEL_ERROR, DBG_PNP,
"WdfIoQueueCreate failed 0x%x\n", status);
return status;
}
출처 : 다년간의 프로그램밍 경험 및 WDF 책
(http://www.yes24.com/Goods/FTGoodsView.aspx?goodsNo=2790181&CategoryNumber=001001003016001004)
댓글 없음:
댓글 쓰기