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