Freigeben über


WdfInterruptAcquireLock-Funktion (wdfinterrupt.h)

[Gilt für KMDF und UMDF]

Die WdfInterruptAcquireLock-Methode beginnt eine Codesequenz, die auf der Geräteunterbrechungsanforderungsebene (Device Interrupt Request Level, DIRQL) des Geräts ausgeführt wird, während die Drehsperre eines Interruptobjekts gedrückt wird.

Bei Interruptobjekten auf passiver Ebene beginnt die -Methode eine Codesequenz, die auf passiver Ebene ausgeführt wird, während die passive Sperre eines Interruptobjekts gehalten wird.

Syntax

void WdfInterruptAcquireLock(
  [in] WDFINTERRUPT Interrupt
);

Parameter

[in] Interrupt

Ein Handle für ein Framework-Interruptobjekt.

Hinweise

Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.

Wenn ein Treiber WdfInterruptAcquireLock für ein DIRQL-Interruptobjekt aufruft, hebt das System die IRQL des Prozessors auf die DIRQL des Geräts aus und ruft die Drehsperre ab, die der Treiber in der WDF_INTERRUPT_CONFIG Struktur des Interruptobjekts angegeben hat. Daher können die Rückruffunktionen EvtInterruptIsr und EvtInterruptSynchronize des Interruptobjekts (sowie jeder andere Code, der WdfInterruptAcquireLock für dasselbe Interruptobjekt aufruft) nicht ausgeführt werden.

Wenn der Treiber WdfInterruptReleaseLock aufruft, gibt das System den IRQL des Prozessors auf die vorherige Ebene zurück und gibt die Spinsperre auf.

Wenn ein Treiber WdfInterruptAcquireLock für ein Interruptobjekt auf passiver Ebene aufruft, ruft das System die Interruptsperre auf passiver Ebene ab, die der Treiber in der WDF_INTERRUPT_CONFIG Struktur des Interruptobjekts konfiguriert hat.

Wenn der Treiber WdfInterruptReleaseLock aufruft, gibt das System die Interruptsperre auf.

Bei Unterbrechungen auf passiver Ebene muss der Treiber WdfInterruptAcquireLock bei IRQL = PASSIVE_LEVEL aufrufen.

Rufen Sie WdfInterruptAcquireLock nicht aus einem beliebigen Threadkontext, z. B. einem Anforderungshandler, auf.

Sie können WdfInterruptAcquireLock und WdfInterruptReleaseLock verwenden, wenn Ihr Treiber einige Codezeilen ausführen muss, ohne vorzeitig und mit der Wartung von Geräteunterbrechungen effektiv deaktiviert zu werden. Für größere Codeabschnitte sollte Ihr Treiber eine Rückruffunktion "EvtInterruptSynchronize " bereitstellen.

Ihr Treiber kann WdfInterruptAcquireLock nicht aufrufen, bevor das Framework die EvtInterruptEnable-Rückruffunktion des Treibers aufgerufen hat oder nachdem das Framework die EvtInterruptDisable-Rückruffunktion des Treibers aufgerufen hat.

Nachdem Ihr Treiber WdfInterruptAcquireLock aufgerufen hat, darf er die Methode nicht erneut für dasselbe Interruptobjekt aufrufen, bevor WdfInterruptReleaseLock aufgerufen wird.

Weitere Informationen zur WdfInterruptAcquireLock-Methode finden Sie unter Synchronisieren von Interruptcode.

Weitere Informationen zum Behandeln von Interrupts in frameworkbasierten Treibern finden Sie unter Behandeln von Hardwareunterbrechungen.

Bei Interruptobjekten auf passiver Ebene müssen Treiber WdfInterruptTryToAcquireLock anstelle von WdfInterruptAcquireLock aufrufen, wenn sie in einem beliebigen Thread ausgeführt werden, z. B. einer Rückruffunktion für Warteschlangenobjekte. Beispielsweise kann der Treiber WdfInterruptTryToAcquireLock von EvtIoRead aufrufen.

Dadurch wird die Möglichkeit eines Deadlocks vermieden, wie im folgenden Szenario beschrieben.

  1. Um festzustellen, ob das Gerät unterbrochen wurde, sendet der Funktionstreiber für ein SPB-Peripheriegerät E/A von innerhalb des ISR an den Bus, wobei die Unterbrechungssperre auf passiver Ebene gehalten wird.
  2. Der Bustreiber schließt eine zweite Anforderung im selben Thread ab, in dem er die oben genannte Anforderung empfangen hat.
  3. Die Vervollständigungsroutine der zweiten Anforderung sendet eine Anforderung an den Peripherietreiber.
  4. Die E/A-Dispatchroutine des Peripherietreibers ruft WdfInterruptAcquireLock auf, wodurch dann ein Deadlock versucht wird, die passive Sperre des Interruptobjekts abzurufen.

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1.0
UMDF-Mindestversion 2.0
Kopfzeile wdfinterrupt.h (einschließen von Wdf.h)
IRQL <= DIRQL
DDI-Complianceregeln DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf)

Weitere Informationen