Share via


디바이스 인터페이스 도착 및 디바이스 제거 알림 등록

이 항목에서는 사용자 모드 애플리케이션 또는 드라이버가 디바이스 인터페이스 도착 및 디바이스 제거 알림을 등록하는 방법을 설명합니다.

일반적으로 사용자 모드 구성 요소는 CM_Register_Notification 호출하여 디바이스 인터페이스를 찾은 다음 인터페이스에 I/O 요청을 보냅니다. 이렇게 하려면 구성 요소는 디바이스 인터페이스 도착 및 디바이스 제거 알림을 위해 CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACECM_NOTIFY_FILTER_TYPE_DEVICEHANDLE 모두 등록합니다. 호출 시퀀스는 다음과 같습니다.

디바이스 인터페이스 도착 및 디바이스 제거 알림 등록

  1. CM_NOTIFY_FILTER_TYPE_DEVICEINTERFACE 사용하여 CM_Register_Notification 호출하여 디바이스 인터페이스 도착 알림에 등록합니다. 지정된 클래스의 이후 인터페이스가 도착하면 시스템에서 구성 요소에 알 수 있습니다.

  2. I/O를 보내려는 인터페이스가 시스템에 이미 있을 수 있으므로 CM_Get_Device_Interface_List 또는 SetupDiGetClassDevs 를 호출하여 기존 인터페이스 목록을 검색합니다. 참고 1단계와 2단계 사이에 인터페이스가 도착하면 1단계의 등록과 2단계의 인터페이스 목록에서 인터페이스가 두 번 나열됩니다.

  3. 원하는 인터페이스를 찾으면 CreateFile 을 호출하여 디바이스에 대한 핸들을 엽니다.

  4. 3단계에서 디바이스 핸들을 성공적으로 만든 후 CM_Register_Notification 두 번째로 호출합니다. 이번에는 CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE 형식의 알림을 등록하고 알림을 받을 핸들로 새 디바이스 핸들을 제공합니다. 인터페이스로 표시되는 디바이스가 쿼리 제거 요청을 받으면 시스템에서 구성 요소에 알 수 있습니다.

  5. 디바이스 핸들 알림 콜백을 구현할 때 이 테이블을 사용합니다.

    콜백이 받는 작업 값 구성 요소에서 수행해야 하는 사항
    CM_NOTIFY_ACTION_DEVICEQUERYREMOVE

    CloseHandle을 호출하여 디바이스 핸들을 닫습니다. 이렇게 하지 않으면 열려 있는 핸들을 사용하면 이 디바이스의 쿼리 제거가 성공하지 못하게 됩니다.

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED

    쿼리 제거에 실패하여 디바이스와 해당 인터페이스가 여전히 유효합니다. 인터페이스에 I/O를 계속 보내려면 해당 인터페이스에 대한 새 핸들을 엽니다.

    먼저 CM_Unregister_Notification 호출하여 이전 핸들에 대한 알림을 등록 취소합니다. 등록 취소 중인 알림 핸들에 대한 알림 콜백에서 CM_Unregister_Notification 호출할 수 없으므로 지연된 루틴에서 이 작업을 수행해야 합니다. 자세한 내용은 CM_Unregister_Notification설명 섹션을 참조하세요.

    그런 다음 지연된 루틴에서 계속하거나 알림 콜백으로 돌아가 서 CreateFile 을 호출하여 새 핸들을 만듭니다. 그런 다음 새 핸들을 사용하여 CM_Register_Notification 호출하고 CM_NOTIFY_FILTER_TYPE_DEVICEHANDLE.

    CM_NOTIFY_ACTION_DEVICEQUERYREMOVE 알림이 전송된 후 쿼리가 제거되는 중인 디바이스에서 알림을 등록하는 경우 CM_NOTIFY_ACTION_DEVICEQUERYREMOVE 알림을 먼저 받지 않고도 CM_NOTIFY_ACTION_DEVICEQUERYREMOVEFAILED 알림을 받을 수 있습니다.

    CM_NOTIFY_ACTION_DEVICEREMOVEPENDING

    CM_Unregister_Notification 호출하여 핸들에 대한 알림을 등록 취소합니다. 지연된 루틴에서 이 작업을 수행해야 합니다. 자세한 내용은 CM_Unregister_Notification설명 섹션을 참조하세요. 여전히 디바이스에 대한 열린 핸들이 있는 경우 CloseHandle 을 호출하여 디바이스 핸들을 닫습니다.

    CM_NOTIFY_ACTION_DEVICEREMOVECOMPLETE

    CM_Unregister_Notification 호출하여 핸들에 대한 알림을 등록 취소합니다. 지연된 루틴에서 이 작업을 수행해야 합니다. 자세한 내용은 CM_Unregister_Notification설명 섹션을 참조하세요. 여전히 디바이스에 대한 열린 핸들이 있는 경우 CloseHandle 을 호출하여 디바이스 핸들을 닫습니다.

  6. 디바이스가 완료되면 CM_Unregister_Notification 호출하여 1단계에서 등록한 인터페이스 알림 콜백의 등록을 취소합니다.

UMDF 2 드라이버에서 이 절차를 따르는 경우 코드 예제에 디바이스 인터페이스 사용을 참조하세요. UMDF 2 드라이버는 드라이버의 EvtDevicePrepareHardware 콜백 루틴에서 1-4단계를 수행하고 드라이버의 디바이스 제거 콜백 루틴 중 하나에서 6단계를 수행할 수 있습니다.

CM_Register_Notification

CM_Unregister_Notification

디바이스 인터페이스 사용