UMDF 드라이버에서 디바이스 인터페이스 사용

경고

UMDF 2는 UMDF의 최신 버전이며 UMDF 1을 대체합니다. 모든 새 UMDF 드라이버는 UMDF 2를 사용하여 작성해야 합니다. UMDF 1에 새 기능이 추가되지 않으며 최신 버전의 Windows 10 UMDF 1에 대한 지원이 제한되어 있습니다. 유니버설 Windows 드라이버는 UMDF 2를 사용해야 합니다.

보관된 UMDF 1 샘플은 Windows 11 버전 22H2 - 2022년 5월 드라이버 샘플 업데이트에서 찾을 수 있습니다.

자세한 내용은 UMDF를 사용하여 시작 참조하세요.

디바이스 인터페이스는 애플리케이션이 디바이스에 액세스하는 데 사용할 수 있는 PnP(플러그 앤 플레이) 디바이스에 대한 기호 링크입니다. 사용자 모드 애플리케이션은 인터페이스의 기호 링크 이름을 Microsoft Win32 CreateFile 함수와 같은 API 요소에 전달할 수 있습니다. 디바이스 인터페이스의 기호 링크 이름을 가져오기 위해 사용자 모드 애플리케이션은 SetupDi 함수를 호출할 수 있습니다. SetupDi 함수에 대한 자세한 내용은 SetupDi 디바이스 인터페이스 함수를 참조하세요.

각 디바이스 인터페이스는 디바이스 인터페이스 클래스에 속합니다. 예를 들어 CD-ROM 디바이스에 대한 드라이버 스택은 GUID_DEVINTERFACE_CDROM 클래스에 속하는 인터페이스를 제공할 수 있습니다. CD-ROM 디바이스의 드라이버 중 하나는 GUID_DEVINTERFACE_CDROM 클래스의 instance 등록하여 시스템 및 애플리케이션에 CD-ROM 디바이스를 사용할 수 있음을 알릴 것입니다. 디바이스 인터페이스 클래스에 대한 자세한 내용은 디바이스 인터페이스 소개를 참조하세요.

디바이스 인터페이스 등록

디바이스 인터페이스 클래스의 instance 등록하기 위해 UMDF 기반 드라이버는 IDriverEntry::OnDeviceAdd 콜백 함수 내에서 IWDFDevice::CreateDeviceInterface를 호출할 수 있습니다. 드라이버가 인터페이스의 여러 인스턴스를 지원하는 경우 각 instance 고유한 참조 문자열을 할당할 수 있습니다.

디바이스 인터페이스 사용 및 사용 안 함

만들기에 성공하면 프레임워크는 디바이스의 PnP 상태에 따라 인터페이스를 자동으로 사용하도록 설정하고 사용하지 않도록 설정합니다.

또한 드라이버는 필요에 따라 디바이스 인터페이스를 사용하지 않도록 설정하고 다시 사용하도록 설정할 수 있습니다. 예를 들어 드라이버가 디바이스의 응답을 중지했다고 판단하는 경우 드라이버는 IWDFDevice::AssignDeviceInterfaceState 를 호출하여 디바이스의 인터페이스를 사용하지 않도록 설정하고 애플리케이션이 인터페이스에 대한 새 핸들을 가져오는 것을 금지할 수 있습니다. (인터페이스에 대한 기존 핸들은 영향을 받지 않습니다.) 나중에 디바이스를 사용할 수 있게 되면 드라이버는 IWDFDevice::AssignDeviceInterfaceState 를 다시 호출하여 인터페이스를 다시 사용하도록 설정할 수 있습니다.

디바이스 인터페이스에 액세스하기 위한 요청 수신

