다음을 통해 공유


IRP 제거가 발급되는 시기 이해

다음 그림에서는 디바이스에 대한 드라이버를 제거하는 데 관련된 일반적인 IRP 시퀀스를 보여 있습니다.

일반적인 irp 제거 전환을 보여 주는 다이어그램

다음 노트는 이전 그림의 원을 그리는 숫자에 해당합니다.

  1. 쿼리 제거

    PnP 관리자는 IRP_MN_QUERY_REMOVE_DEVICE 실행하여 컴퓨터를 중단하지 않고 디바이스를 제거할 수 있는지 여부를 묻습니다. 또한 사용자가 디바이스에 대한 드라이버를 업데이트하도록 요청하고(Windows 2000 이상에서) 장치 관리자 디바이스를 사용하지 않도록 설정할 때 이 IRP를 보냅니다. (Windows 98/Me에서 PnP 관리자는 이 상황에서 중지 IRP를 보냅니다. 자세한 내용은 디바이스 중지를 참조하세요.)

    디바이스 스택의 모든 드라이버가 STATUS_SUCCESS 반환하는 경우 드라이버는 디바이스를 제거 보류 중 상태로 전환했습니다. 이 상태에서 드라이버는 디바이스가 제거되지 않도록 하는 작업을 시작해서는 안 됩니다.

    이 "클린" 제거 사례에서 PnP 관리자는 제거 IRP를 보내기 전에 쿼리 제거 IRP를 보냅니다. "서프라이즈" 제거에 대한 설명은 5단계를 참조하세요.

    위의 다이어그램에는 표시되지 않지만 버스 드라이버는 시작되지 않은 디바이스에 대한 IRP_MN_QUERY_REMOVE_DEVICE 받을 수 있습니다. 이는 사용자가 컴퓨터에 물리적으로 존재하지만 사용하지 않도록 설정된 디바이스를 동적으로 제거하도록 요청하는 경우에 발생할 수 있습니다.

  2. 쿼리가 성공한 후 제거

    PnP 관리자는 디바이스에 대한 드라이버를 제거하는 IRP_MN_REMOVE_DEVICE 발급합니다.

    드라이버는 이 요청을 성공해야 합니다. 디바이스용 드라이버는 필요한 클린 수행하고, 디바이스 스택에서 분리하고, FDO 및 필터 DO를 삭제합니다. 부모 버스 드라이버는 사용자가 컴퓨터에서 디바이스를 물리적으로 제거할 때까지 PDO를 유지합니다.

    드라이버는 IRP를 제거하기 전에 IRP_MN_STOP_DEVICE 받을 수 있지만 필수는 아닙니다. Windows 2000 이상에서는 IRP_MN_STOP_DEVICE 리소스 재조정을 위해 디바이스를 일시 중지하는 데만 사용됩니다. 그것은 제거를 향한 단계가 아닙니다. 디바이스가 중지되는 동안 사용자가 디바이스 하드웨어를 제거하는 경우 PnP 관리자는 IRP 중지 후 특정 시점에 제거 IRP를 보내지만 중지는 제거를 위한 필수 구성 요소가 아닙니다.

  3. 디바이스 다시 열거

    드라이버가 디바이스 개체를 삭제한 후 디바이스가 다시 활성화되면 PnP 관리자는 드라이버의 AddDevice 루틴을 호출하고 IRP_MN_START_DEVICE 발급하여 디바이스를 복구합니다. ( PnP 큐브 뷰 그림의 디바이스 상태 도 참조하세요.)

  4. 쿼리 제거 취소

    PnP 관리자는 쿼리 제거 요청을 취소하는 IRP_MN_CANCEL_REMOVE_DEVICE 발급합니다.

    IRP_MN_CANCEL_REMOVE_DEVICE 대한 응답으로 드라이버는 디바이스를 시작 상태로 반환합니다.

  5. 서프라이즈 제거(Windows 2000 이상 버전의 Windows)

    Windows 2000 이상 시스템에서 사용자가 플러그 뽑기 또는 하드웨어 꺼내기 프로그램을 사용하지 않고 컴퓨터에서 디바이스를 분리하는 경우 PnP 관리자는 IRP_MN_SURPRISE_REMOVAL IRP를 보냅니다.

    이 경우 드라이버가 사전 경고를 받지 않으므로 "서프라이즈" 제거라고 합니다.

    IRP_MN_SURPRISE_REMOVAL IRP에 대한 응답으로 디바이스의 드라이버는 미해결 I/O에 실패하고 디바이스에서 사용하는 하드웨어 리소스를 해제합니다. 드라이버는 더 이상 존재하지 않으므로 어떤 구성 요소도 디바이스에 액세스하려고 시도하지 않도록 해야 합니다.

    모든 드라이버는 IRP_MN_SURPRISE_REMOVAL IRP를 처리해야 하며 상태 STATUS_SUCCESS 설정해야 합니다.

    IRP_MN_SURPRISE_REMOVAL 취소할 수 없습니다.

  6. 깜짝 제거 후 제거(Windows 2000 이상 버전의 Windows)

    디바이스에 열려 있는 모든 핸들이 닫혀 있으면 PnP 관리자는 디바이스의 드라이버에 IRP_MN_REMOVE_DEVICE 요청을 보냅니다. 각 드라이버는 디바이스 스택에서 분리되고 해당 디바이스 개체를 삭제합니다.

  7. 서프라이즈 제거(Windows 98/Me)

    Windows 98/Me에서는 경고 없이 디바이스를 제거할 때 드라이버가 IRP_MN_SURPRISE_REMOVAL 받지 않습니다. PnP 관리자는 IRP_MN_REMOVE_DEVICE 보냅니다. WDM 드라이버에는 IRP_MN_SURPRISE_REMOVAL 뒤에 IRP_MN_REMOVE_DEVICE (깜짝 제거를 위한 Windows 2000 이상 동작) 및 사전 서프라이즈 제거 IRP(Windows 98/Me 동작)가 없는 IRP_MN_REMOVE_DEVICE 모두 처리하는 코드가 있어야 합니다.

  8. 시작에 실패한 후 제거(Windows 2000 이상)

    디바이스에 대한 드라이버 중 하나가 IRP_MN_START_DEVICE 실패하면 PnP 관리자는 디바이스 스택에 IRP_MN_REMOVE_DEVICE 요청을 보냅니다. 이러한 제거 IRP는 디바이스의 모든 드라이버가 디바이스가 성공적으로 시작되지 않았다는 알림을 받도록 합니다. IRP_MN_REMOVE_DEVICE IRP에 대한 응답으로 디바이스의 드라이버는 시작 작업을 실행 취소하고(IRP 시작에 성공한 경우) AddDevice 작업을 실행 취소합니다. PnP 관리자는 이러한 디바이스를 "시작 실패"로 표시합니다.

    이 동작은 Windows 2000 이상 플랫폼에만 적용됩니다. Windows 98/Me에서 PnP 관리자는 실패한 시작에 대한 응답으로 IRP_MN_STOP_DEVICE 보냅니다.

PnP 디바이스용 드라이버는 일반적인 IRP 전환 제거 그림에 표시된 것보다 더 많은 상황에서 IRP_MN_SURPRISE_REMOVAL 받을 수 있습니다. 예를 들어 사용자는 PC 카드를 컴퓨터에 삽입한 다음 디바이스가 시작되기 전에 제거할 수 있습니다. 이 경우 PnP 관리자는 드라이버의 AddDevice 루틴이 호출된 후 IRP_MN_START_DEVICE 요청을 실행하기 전에 서프라이즈 제거 IRP를 발급합니다. PnP 디바이스용 드라이버는 드라이버의 AddDevice 루틴이 호출된 후 언제든지 제거 IRP를 처리할 수 있도록 준비해야 합니다.