본문 바로가기
Programming/윈도우 드라이버

Function

by 유주원 2013. 1. 4.

WdfFdoInitSetFilter


- 프레임워크에게 디바이스 오브젝트가 필터 드라이버임을 알리기 위한 함수.

- 필터 드라이버는 전형적으로 몇몇의 I/O Request를 처리하며, 대부분의 Request는 다음 

   드라이버로 전송하는 역할을 한다.

- 그런데 만약 프레임워크가 어떤 Request를 수신하였고 드라이버는 해당하는 Request type과
   일치하는 I/O queue를 생성하지
 않았을 경우, 프레임워크의 처리 방법은 WdfFdoInitSetFilter를
   호출했느냐 아니냐에 따라 달라지게 된다.

 

  •    만약 드라이버가 WdfFdoInitSetFilter를 호출했다면, 드라이버 프레임 워크는 Request를
       다음 
    드라이버로 보낸다.
  •    만약 드라이버가 WdfFdoInitSetFilter를 호출하지 않았다면, 프레임워크는
       STATUS_INVALID_DEVICE_REQUEST라는
     상태 값과 함께 Request를 완료한다.

 

- IRQL : PASSIVE_LEVEL

 

WdfDeviceInitSetDeviceType


- 특정한 디바이스로 디바이스 타입을 설정하기 위한 함수.

  •    만약 드라이버가 WdfDeviceInitSetDeviceType을 호출한다면, 이는 WdfDeviceCreate 전에
       일어나야 한다.

- 드라이버가 명시하는 디바이스 타입은 드라이버가 I/O request를 완료할 때 프레임워크가
   사용하는 디폴트 우선권의 값을
 결정한다.

  

- IRQL : <= DISPATCH_LEVEL

 

 WdfDeviceCreate


- 프레임워크 디바이스 오브젝트를 생성하는 함수.

- WdfDeviceCreate를 호출하기 전에, 드라이버는 WDFDEVICE_INIT 구조체를 초기화하는 함수를
   호출해야 한다.

- 만약 드라이버가 초기화하는 함수를 호출하는 과정에서 에러가 발생한다면, WdfDeviceCreate
   함수는 호출될 수 없다.

- 이 경우, 드라이버는 WdfDeviceInitFree를 호출해야 한다.

- WdfDeviceCreate는 기능 디바이스 오브젝트(FDO) 또는 물리 디바이스 오브젝트(PDO)로
   대표되는 프레임워크 디바이스 
오브젝트를 생성한다.

- 함수가 생성하는 디바이스 오브젝트의 타입은 드라이버가 WDFDEVICE_INIT 구조체를 어떻게
   얻었느냐에 따라 결정된다.

    

  •      만약 드라이버가 EvtDriverDeviceAdd 콜백으로부터 WDFDEVICE_INIT 구조체를
         수신하였다면, 
    WdfDeviceCreate는 FDO를 생성한다.
  •      만약 드라이버가 EvtChildListCreateDevice 콜백 혹은 WdfPdoInitAllocate를 호출함으로써
         WDFDEVICE_INIT
     구조체를 수신하였다면, WdfDeviceCreate는 PDO를 생성한다.

    

- 드라이버가 WdfDeviceCreate를 호출한 이후에는 더 이상 WDFDEVICE_INIT 구조체에 접근할
   필요가 없다. 

- 프레임워크를 사용하는 미니포트 드라이버는 반드시 WdfDeviceCreate 대신에
   WdfDeviceMiniportCreate를 호출해야 한다.

- 각 프레임워크 디바이스 오브젝트의 부모는 드라이버의 프레임워크 드라이버 오브젝트이다.

- 드라이버는 부모를 변경할 수 없으며, WDF_OBJECT_ATTRIBUTES 구조체의 ParentObject는 

   반드시 NULL이어야 한다.

- Pnp 관리자가 디바이스가 제거되었음을 통보할 때 프레임워크는 각각의 프레임워크 디바이스
   오브젝트(몇몇의 컨트롤 디바이스 오브젝트는 제외)를 제거한다.

- 만약 드라이버가 EvtCleanupCallback 또는 EvtDestroyCallback을 제공한다면, 프레임워크는 이
   함수들을 IRQL이 PASSIVE_LEVEL일 때 호출해야 한다.

 

- IRQL : PASSIVE_LEVEL