Funzione WdfInterruptAcquireLock (wdfinterrupt.h)
[Si applica a KMDF e UMDF]
Il metodo WdfInterruptAcquireLock inizia una sequenza di codice che viene eseguita a livello di richiesta di interruzione del dispositivo del dispositivo (DIRQL) tenendo premuto il blocco spin di un oggetto interrupt.
Per gli oggetti interrupt a livello passivo, il metodo inizia una sequenza di codice che viene eseguita a livello passivo mantenendo il blocco passivo di un oggetto interrupt.
Sintassi
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
Parametri
[in] Interrupt
Handle per un oggetto interrupt del framework.
Commenti
Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.
Quando un driver chiama WdfInterruptAcquireLock su un oggetto interrupt DIRQL, il sistema genera l'IRQL del processore al DIRQL del dispositivo e acquisisce il blocco di selezione specificato dal driver nella struttura di WDF_INTERRUPT_CONFIG dell'oggetto interrupt. Di conseguenza, le funzioni di callback dell'oggetto interrupt EvtInterruptIsr e EvtInterruptSynchronize (e qualsiasi altro codice che chiama WdfInterruptAcquireLock per lo stesso oggetto interrupt) non può essere eseguito.
Quando il driver chiama WdfInterruptReleaseLock, il sistema restituisce irQL del processore al livello precedente e rilascia il blocco spin.
Quando un driver chiama WdfInterruptAcquireLock su un oggetto interrupt a livello passivo, il sistema acquisisce il blocco di interrupt a livello passivo configurato dal driver nella struttura di WDF_INTERRUPT_CONFIG dell'oggetto interrupt.
Quando il driver chiama WdfInterruptReleaseLock, il sistema rilascia il blocco di interrupt.
Per gli interrupt a livello passivo, il driver deve chiamare WdfInterruptAcquireLock in IRQL = PASSIVE_LEVEL.
Non chiamare WdfInterruptAcquireLock da un contesto di thread arbitrario, ad esempio un gestore di richieste.
È possibile usare WdfInterruptAcquireLock e WdfInterruptReleaseLock se il driver deve eseguire alcune righe di codice senza essere preceduto e con la manutenzione degli interrupt del dispositivo disabilitati in modo efficace. Per sezioni più grandi del codice, il driver deve fornire una funzione di callback EvtInterruptSynchronize .
Il driver non può chiamare WdfInterruptAcquireLock prima che il framework abbia chiamato la funzione di callback EvtInterruptEnable del driver o dopo che il framework ha chiamato la funzione di callback EvtInterruptDisable del driver.
Dopo che il driver chiama WdfInterruptAcquireLock, non deve chiamare di nuovo il metodo per lo stesso oggetto interrupt prima di chiamare WdfInterruptReleaseLock.
Per altre informazioni sul metodo WdfInterruptAcquireLock , vedere Synchronizing Interrupt Code.For more information about the WdfInterruptAcquireLock method, see Synchronizing Interrupt Code.
Per altre informazioni sulla gestione degli interrupt nei driver basati su framework, vedere Gestione degli interrupt hardware.
Per gli oggetti interrupt a livello passivo, i driver devono chiamare WdfInterruptTryToAcquireLock anziché WdfInterruptAcquireLock, quando vengono eseguiti in un thread arbitrario, ad esempio una funzione di callback dell'oggetto coda. Ad esempio, il driver potrebbe chiamare WdfInterruptTryToAcquireLock da EvtIoRead.
In questo modo si evita la possibilità di deadlock, come descritto nello scenario seguente.
- Per determinare se il dispositivo è stato interrotto, il driver di funzione per un dispositivo periferico SPB invia I/O al bus dall'interno dell'ISR, con il blocco di interrupt a livello passivo mantenuto.
- Il driver del bus completa una seconda richiesta nello stesso thread in cui ha ricevuto la richiesta precedente.
- La routine di completamento della seconda richiesta invia una richiesta al driver periferico.
- La routine dispatch I/O del driver periferica chiama WdfInterruptAcquireLock, che quindi tenta di acquisire il blocco passivo dell'oggetto interrupt.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Versione KMDF minima | 1.0 |
Versione UMDF minima | 2,0 |
Intestazione | wdfinterrupt.h (include Wdf.h) |
IRQL | <= DIRQL |
Regole di conformità DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf) |