다음을 통해 공유


WDM 디바이스 스택 예제

이 섹션에서는 WDM 디바이스 개체 및 계층화 방법을 설명하기 위해 USB 하드웨어용 드라이버 집합에서 만든 디바이스 개체에 대해 설명합니다.

다음 그림에서는 WDM 드라이버 계층: 예제에 설명된 샘플 드라이버에서 만든 디바이스 개체를 보여 줍니다.

usb 조이스틱에 대한 샘플 wdm 디바이스 개체 계층을 보여 주는 다이어그램

이 그림의 맨 아래에서 시작하여 샘플 디바이스 스택의 디바이스 개체는 다음과 같습니다.

  1. PCI 버스에 대한 PDO 및 FDO입니다.

    루트 버스 드라이버는 내부 시스템 버스(루트 버스)를 열거하고 찾은 각 디바이스에 대해 PDO를 만듭니다. 이러한 PDO 중 하나는 PCI 버스용입니다. (루트 버스의 PDO 및 FDO는 그림에 표시되지 않습니다.)

    PnP 관리자는 PCI 드라이버를 PCI 버스의 함수 드라이버로 식별하고, 드라이버를 로드하고(아직 로드되지 않은 경우) PDO를 PCI 드라이버에 전달합니다. AddDevice 루틴에서 PCI 드라이버는 PCI 버스(IoCreateDevice)에 대한 FDO를 만들고 PCI 버스의 디바이스 스택(IoAttachDeviceToDeviceStack)에 FDO를 연결합니다. PCI 드라이버는 PCI 버스의 함수 드라이버로서의 책임의 일부로 이 FDO를 만들고 연결합니다.

    이 예제에는 PCI 버스에 대한 필터 드라이버가 없습니다.

  2. USB 호스트 컨트롤러에 대한 PDO 및 FDO입니다.

    PnP 관리자는 PCI 드라이버에 디바이스(IRP_MN_START_DEVICE)를 시작하도록 지시한 다음 관계 유형이 BusRelations인 자식(IRP_MN_QUERY_DEVICE_RELATIONS)에 대해 PCI 드라이버를 쿼리합니다. 이에 대한 응답으로 PCI 드라이버는 버스의 디바이스를 열거합니다. 이 예제에서 PCI 드라이버는 USB 호스트 컨트롤러를 찾고 해당 디바이스에 대한 PDO를 만듭니다. 그림의 넓은 화살표는 USB 호스트 컨트롤러가 PCI 버스의 "자식"임을 나타냅니다. PCI 드라이버는 PCI 버스에 대한 버스 드라이버로서의 책임의 일환으로 자식 디바이스에 대한 PDO를 만듭니다.

    PnP 관리자는 USB 호스트 컨트롤러 미니클래스/클래스 드라이버 쌍을 USB 호스트 컨트롤러의 함수 드라이버로 식별하고 드라이버 쌍을 로드합니다. PnP 관리자는 적절한 시간에 드라이버 쌍을 호출하여 USB 호스트 컨트롤러에 대한 FDO를 만들고 연결합니다.

    이 예제에는 USB 호스트 컨트롤러에 대한 필터 드라이버가 없습니다.

  3. USB 허브에 대한 PDO 및 FDO입니다.

    USB 호스트 컨트롤러는 해당 버스를 열거하고, 단독 포트에서 USB 허브를 찾고, 허브에 대한 PDO를 만듭니다. USB 허브 드라이버는 허브에 대한 FDO를 만들고 연결합니다.

    이 예제에는 USB 허브에 대한 필터 드라이버가 없습니다.

  4. 조이스틱 디바이스에 대한 PDO, FDO 및 두 개의 필터 DO입니다.

    USB 허브 드라이버는 버스를 열거하고 HID 디바이스(조이스틱)를 찾고 조이스틱용 PDO를 만듭니다.

    이 예제에서는 조이스틱 디바이스용 레지스트리에 하위 수준 필터 드라이버가 설정되었으므로 PnP 관리자가 필터 드라이버를 로드합니다. 필터 드라이버는 디바이스와 관련이 있음을 확인하고 필터 DO를 만들어 디바이스 스택에 연결합니다.

    PnP 관리자는 조이스틱 디바이스의 함수 드라이버가 HID 클래스/미니클래스 드라이버 쌍임을 확인하고 해당 드라이버를 로드합니다. 드라이버 쌍은 클래스 드라이버 DLL에 연결된 미니클래스 드라이버로 구성됩니다. 함께 디바이스에 대한 하나의 함수 드라이버 역할을 합니다. 클래스/미니클래스 드라이버 쌍은 하나의 디바이스 개체인 FDO를 만들고 디바이스 스택에 연결합니다.

    상위 수준 필터 드라이버는 하위 수준 필터와 유사한 방식으로 필터 DO를 만들어 디바이스 스택에 연결합니다.

부모 버스 드라이버에서 만든 PDO는 항상 특정 디바이스에 대한 디바이스 스택의 맨 아래에 있습니다. 드라이버가 PnP 또는 전원 IRP를 처리할 때 각 IRP를 디바이스 스택 아래로 PDO 및 관련 버스 드라이버에 전달해야 합니다.

다음 그림에서는 이전 그림과 동일한 디바이스 스택을 보여 주지만 어떤 디바이스 개체가 어떤 드라이버에 의해 만들어지고 관리되는지를 강조합니다.

드라이버 관점에서 샘플 디바이스 개체 계층을 보여 주는 다이어그램

버스 드라이버는 둘 이상의 디바이스 스택에 걸쳐 있습니다. 버스 드라이버는 버스 어댑터/컨트롤러에 대한 FDO를 만들고 각 자식 디바이스에 대한 PDO를 만듭니다.