Partager via


Gestion des opérations d’E/S qui se chevauchent

La routine DpcForIsr ou CustomDpc d’un pilote qui chevauche des opérations sur son appareil ne peut pas s’appuyer sur une correspondance un-à-un entre les demandes entrées dans la routine StartIo et les appels de l’ISR à IoRequestDpc ou KeInsertQueueDpc. Le DpcForIsr ou CustomDpc d’un tel pilote ne peut pas nécessairement utiliser les pointeurs d’entrée vers le contexte IRP et fourni par ISR, ou le pointeur CurrentIrp dans l’objet d’appareil cible, pour effectuer uniquement cette IRP.

À un moment donné, le même objet DPC ne peut pas être mis en file d’attente deux fois. Si un ISR appelle IoRequestDpc ou KeInsertQueueDpc plusieurs fois avant l’exécution de DpcForIsr ou CustomDpc correspondant, la routine DPC ne s’exécute qu’une seule fois lorsque l’IRQL sur un processeur tombe en dessous de DISPATCH_LEVEL. En revanche, si l’ISR appelle IoRequestDpc ou KeInsertQueueDpc alors que le DpcForIsr ou CustomDpc correspondant s’exécute sur un autre processeur, la routine DPC peut s’exécuter simultanément sur deux processeurs.

Par conséquent, tout pilote qui chevauche les opérations d’E/S pilotées par interruption sur son appareil doit avoir les éléments suivants :

  • Routine DpcForIsr ou CustomDpc qui peut effectuer un nombre de demandes en attente gérées par le pilote chaque fois qu’elle est appelée

  • IsR qui ne remplace jamais les informations de contexte qu’il transmet à une routine DpcForIsr ou CustomDpc , jusqu’à ce que cette routine ait utilisé les informations de contexte et terminé l’IRP auquel les informations de contexte appartiennent

  • Routine SynchCritSection qui accède à la zone de contexte de l’ISR pour le compte de la routine DpcForIsr ou CustomDpc