다음을 통해 공유


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를 처리하도록 준비해야 합니다.