디바이스를 중지하여 리소스 균형 조정

다음 그림에서는 리소스의 균형을 조정하기 위해 디바이스를 중지하고 다시 시작하는 데 관련된 IRP의 시퀀스를 보여 줍니다.

리소스의 균형을 조정하기 위해 디바이스를 중지하는 방법을 보여 주는 다이어그램

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

  1. PnP 관리자는 IRP_MN_QUERY_STOP_DEVICE 발급하여 디바이스용 드라이버가 디바이스를 중지하고 하드웨어 리소스를 해제할 수 있는지 여부를 묻습니다.

    디바이스 스택의 모든 드라이버가 STATUS_SUCCESS 반환하는 경우 드라이버는 디바이스를 신속하게 중지할 수 있는 상태(중지 보류 중)로 전환했습니다.

    디바이스 스택이 STATUS_SUCCESS 이외의 항목을 반환하는 경우 리밸런스 프로세스에 참여하지 않습니다. 리소스 리밸런싱이 최선의 작업이므로 이 경우 시스템은 여전히 시스템 내 디바이스의 리소스 요구 사항을 충족하기 위해 리밸런스 작업을 시도합니다. 그러나 디바이스가 쿼리 중지에 실패하면 원하는 결과를 얻을 수 없을 수 있습니다(예: 새 디바이스가 열거되고 리밸런스를 트리거하는 경우 필요한 리소스를 받지 못하여 결국 시작에 실패).

    쿼리 중지 작업에 실패한 디바이스는 쿼리 중지가 실패하더라도 계속 작동 상태입니다.

    PnP 관리자는 필요한 리소스의 균형을 조정하기 위해 필요한 만큼의 디바이스 스택을 쿼리합니다.

  2. PnP 관리자는 디바이스를 중지하는 IRP_MN_STOP_DEVICE 발급합니다.

    Windows 2000 이상 버전의 Windows에서 PnP 관리자는 디바이스에 대한 이전 쿼리 중지 IRP가 성공적으로 완료된 경우에만 중지 IRP를 보냅니다. IRP 중지에 대한 응답으로 드라이버는 디바이스의 하드웨어 리소스(예: I/O 포트)를 해제하고 디바이스에 액세스해야 하는 모든 IRP를 보유합니다.

  3. 리소스를 성공적으로 리밸런싱한 후 PnP 관리자는 리밸런스 중에 중지된 모든 디바이스를 다시 시작하라는 IRP_MN_START_DEVICE 요청을 실행합니다.

  4. 그렇지 않으면 PnP 관리자는 IRP_MN_CANCEL_STOP_DEVICE 전송하여 쿼리 중지 IRP를 취소합니다.

    IRP_MN_CANCEL_STOP_DEVICE 대한 응답으로 디바이스의 드라이버는 디바이스를 시작 상태로 반환하고 디바이스에 대한 I/O 요청 처리를 다시 시작합니다.

    PnP 관리자는 스택의 한 드라이버가 요청에 실패하거나 전체 리밸런스 작업이 실패하고 모든 쿼리 중지 요청을 취소하는 경우 디바이스 스택에 대한 쿼리 중지를 취소합니다. PnP 관리자는 하나의 디바이스 스택에서만 쿼리 중지를 취소하면 쿼리에 실패한 드라이버 위에 연결된 드라이버가 디바이스가 중지 보류 중 상태이므로 IRP_MN_CANCEL_STOP_DEVICE 요청을 보냅니 다. IRP_MN_CANCEL_STOP_DEVICE 성공하면 드라이버가 디바이스를 시작 상태로 반환합니다.

  5. 리소스를 리밸런싱한 후 드라이버가 디바이스를 다시 시작하지 못하면 PnP 관리자는 디바이스 스택(Windows 2000 이상 버전의 Windows)에 제거 IRP를 보냅니다.

    PnP 관리자는 먼저 IRP_MN_SURPRISE_REMOVAL 요청을 보냅니다. 그런 다음 IRP_MN_REMOVE_DEVICE 요청을 보내지만 열려 있는 모든 핸들이 디바이스에 닫힌 후에만 전송됩니다.

PnP 디바이스의 하드웨어 리소스를 리밸런싱하는 작업은 애플리케이션 및 최종 사용자에게 투명해야 합니다. 사용자에게 일시적인 작업 지연이 발생할 수 있지만 데이터를 손실해서는 안 됩니다. 중지 IRP를 처리할 때 이를 고려해야 합니다.