애플리케이션이 드라이버의 디바이스 인터페이스에 대한 액세스를 요청하면 프레임워크는 드라이버의 IQueueCallbackCreate::OnCreateFile 콜백 함수를 호출합니다. 드라이버는 IWDFFile::RetrieveFileName 을 호출하여 애플리케이션이 액세스하는 디바이스 또는 파일의 이름을 가져올 수 있습니다. 드라이버가 디바이스 인터페이스를 등록할 때 참조 문자열을 지정한 경우 운영 체제에는 IWDFFile::RetrieveFileName 이 반환하는 파일 또는 디바이스 이름에 참조 문자열이 포함됩니다.

디바이스 이벤트 만들기

UMDF 기반 드라이버는 IWDFDevice::P ostEvent를 호출하여 디바이스별 사용자 지정 이벤트(디바이스 이벤트라고 함)를 만들 수 있습니다. 디바이스의 인터페이스를 사용하도록 등록된 드라이버는 디바이스의 사용자 지정 이벤트에 대한 알림을 받을 수 있습니다. UMDF 기반 드라이버는 IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent 콜백 함수를 제공하여 이러한 알림을 받습니다.

사용자 지정 이벤트는 디바이스에 고유합니다. 이벤트를 만드는 드라이버의 개발자와 이벤트를 수신하는 드라이버의 개발자는 모두 이벤트의 의미를 이해해야 합니다.

다른 드라이버의 디바이스 인터페이스에 액세스

UMDF 기반 드라이버가 다른 드라이버가 제공하는 디바이스 인터페이스에 I/O 요청을 보내도록 하려면 디바이스 인터페이스를 나타내는 원격 I/O 대상 을 만들 수 있습니다.

먼저 디바이스 인터페이스를 사용할 수 있을 때 알림을 받으려면 드라이버를 등록해야 합니다. 다음 단계를 사용합니다.

  1. 드라이버가 IWDFDriver::CreateDevice를 호출하면 드라이버는 IPnpCallbackRemoteInterfaceNotification 인터페이스를 제공할 수 있습니다. 이 인터페이스의 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 콜백 함수는 디바이스 인터페이스를 사용할 수 있을 때 드라이버를 알려줍니다.

  2. 드라이버가 IWDFDriver::CreateDevice를 호출한 후 드라이버에서 사용할 각 디바이스 인터페이스에 대해 IWDFDevice2::RegisterRemoteInterfaceNotification 을 호출할 수 있습니다.

그런 다음 프레임워크는 지정된 디바이스 인터페이스를 사용할 수 있게 될 때마다 드라이버의 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 콜백 함수를 호출합니다. 콜백 함수는 IWDFRemoteInterfaceInitialize::GetInterfaceGuidIWDFRemoteInterfaceInitialize::RetrieveSymbolicLink 를 호출하여 도착한 디바이스 인터페이스를 확인할 수 있습니다.

드라이버의 IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 콜백 함수는 일반적으로 다음을 수행해야 합니다.

  1. IWDFDevice2::CreateRemoteInterface를 호출하여 원격 인터페이스 개체를 만들고 필요에 따라 IRemoteInterfaceCallbackEventIRemoteInterfaceCallbackRemoval 인터페이스를 제공합니다.

  2. IWDFDevice2::CreateRemoteTarget을 호출하여 원격 대상 개체를 만들고 필요에 따라 IRemoteTargetCallbackRemoval 인터페이스를 제공합니다.

  3. IWDFRemoteTarget::OpenRemoteInterface를 호출하여 디바이스 인터페이스를 원격 대상에 연결합니다.

    디바이스 인터페이스가 SWENUM 소프트웨어 디바이스 열거자가 만든 인터페이스인 경우 드라이버는 작업 항목에서 OpenRemoteInterface 를 호출해야 합니다. 예를 들어 Windows SDK의 QueueUserWorkItem 함수를 참조하세요.

이제 드라이버는 I/O 요청의 형식을 지정하고 원격 I/O 대상에 보낼 수 있습니다.

IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival 콜백 함수 외에도 UMDF 기반 드라이버는 디바이스 인터페이스 이벤트에 대한 알림을 수신하는 두 개의 추가 콜백 함수를 제공할 수 있습니다.