Freigeben über


IoConnectInterrupt-Funktion (wdm.h)

Die IoConnectInterrupt-Routine registriert die InterruptService-Routine (ISR ) eines Gerätetreibers, sodass sie aufgerufen wird, wenn ein Gerät auf einem der angegebenen Prozessoren unterbricht.

Syntax

NTSTATUS IoConnectInterrupt(
  [out]          PKINTERRUPT       *InterruptObject,
  [in]           PKSERVICE_ROUTINE ServiceRoutine,
  [in, optional] PVOID             ServiceContext,
  [in, optional] PKSPIN_LOCK       SpinLock,
  [in]           ULONG             Vector,
  [in]           KIRQL             Irql,
  [in]           KIRQL             SynchronizeIrql,
  [in]           KINTERRUPT_MODE   InterruptMode,
  [in]           BOOLEAN           ShareVector,
  [in]           KAFFINITY         ProcessorEnableMask,
  [in]           BOOLEAN           FloatingSave
);

Parameter

[out] InterruptObject

Zeiger auf die Adresse des vom Treiber bereitgestellten Speichers für einen Zeiger auf einen Satz von Interruptobjekten. Dieser Zeiger muss in nachfolgenden Aufrufen von KeSynchronizeExecution übergeben werden.

[in] ServiceRoutine

Zeiger auf den Einstiegspunkt für die vom Treiber bereitgestellte InterruptService-Routine .

[in, optional] ServiceContext

Zeiger auf den vom Treiber bestimmten Kontext, der beim Aufruf an die InterruptService-Routine bereitgestellt wird. Der ServiceContext-Bereich muss sich im residenten Arbeitsspeicher befinden: in der Geräteerweiterung eines vom Treiber erstellten Geräteobjekts, in der Controllererweiterung eines vom Treiber erstellten Controllerobjekts oder im vom Gerätetreiber zugewiesenen Pool ohne Auslagerung. Weitere Informationen finden Sie unter Bereitstellen von ISR-Kontextinformationen .

[in, optional] SpinLock

Zeiger auf eine initialisierte Spinsperre, für die der Treiber den Speicher bereitstellt, der zum Synchronisieren des Zugriffs auf vom Treiber bestimmte Daten verwendet wird, die von anderen Treiberroutinen freigegeben werden. Dieser Parameter ist erforderlich, wenn der ISR mehr als einen Vektor verarbeitet oder der Treiber über mehrere ISR verfügt. Andernfalls muss der Treiber keinen Speicher für eine Unterbrechungsdrehsperre zuweisen, und der Eingabezeiger ist NULL.

[in] Vector

Gibt den Interruptvektor an, der in der Interruptressource am u.Interrupt.Vector-Element von CM_PARTIAL_RESOURCE_DESCRIPTOR übergeben wird.

[in] Irql

Gibt den DIRQL an, der in der Interruptressource am u.Interrupt.Level-Member von CM_PARTIAL_RESOURCE_DESCRIPTOR übergeben wird.

[in] SynchronizeIrql

Gibt den DIRQL an, unter dem die ISR ausgeführt wird. Wenn der ISR mehr als einen Interruptvektor verarbeitet oder der Treiber über mehrere ISR verfügt, muss dieser Wert der höchste der Irql-Werte sein, die in jeder Interruptressource an u.Interrupt.Level übergeben werden. Andernfalls sind die Irql - und SynchronizeIrql-Werte identisch.

[in] InterruptMode

Gibt an, ob der Geräteunterbrechung LevelSensitive oder Latched ist.

[in] ShareVector

Gibt an, ob der Interruptvektor teilbar ist.

[in] ProcessorEnableMask

Gibt einen KAFFINITY-Wert an, der den Satz von Prozessoren darstellt, auf dem Geräteunterbrechungen auf dieser Plattform auftreten können. Dieser Wert wird in der Interruptressource unter u.Interrupt.Affinity übergeben.

[in] FloatingSave

Gibt an, ob der Gleitkommastapel gespeichert werden soll, wenn das Gerät des Treibers unterbrochen wird. Für x86-basierte und Itanium-basierte Plattformen muss dieser Wert auf FALSE festgelegt werden. Weitere Informationen zum Speichern von Gleitkomma- und MMX-Zustand finden Sie unter Verwenden von Gleitkomma oder MMX in einem WDM-Treiber.

Rückgabewert

IoConnectInterrupt kann einen der folgenden NTSTATUS-Werte zurückgeben:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER: Es wurden keine Prozessoren angegeben.

STATUS_INSUFFICIENT_RESOURCES: Es gab nicht genügend Nicht-Auslagerpool.

Hinweise

Neue Treiber sollten die IoConnectInterruptEx-Routine verwenden, die einfacher zu verwenden ist. Treiber für Geräte, die MSI (Message-Signaled Interrupts) unterstützen, müssen IoConnectInterruptEx verwenden.

Ein PnP-Treiber sollte IoConnectInterrupt als Teil des Gerätestarts aufrufen, bevor die PnP-IRP_MN_START_DEVICE-Anforderung abgeschlossen wird.

Wenn ein Treiber eine IRP_MN_START_DEVICE-Anforderung empfängt, empfängt der Treiber rohe und übersetzte Hardwareressourcen in den Membern Parameters.StartDevice.AllocatedResources und Parameters.StartDevice.AllocatedResourcesTranslated der IO_STACK_LOCATION-Struktur des IRP. Um den Interrupt zu verbinden, verwendet der Treiber die Ressourcen unter AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. Der Treiber muss das Array von Teildeskriptoren auf Ressourcen des Typs CmResourceTypeInterrupt überprüfen.

Wenn der Treiber den Speicher für den SpinLock bereitstellt, muss er KeInitializeSpinLock aufrufen, bevor die Interrupt-Spinsperre an IoConnectInterrupt übergeben wird.

Nach einem erfolgreichen Aufruf von IoConnectInterrupt kann die ISR des Aufrufers aufgerufen werden, wenn Interrupts auf dem Gerät des Treibers aktiviert sind oder Wenn ShareVector auf TRUE festgelegt wurde. Treiber dürfen Interrupts erst aktivieren, nachdem IoConnectInterrupt zurückgegeben wurde .

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows 2000.
Zielplattform Universell
Header wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm)

Weitere Informationen

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution