IRP_MN_CANCEL_STOP_DEVICE 요청 처리(Windows 2000 이상)
IRP_MN_CANCEL_STOP_DEVICE 요청은 먼저 디바이스에 대한 부모 버스 드라이버가 처리한 다음 디바이스 스택의 각 상위 드라이버에 의해 처리되어야 합니다. 드라이버는 DispatchPnP 루틴에서 중지 IRP를 처리합니다.
IRP_MN_CANCEL_STOP_DEVICE 요청에 대한 응답으로 드라이버는 디바이스를 시작 상태로 되돌리고 정상 작업을 다시 시작해야 합니다. 드라이버는 취소 중지 IRP에 성공해야 합니다.
드라이버는 다음과 같은 프로시저를 사용하여 IRP_MN_CANCEL_STOP_DEVICE 요청을 처리합니다.
낮은 드라이버가 다시 시작 작업을 완료할 때까지 디바이스 다시 시작을 연기합니다. ( 낮은 드라이버가 완료될 때까지 PnP IRP 처리 연기를 참조하세요.)
낮은 드라이버가 완료된 후 디바이스를 시작 상태로 반환합니다.
정확한 작업은 디바이스와 드라이버에 따라 달라집니다.
IRP 보유 큐에서 IRP를 시작합니다.
디바이스가 중지 보류 중 상태인 동안 드라이버가 요청을 보유하고 있는 경우 HOLD_NEW_REQUESTS 플래그를 지우고 IRP 보유 큐에서 IRP를 시작합니다. 자세한 내용은 디바이스가 일시 중지된 경우 들어오는 IRP 보유 를 참조하세요.
IoCompleteRequest를 사용하여 IRP를 완료합니다.
함수 또는 필터 드라이버에서:
드라이버의 IoCompletion 루틴은 낮은 드라이버가 완료될 때까지 PnP IRP 처리 연기에 설명된 대로 STATUS_MORE_PROCESSING_REQUIRED 반환하므로 드라이버의 DispatchPnP 루틴은 I/O 완료 처리를 다시 시작하려면 IoCompleteRequest 를 호출해야 합니다.
드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 설정하고, 우선 순위가 IO_NO_INCREMENT IoCompleteRequest를 호출하고, DispatchPnP 루틴에서 STATUS_SUCCESS 반환합니다.
드라이버는 이 작업에 실패하지 않아야 합니다. 드라이버가 IRP 다시 시작에 실패하면 디바이스가 일관되지 않은 상태이며 제대로 작동하지 않습니다.
부모 버스 드라이버에서:
드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 설정하고 IO_NO_INCREMENT 우선 순위 향상을 지정하는 IoCompleteRequest를 호출합니다. 버스 드라이버는 DispatchPnP 루틴에서 STATUS_SUCCESS 반환합니다.
버스 드라이버는 이 작업에 실패하지 않아야 합니다. 드라이버가 IRP 다시 시작에 실패하면 디바이스가 일관되지 않은 상태이며 제대로 작동하지 않습니다.
디바이스가 시작되고 활성 상태일 때 드라이버는 가짜 취소 중지 요청을 받을 수 있습니다. 예를 들어 드라이버(또는 디바이스 스택에서 더 높은 드라이버)가 IRP_MN_QUERY_STOP_DEVICE 요청에 실패한 경우 이 문제가 발생할 수 있습니다. 디바이스가 시작되고 활성 상태이면 드라이버는 디바이스에 대한 가짜 취소 중지 요청을 안전하게 성공할 수 있습니다.