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) |