Freigeben über


IoConnectInterrupt-Funktion (wdm.h)

Die IoConnectInterrupt Routine registriert die InterruptService-Routine (InterruptService Routine, ISR), sodass sie aufgerufen wird, wenn ein Gerät auf einer bestimmten Gruppe von 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 an 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 speicherinternen Speicher 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 nicht seitengebundenen Pool. Weitere Informationen finden Sie unter Bereitstellen von ISR-Kontextinformationen.

[in, optional] SpinLock

Zeiger auf eine initialisierte Drehsperre, für die der Treiber den Speicher bereitstellt, der verwendet wird, um den Zugriff auf treiberbestimmte Daten zu synchronisieren, die von anderen Treiberroutinen gemeinsam genutzt werden. Dieser Parameter ist erforderlich, wenn der ISR mehrere Vektoren behandelt oder wenn der Treiber mehrere ISR hat. Andernfalls muss der Treiber keinen Speicher für eine Unterbrechungsdrehsperre zuweisen, und der Eingabezeiger ist NULL-.

[in] Vector

Gibt den in der Interruptressource an der u.Interrupt.Vector Member von CM_PARTIAL_RESOURCE_DESCRIPTORübergebenen Interruptvektor an.

[in] Irql

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

[in] SynchronizeIrql

Gibt die DIRQL an, bei der der ISR ausgeführt wird. Wenn der ISR mehrere Unterbrechungsvektoren verarbeitet oder der Treiber mehrere ISR-Werte enthält, muss dieser Wert der höchsten Irql- Werte sein, die an u.Interrupt.Level in jeder Interruptressource übergeben werden. Andernfalls sind die Irql- und SynchronizeIrql--Werte identisch.

[in] InterruptMode

Gibt an, ob der Geräteunterbruch LevelSensitive oder latchedist.

[in] ShareVector

Gibt an, ob der Unterbrechungsvektor abharrbar ist.

[in] ProcessorEnableMask

Gibt einen KAFFINITY- Wert an, der den Satz von Prozessoren darstellt, auf denen Geräteunterbrechungen auf dieser Plattform auftreten können. Dieser Wert wird in der Interruptressource an 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 Using Floating Point or MMX in a WDM Driver.

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 seitenseitigen Pool.

Bemerkungen

Neue Treiber sollten die IoConnectInterruptEx Routine verwenden, die einfacher zu verwenden ist. Treiber für Geräte, die Nachrichtensignalunterbrüche (MSI) 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 unformatierte und übersetzte Hardwareressourcen in der Parameters.StartDevice.AllocatedResources und Parameters.StartDevice.AllocatedResourcesTranslated Member 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 partiellen Deskriptoren nach Ressourcen vom Typ CmResourceTypeInterruptscannen.

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

Bei einem erfolgreichen Aufruf von IoConnectInterruptkann der ISR des Anrufers aufgerufen werden, wenn Unterbrechungen auf dem Gerät des Treibers aktiviert sind oder wenn ShareVector- auf TRUEfestgelegt wurde. Treiber dürfen keine Unterbrechungen erst aktivieren, nachdem IoConnectInterrupt zurückgegeben wurde.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Ab Windows 2000 verfügbar.
Zielplattform- Universal
Header- wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- PASSIVE_LEVEL
DDI-Complianceregeln HwStorPortProhibitedDDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm)

Siehe auch

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt-

KeInitializeSpinLock

KeSynchronizeExecution