Conservation des IRP entrants lorsqu’un appareil est suspendu
Les pilotes d’un appareil doivent suspendre l’appareil lorsque ses ressources sont rééquilibrées. Pendant le rééquilibrage des ressources, certains pilotes interrompent l’appareil en réponse à une demande de IRP_MN_QUERY_STOP_DEVICE et d’autres pilotes retardent la suspension de l’appareil jusqu’à ce qu’ils reçoivent la demande IRP_MN_STOP_DEVICE . Dans les deux cas, l’appareil doit être suspendu lorsque l’IRP_MN_STOP_DEVICE réussit.
Les pilotes doivent terminer tous les IIP en cours sur l’appareil et s’abstenir de démarrer les nouveaux IIP qui nécessitent l’accès à l’appareil.
Pour conserver les IRPs pendant qu’un appareil est suspendu, un pilote implémente une procédure telle que la suivante :
Dans sa routine AddDevice , définissez un indicateur dans l’extension de l’appareil avec un nom comme HOLD_NEW_REQUESTS. Effacez l’indicateur.
Créez une file d’attente FIFO pour la conservation des IRPs.
Si le pilote met déjà en file d’attente les IRPs, il peut réutiliser la même file d’attente, car le pilote doit terminer toutes les demandes en attente avant de suspendre l’appareil.
Si le pilote n’a pas encore de file d’attente IRP, il doit en créer une dans sa routine AddDevice . Le type de file d’attente qu’il crée dépend de la façon dont le pilote vide la file d’attente. Un pilote peut utiliser une liste doublement liée et verrouillée et les routines ExInterlockedXxxList .
Dans son code DispatchPnP pour IRP_MN_QUERY_STOP_DEVICE (ou IRP_MN_STOP_DEVICE), terminez toutes les demandes en attente et définissez l’indicateur HOLD_NEW_REQUESTS.
Dans une routine de répartition qui accède à l’appareil, telle que DispatchWrite ou DispatchRead, case activée si l’indicateur HOLD_NEW_REQUESTS est défini. Si c’est le cas, le pilote doit marquer l’IRP en attente et le mettre en file d’attente.
La routine DispatchPnP du pilote doit continuer à traiter les IRP PnP au lieu de les contenir et la routine DispatchPower doit continuer à traiter les IRP d’alimentation.
Dans DispatchPnP, en réponse à une IRP de démarrage ou d’annulation-arrêt, effacez l’indicateur HOLD_NEW_REQUESTS et démarrez les IRP dans la file d’attente qui contient des IRP.
Ces actions sont probablement les dernières étapes de traitement de ces IRP PnP. Par exemple, en réponse à un IRP de démarrage, le pilote doit d’abord effectuer toutes les opérations pour démarrer l’appareil, puis il peut démarrer les irPs dans la file d’attente IRP.
Les erreurs de traitement des IRP à partir de la file d’attente de conservation IRP n’affectent pas les status retournées pour les IRPs de démarrage ou d’annulation-arrêt.