IRP_MN_STOP_DEVICE 요청 처리(Windows 2000 이상)
IRP_MN_STOP_DEVICE 요청은 먼저 디바이스 스택의 상위 드라이버에 의해 처리된 다음 각 하위 드라이버에 의해 처리됩니다. 드라이버는 DispatchPnP 루틴에서 중지 IRP를 처리합니다.
드라이버는 다음과 같은 프로시저를 사용하여 IRP_MN_STOP_DEVICE 요청을 처리합니다.
디바이스가 일시 중지되었는지 확인합니다.
드라이버가 IRP_MN_QUERY_STOP_DEVICE 요청에 대한 응답으로 디바이스를 완전히 일시 중지하지 않은 경우 지금 이 작업을 수행해야 합니다. 디바이스 확장에서 HOLD_NEW_REQUESTS 플래그를 설정하고 디바이스를 일시 중지하는 데 필요한 다른 작업을 수행합니다.
리소스 재균형 작업 중에 디바이스의 전원이 손실되어 디바이스 상태가 손실될 수 있습니다. 디바이스의 드라이버는 디바이스 상태 정보를 저장하고 후속 IRP_MN_START_DEVICE 요청을 받으면 복원해야 합니다.
디바이스에 대한 하드웨어 리소스를 해제합니다.
함수 드라이버에서 정확한 작업은 디바이스와 드라이버에 따라 달라지지만 IoDisconnectInterrupt로 인터럽트 연결 끊기, MmUnmapIoSpace를 사용하여 물리적 주소 범위 해제 및 I/O 포트 해제를 포함할 수 있습니다.
필터 또는 버스 드라이버가 디바이스에 대한 하드웨어 리소스를 구입한 경우 해당 드라이버는 IRP_MN_STOP_DEVICE 요청에 대한 응답으로 리소스를 해제해야 합니다.
Irp-IoStatus.Status>를 STATUS_SUCCESS 설정합니다.
IRP를 다음 하위 드라이버에 전달하거나 IRP를 완료합니다.
함수 또는 필터 드라이버에서 IoSkipCurrentIrpStackLocation을 사용하여 다음 스택 위치를 설정하고, IoCallDriver를 사용하여 다음 하위 드라이버에 IRP를 전달하고, IoCallDriver 의 상태를 DispatchPnP 루틴의 반환 상태로 반환합니다. IRP를 완료하지 마세요.
버스 드라이버에서 IO_NO_INCREMENT IoCompleteRequest 를 사용하여 IRP를 완료하고 DispatchPnP 루틴에서 반환합니다.
디바이스가 리소스의 균형을 다시 조정하기 위해 중지되는 동안 드라이버는 디바이스에 액세스하는 IRP를 시작할 수 없습니다. 디바이스가 일시 중지된 경우 들어오는 IRP 보유에 설명된 대로 드라이버는 이러한 IRP를 큐에 대기해야 합니다. 또는 드라이버가 IRP 보유 큐를 구현하지 않고 I/O 요청을 삭제하지 않아야 하는 경우 실패해야 합니다.