Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
[S’applique à KMDF et UMDF]
La méthode WdfInterruptAcquireLock commence une séquence de code qui s’exécute au niveau de la demande d’interruption de l’appareil (DIRQL) de l’appareil tout en maintenant 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 tenant le verrou passif d’un objet d’interruption.
Syntaxe
VOID WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
Paramètres
[in] Interrupt
Handle vers un objet d’interruption de framework.
Valeur de retour
Aucun
Remarques
Une vérification de bogue 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 déclenche l’IRQL du processeur vers le DIRQL de l’appareil et acquiert le verrou de rotation spécifié dans la structure WDF_INTERRUPT_CONFIG de l’objet d’interruption. Par conséquent, les fonctions de rappel EvtInterruptIsr et EvtInterruptSynchronize fonctions de rappel (et tout autre code qui appelle WdfInterruptAcquireLock pour le même objet d’interruption) ne peut pas s’exécuter.
Lorsque le pilote appelle WdfInterruptReleaseLock, le système retourne le runtime d’intégration 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 au 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 avec la maintenance des interruptions de périphérique désactivées efficacement. Pour les sections de code plus volumineuses, votre pilote doit fournir une fonction de rappel EvtInterruptSynchronize.
Votre pilote ne peut pas appeler WdfInterruptAcquireLock avant que l’infrastructure n’ait appelé la fonction de rappel EvtInterruptEnable du pilote ou une fois que l’infrastructure a appelé la fonction de rappel evtInterruptDisable du pilote.
Une fois que votre pilote appelle WdfInterruptAcquireLock, il ne doit pas appeler à nouveau 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 file d’attente . Par exemple, le pilote peut appeler WdfInterruptTryToAcquireLock à partir de EvtIoRead.
Cela évite la possibilité d’interblocage, comme décrit dans le scénario suivant.
- Pour déterminer si son appareil est 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 termine 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 requête envoie une requête au pilote périphérique.
- La routine de distribution d’E/S du pilote périphérique appelle WdfInterruptAcquireLock, qui tente ensuite d’acquérir le verrou passif de l’objet d’interruption.
Spécifications
| Besoin | Valeur |
|---|---|
| plateforme cible | Universel |
| version minimale de KMDF | 1.0 |
| version minimale de UMDF | 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) |