디바이스가 일시 중지된 경우 들어오는 IRP 보유
디바이스의 드라이버는 리소스가 재조정될 때 디바이스를 일시 중지해야 합니다. 리소스 리밸런싱 중에 일부 드라이버는 IRP_MN_QUERY_STOP_DEVICE 요청에 대한 응답으로 디바이스를 일시 중지하고 다른 드라이버는 IRP_MN_STOP_DEVICE 요청을 받을 때까지 디바이스 일시 중지를 지연합니다. 두 경우 모두 IRP_MN_STOP_DEVICE 성공하면 디바이스를 일시 중지해야 합니다.
드라이버는 디바이스에서 진행 중인 모든 IRP를 완료하고 디바이스에 액세스해야 하는 새 IRP를 시작하지 않도록 해야 합니다.
디바이스가 일시 중지되는 동안 IRP를 보유하기 위해 드라이버는 다음과 같은 절차를 구현합니다.
AddDevice 루틴에서 HOLD_NEW_REQUESTS 같은 이름으로 디바이스 확장에 플래그를 정의합니다. 플래그를 지웁다.
IRP를 보유하기 위한 FIFO 큐를 만듭니다.
드라이버가 이미 IRP를 큐에 대기하는 경우 디바이스를 일시 중지하기 전에 드라이버가 미해결 요청을 완료해야 하므로 동일한 큐를 다시 사용할 수 있습니다.
드라이버에 IRP 큐가 아직 없는 경우 AddDevice 루틴에서 만들어야 합니다. 만드는 큐의 종류는 드라이버가 큐를 플러시하는 방법에 따라 달라집니다. 드라이버는 이중으로 연결된 상호 연결된 목록과 ExInterlockedXxx목록 루틴을 사용할 수 있습니다.
IRP_MN_QUERY_STOP_DEVICE(또는 IRP_MN_STOP_DEVICE)에 대한 DispatchPnP 코드에서 미해결 요청을 완료하고 HOLD_NEW_REQUESTS 플래그를 설정합니다.
DispatchWrite 또는 DispatchRead와 같이 디바이스에 액세스하는 디스패치 루틴에서 HOLD_NEW_REQUESTS 플래그가 설정되었는지 여부를 검사. 이 경우 드라이버는 보류 중인 IRP를 표시하고 큐에 추가해야 합니다.
드라이버의 DispatchPnP 루틴은 PnP IRP를 보관하지 않고 계속 처리해야 하며 DispatchPower 루틴은 전원 IRP를 계속 처리해야 합니다.
DispatchPnP에서 시작 또는 취소 중지 IRP에 대한 응답으로 HOLD_NEW_REQUESTS 플래그를 지우고 IRP 보유 큐에서 IRP를 시작합니다.
이러한 작업은 아마도 이러한 PnP IRP를 처리하기 위한 마지막 단계일 것입니다. 예를 들어 시작 IRP에 대한 응답으로 드라이버는 먼저 모든 작업을 수행하여 디바이스를 시작한 다음 IRP 보유 큐에서 IRP를 시작할 수 있습니다.
IRP 보유 큐에서 IRP를 처리하는 오류는 시작 또는 취소 중지 IRP에 대해 반환된 상태 영향을 미치지 않습니다.