WDF 드라이버에 대한 WDM 개념

WDF(Windows 드라이버 프레임워크)는 Microsoft WDM(Windows 드라이버 모델) 인터페이스에 대한 래퍼입니다. 프레임워크는 많은 WDM 개념을 간소화하고 다른 개념을 완전히 숨기므로 작업할 필요가 없지만 WDM 드라이버의 기본 개념 중 일부를 이해해야 합니다. 특히 드라이버 유형, 드라이버 스택, 디바이스 스택I/O 요청 패킷을 이해해야 합니다.

드라이버 유형

Windows 기반 드라이버는 버스 드라이버, 함수 드라이버 및 필터 드라이버의 세 가지 유형으로 나뉩니다. 버스 드라이버는 부모 버스에 연결된 자식 디바이스를 감지하고 해당 특성을 보고하여 I/O 버스를 지원합니다. (이 작업을 버스 열거형이라고 합니다.) 함수 드라이버는 디바이스 및 버스에 대한 I/O 작업을 제어합니다. 필터 드라이버는 사용자 애플리케이션과 드라이버 간에 또는 개별 드라이버 간에 흐르는 데이터를 수신, 검토 및 수정할 수 있습니다.

버스용 드라이버는 기본적으로 어린이를 열거하는 기능 드라이버입니다. 드라이버는 버스에서 자식 디바이스를 열거할 때 "버스 드라이버"의 역할을 합니다. 그렇지 않으면 버스 어댑터의 하드웨어에 액세스하는 I/O 작업을 처리할 때 동일한 드라이버가 버스의 "함수 드라이버" 역할을 합니다.

User-Mode 드라이버 프레임워크(UMDF) 드라이버는 버스 드라이버가 될 수 없습니다.

드라이버 스택

Windows 운영 체제에서 WDM 드라이버는 드라이버 스택이라고 하는 세로 호출 시퀀스로 계층화됩니다. 스택의 최상위 드라이버는 일반적으로 요청이 운영 체제의 I/O 관리자를 통과한 후 사용자 애플리케이션에서 I/O 요청을 받습니다. 낮은 드라이버 계층은 일반적으로 컴퓨터 하드웨어와 통신합니다.

간단한 드라이버 스택에는 버스별 I/O 작업을 처리하고 연결된 자식 디바이스를 열거하는 버스 드라이버가 스택 맨 아래에 포함됩니다. 일반적으로 하나 이상의 디바이스별 함수 드라이버가 버스 드라이버 위에 있습니다. 이러한 함수 드라이버는 버스에 연결된 디바이스에 대한 I/O 작업을 처리합니다. 필터 드라이버는 함수 드라이버 위에 있거나 버스 드라이버와 함수 드라이버 사이에 있을 수 있습니다. 실행 중인 시스템에는 다양한 유형의 디바이스를 지원하는 여러 드라이버 스택이 있습니다.

디바이스 스택

각 드라이버 스택은 하나 이상의 디바이스 스택을 지원합니다. 디바이스 스택은 WDM 정의 DEVICE_OBJECT 구조체에서 만든 디바이스 개체 집합입니다. 각 디바이스 스택은 하나의 디바이스를 나타냅니다. 각 드라이버는 각 디바이스에 대한 디바이스 개체를 만들고 각 디바이스 개체를 디바이스 스택에 연결합니다. 디바이스 스택은 디바이스가 연결되고 분리되고 시스템이 다시 부팅될 때마다 만들어지고 제거됩니다.

버스 드라이버가 자식 디바이스가 연결되어 있거나 플러그를 뽑은 것을 감지하면 플러그 앤 플레이(PnP) 관리자에게 알릴 수 있습니다. 이에 대한 응답으로 PnP 관리자는 버스 드라이버에게 부모 디바이스(즉, 버스)에 연결된 각 자식 디바이스에 대한 PDO(물리적 디바이스 개체)를 만들도록 요청합니다. PDO는 디바이스 스택의 아래쪽이 됩니다.

다음으로, PnP 관리자는 함수 및 필터 드라이버를 로드하여 각 디바이스를 지원합니다(아직 로드되지 않은 경우). 그런 다음 PnP 관리자는 이러한 드라이버를 호출하여 각각 디바이스 개체를 만들고 디바이스 스택의 맨 위에 추가할 수 있도록 합니다. 함수 드라이버는 FDO(기능 디바이스 개체)를 만들고 필터 드라이버는 필터 디바이스 개체(필터 DO)를 만듭니다.

I/O 관리자가 디바이스의 드라이버에 I/O 요청을 보내면 디바이스 스택에서 최상위 디바이스 개체를 만든 드라이버에 요청을 전달합니다. 해당 드라이버가 I/O 관리자에게 다음 하위 드라이버에 요청을 전달하도록 요청하는 경우 I/O 관리자는 디바이스 스택을 사용하여 다음 하위 드라이버를 확인합니다. (다음으로 낮은 드라이버는 다음으로 낮은 디바이스 개체를 만든 드라이버입니다.)

WDF는 각 WDM 디바이스 개체에 대한 프레임워크 디바이스 개체를 만듭니다. 프레임워크 기반 드라이버는 WDM 디바이스 개체 대신 이러한 프레임워크 디바이스 개체에 액세스합니다.

I/O 요청 패킷

I/O 관리자는 I/O 요청 패킷(IRP)을 만들어 애플리케이션의 I/O 요청을 드라이버에 보냅니다. IRP에는 I/O 작업(예: 읽기/쓰기 작업)을 수행하는 요청 또는 IOCTL(I/O 컨트롤) 작업 수행 요청(예: 상태 반환)이 포함될 수 있습니다. 또한 PnP 관리자는 드라이버가 수행해야 하는 PnP 및 전원 관리 작업을 나타내는 IRP를 만들고 이러한 IRP를 드라이버에 보냅니다.

일반적으로 I/O 관리자는 사용자 애플리케이션이 읽기 또는 쓰기 작업을 요청할 때 읽기 또는 쓰기 IRP를 만듭니다. I/O 관리자는 IRP를 드라이버 스택의 맨 위에 있는 드라이버에 전달하고, 해당 드라이버는 요청을 서비스하거나 요청을 다음 하위 드라이버에 전달합니다. 일부 요청은 스택의 맨 아래로 이동하며 일부는 상위 수준 드라이버에 의해 완전히 처리됩니다.

드라이버가 IRP를 받을 때마다 드라이버는 작업을 처리해야 하는 디바이스를 나타내는 디바이스 개체에 대한 포인터도 받습니다. 따라서 드라이버 스택의 드라이버는 디바이스 개체를 사용하여 특정 요청이 가야 하는 플러그 인 디바이스를 결정합니다.

WDF 드라이버는 일반적으로 IRP에 직접 액세스하지 않습니다. 프레임워크는 읽기, 쓰기 및 디바이스 I/O 제어 작업을 나타내는 WDM IRP를 KMDF(드라이버 프레임워크) 및 UMDF 드라이버가 I/O 큐에서 수신 Kernel-Mode하는 프레임워크 요청 개체로 변환합니다. 프레임워크는 내부적으로 PnP 및 전원 관리 IRP를 처리하고 이벤트 콜백 함수를 사용하여 드라이버에 PnP 및 전원 이벤트를 알릴 수 있습니다.