IoConnectInterrupt
NTSTATUS
IoConnectInterrupt(
OUT PKINTERRUPT *InterruptObject,
IN PKSERVICE_ROUTINE ServiceRoutine,
IN PVOID ServiceContext,
IN PKSPIN_LOCK SpinLock, /* optional */
IN ULONG Vector,
IN KIRQL Irql,
IN KIRQL SynchronizeIrql,
IN KINTERRUPT_MODE InterruptMode,
IN BOOLEAN ShareVector,
IN KAFFINITY ProcessorEnableMask,
IN BOOLEAN FloatingSave
);
IoConnectInterrupt registers a device driver’s ISR to be called when
its device interrupts on any of a given set of processors.
Parameters
-
InterruptObject
-
Points to the address of driver-supplied storage for a pointer to a set of
interrupt objects, which was obtained by calling HalGetInterruptVector.
This pointer must be passed in subsequent calls to KeSynchronizeExecution.
-
ServiceRoutine
-
Points to the entry point for the driver-supplied ISR declared as follows:
BOOLEAN
(*PKSERVICE_ROUTINE)(
IN PKINTERRUPT Interrupt,
IN PVOID ServiceContext
);
-
ServiceContext
-
Points to the driver-determined context with which the specified ISR will be
called. The ServiceContext area must be in resident memory: in the
device extension of a driver-created device object, in the controller
extension of a driver-created controller object, or in nonpaged pool allocated
by the device driver.
-
SpinLock
-
Points to an initialized spin lock, for which the driver supplies the storage,
that will be used to synchronize access to driver-determined data shared by
other driver routines. This parameter is required if the ISR handles more than
one vector or if the driver has more than one ISR. Otherwise, the driver need
not allocate storage for an interrupt spin lock and the input pointer is NULL.
-
Vector
-
Specifies the interrupt vector returned by the driver’s call to HalGetInterruptVector.
-
Irql
-
Specifies the DIRQL returned by HalGetInterruptVector for the Vector.
-
SynchronizeIrql
-
Specifies the DIRQL at which the ISR will execute. If the ISR handles more
than one interrupt vector or the driver has more than one ISR, this value must
be the highest of the Irql values returned by calls to HalGetInterruptVector
for each vector. Otherwise, the Irql and SynchronizeIrql values
are identical.
-
InterruptMode
-
Specifies whether the device interrupt is LevelSensitive or Latched.
-
ShareVector
-
Specifies whether the interrupt vector is sharable.
-
ProcessorEnableMask
-
Specifies the set of processors on which device interrupts can occur in this
platform. This value also was returned by HalGetInterruptVector.
-
FloatingSave
-
Specifies whether to save the floating-point stack when the driver’s device
interrupts. For X86-based platforms, this value must be set to FALSE.
Return Value
IoConnectInterrupt can return one of the following NTSTATUS values:
STATUS_SUCCESS
STATUS_INVALID_PARAMETER
STATUS_INSUFFICIENT_RESOURCES
Comments
If the driver supplies the storage for the SpinLock, it must call KeInitializeSpinLock
before passing its interrupt spin lock to IoConnectInterrupt.
On return from a successful call to IoConnectInterrupt, the caller’s
ISR can be called if interrupts are enabled on the driver’s device or if ShareVector
was set to TRUE.
Callers of IoConnectInterrupt must be running at IRQL PASSIVE_LEVEL.
See Also
HalGetInterruptVector, KeInitializeSpinLock,
KeSynchronizeExecution