Fonction WdfInterruptAcquireLock (wdfinterrupt.h)
[S’applique à KMDF et UMDF]
La méthode WdfInterruptAcquireLock démarre une séquence de code qui s’exécute au niveau de la demande d’interruption de l’appareil (DIRQL) tout en tenant le verrou de rotation d’un objet d’interruption.
Pour les objets d’interruption de niveau passif, la méthode commence une séquence de code qui s’exécute au niveau passif tout en conservant le verrou passif d’un objet d’interruption.
Syntaxe
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
Paramètres
[in] Interrupt
Handle d’un objet d’interruption de framework.
Remarques
Un bogue case activée se produit si le pilote fournit un handle d’objet non valide.
Lorsqu’un pilote appelle WdfInterruptAcquireLock sur un objet d’interruption DIRQL, le système élève l’IRQL du processeur au DIRQL de l’appareil et acquiert le verrou de rotation spécifié par le pilote dans la structure WDF_INTERRUPT_CONFIG de l’objet d’interruption. Par conséquent, les fonctions de rappel EvtInterruptIsr et EvtInterruptSynchronize de l’objet d’interruption (et tout autre code qui appelle WdfInterruptAcquireLock pour le même objet d’interruption) ne peuvent pas s’exécuter.
Lorsque le pilote appelle WdfInterruptReleaseLock, le système retourne l’IRQL du processeur à son niveau précédent et libère le verrou de rotation.
Lorsqu’un pilote appelle WdfInterruptAcquireLock sur un objet d’interruption de niveau passif, le système acquiert le verrou d’interruption de niveau passif que le pilote a configuré dans la structure WDF_INTERRUPT_CONFIG de l’objet d’interruption.
Lorsque le pilote appelle WdfInterruptReleaseLock, le système libère le verrou d’interruption.
Pour les interruptions de niveau passif, le pilote doit appeler WdfInterruptAcquireLock à IRQL = PASSIVE_LEVEL.
N’appelez pas WdfInterruptAcquireLock à partir d’un contexte de thread arbitraire, tel qu’un gestionnaire de requêtes.
Vous pouvez utiliser WdfInterruptAcquireLock et WdfInterruptReleaseLock si votre pilote doit exécuter quelques lignes de code sans être préempté et si la maintenance des interruptions d’appareil est effectivement désactivée. Pour les sections plus importantes de code, votre pilote doit fournir une fonction de rappel EvtInterruptSynchronize .
Votre pilote ne peut pas appeler WdfInterruptAcquireLock avant que l’infrastructure ait appelé la fonction de rappel EvtInterruptEnable du pilote ou après que l’infrastructure ait appelé la fonction de rappel EvtInterruptDisable du pilote.
Une fois que votre pilote a appelé WdfInterruptAcquireLock, il ne doit plus appeler la méthode pour le même objet d’interruption avant d’appeler WdfInterruptReleaseLock.
Pour plus d’informations sur la méthode WdfInterruptAcquireLock , consultez Synchronisation du code d’interruption.
Pour plus d’informations sur la gestion des interruptions dans les pilotes basés sur l’infrastructure, consultez Gestion des interruptions matérielles.
Pour les objets d’interruption de niveau passif, les pilotes doivent appeler WdfInterruptTryToAcquireLock au lieu de WdfInterruptAcquireLock, lors de l’exécution dans un thread arbitraire, tel qu’une fonction de rappel d’objet de file d’attente. Par exemple, le pilote peut appeler WdfInterruptTryToAcquireLock à partir d’EvtIoRead.
Cela évite le risque d’interblocage, comme décrit dans le scénario suivant.
- Pour déterminer si son appareil a été interrompu, le pilote de fonction d’un périphérique SPB envoie des E/S à son bus à partir de son ISR, avec le verrou d’interruption de niveau passif maintenu.
- Le pilote de bus effectue une deuxième requête dans le même thread dans lequel il a reçu la demande ci-dessus.
- La routine d’achèvement de la deuxième demande envoie une requête au pilote périphérique.
- La routine de répartition des E/S du pilote périphérique appelle WdfInterruptAcquireLock, qui interbloque ensuite en tentant d’acquérir le verrou passif de l’objet d’interruption.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
Version KMDF minimale | 1.0 |
Version UMDF minimale | 2.0 |
En-tête | wdfinterrupt.h (include Wdf.h) |
IRQL | <= DIRQL |
Règles de conformité DDI | DriverCreate(kmdf),KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf) |