다음을 통해 공유


IRP_MN_STOP_DEVICE 요청 처리(Windows 2000 이상)

IRP_MN_STOP_DEVICE 요청은 먼저 디바이스 스택의 상위 드라이버에 의해 처리된 다음 각 하위 드라이버에 의해 처리됩니다. 드라이버는 DispatchPnP 루틴에서 중지 IRP를 처리합니다.

드라이버는 다음과 같은 프로시저를 사용하여 IRP_MN_STOP_DEVICE 요청을 처리합니다.

  1. 디바이스가 일시 중지되었는지 확인합니다.

    드라이버가 IRP_MN_QUERY_STOP_DEVICE 요청에 대한 응답으로 디바이스를 완전히 일시 중지하지 않은 경우 지금 일시 중지해야 합니다. 디바이스 확장에서 HOLD_NEW_REQUESTS 플래그를 설정하고 디바이스를 일시 중지하는 데 필요한 다른 작업을 수행합니다.

    리소스 리밸런스 작업 중에 디바이스의 전원이 손실되어 디바이스 상태가 손실될 수 있습니다. 디바이스의 드라이버는 디바이스 상태 정보를 저장하고 후속 IRP_MN_START_DEVICE 요청을 받으면 복원해야 합니다.

  2. 디바이스에 대한 하드웨어 리소스를 해제합니다.

    함수 드라이버에서 정확한 작업은 디바이스와 드라이버에 따라 달라지지만 IoDisconnectInterrupt로 인터럽트 연결 끊기, MmUnmapIoSpace를 사용하여 물리적 주소 범위 해제 및 I/O 포트 해제를 포함할 수 있습니다.

    필터 또는 버스 드라이버가 디바이스에 대한 하드웨어 리소스를 획득한 경우 해당 드라이버는 IRP_MN_STOP_DEVICE 요청에 대한 응답으로 리소스를 해제해야 합니다.

  3. Irp-IoStatus.Status>를 STATUS_SUCCESS 설정합니다.

  4. IRP를 다음 하위 드라이버에 전달하거나 IRP를 완료합니다.

    • 함수 또는 필터 드라이버에서 IoSkipCurrentIrpStackLocation을 사용하여 다음 스택 위치를 설정하고, IRP를 IoCallDriver를 사용하여 다음 하위 드라이버에 전달하고, DispatchPnP 루틴에서 반환 상태 IoCallDriver의 상태 반환합니다. IRP를 완료하지 마세요.

    • 버스 드라이버에서 IO_NO_INCREMENT IoCompleteRequest 를 사용하여 IRP를 완료하고 DispatchPnP 루틴에서 반환합니다.

디바이스가 리소스의 균형을 다시 조정하기 위해 중지되는 동안 드라이버는 디바이스에 액세스하는 IRP를 시작할 수 없습니다. 드라이버는 디바이스가 일시 중지된 경우 들어오는 IRP 보유에 설명된 대로 이러한 IRP를 큐에 대기하거나 드라이버가 IRP 보유 큐를 구현하지 않고 I/O 요청을 삭제하지 않아야 하는 경우 실패해야 합니다.