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을 사용하여 다음 스택 위치를 설정하고, IRP를 IoCallDriver를 사용하여 다음 하위 드라이버에 전달하고, DispatchPnP 루틴에서 반환 상태 IoCallDriver의 상태 반환합니다. IRP를 완료하지 마세요.
버스 드라이버에서 IO_NO_INCREMENT IoCompleteRequest 를 사용하여 IRP를 완료하고 DispatchPnP 루틴에서 반환합니다.
디바이스가 리소스의 균형을 다시 조정하기 위해 중지되는 동안 드라이버는 디바이스에 액세스하는 IRP를 시작할 수 없습니다. 드라이버는 디바이스가 일시 중지된 경우 들어오는 IRP 보유에 설명된 대로 이러한 IRP를 큐에 대기하거나 드라이버가 IRP 보유 큐를 구현하지 않고 I/O 요청을 삭제하지 않아야 하는 경우 실패해야 합니다.