Función IoConnectInterrupt (wdm.h)
La rutina IoConnectInterrupt registra la rutina InterruptService (ISR) de un controlador de dispositivo, de modo que se llamará cuando se interrumpa un dispositivo en cualquiera de un conjunto de procesadores especificado.
Sintaxis
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
);
Parámetros
[out] InterruptObject
Puntero a la dirección del almacenamiento proporcionado por el controlador para un puntero a un conjunto de objetos de interrupción. Este puntero debe pasarse en llamadas posteriores a KeSynchronizeExecution.
[in] ServiceRoutine
Puntero al punto de entrada de la rutina InterruptService proporcionada por el controlador.
[in, optional] ServiceContext
Puntero al contexto determinado por el controlador que se proporcionará a la rutina InterruptService cuando se llame a . El área ServiceContext debe estar en memoria residente: en la extensión del dispositivo de un objeto de dispositivo creado por el controlador, en la extensión del controlador de un objeto de controlador creado por el controlador o en un grupo no paginado asignado por el controlador de dispositivo. Consulte Proporcionar información de contexto de ISR para obtener más información.
[in, optional] SpinLock
Puntero a un bloqueo de número inicializado, para el que el controlador proporciona el almacenamiento, que se usará para sincronizar el acceso a los datos determinados por el controlador compartidos por otras rutinas de controlador. Este parámetro es necesario si el ISR controla más de un vector o si el controlador tiene más de un ISR. De lo contrario, el controlador no necesita asignar almacenamiento para un bloqueo de número de interrupción y el puntero de entrada es NULL.
[in] Vector
Especifica el vector de interrupción pasado en el recurso de interrupción en el miembro u.Interrupt.Vector de CM_PARTIAL_RESOURCE_DESCRIPTOR.
[in] Irql
Especifica el DIRQL pasado en el recurso de interrupción en el miembro u.Interrupt.Level de CM_PARTIAL_RESOURCE_DESCRIPTOR.
[in] SynchronizeIrql
Especifica el DIRQL en el que se ejecutará el ISR. Si el ISR controla más de un vector de interrupción o el controlador tiene más de un ISR, este valor debe ser el más alto de los valores irql pasados en u.Interrupt.Level en cada recurso de interrupción. De lo contrario, los valores Irql y SynchronizeIrql son idénticos.
[in] InterruptMode
Especifica si la interrupción del dispositivo es LevelSensitive o Latched.
[in] ShareVector
Especifica si el vector de interrupción es compartible.
[in] ProcessorEnableMask
Especifica un valor KAFFINITY que representa el conjunto de procesadores en los que se pueden producir interrupciones del dispositivo en esta plataforma. Este valor se pasa en el recurso de interrupción en u.Interrupt.Affinity.
[in] FloatingSave
Especifica si se debe guardar la pila de punto flotante cuando se interrumpa el dispositivo del controlador. Para las plataformas basadas en x86 e Itanium, este valor debe establecerse en FALSE. Para obtener más información sobre cómo guardar el estado de punto flotante y MMX, vea Usar punto flotante o MMX en un controlador WDM.
Valor devuelto
IoConnectInterrupt puede devolver uno de los siguientes valores NTSTATUS:
STATUS_SUCCESS
STATUS_INVALID_PARAMETER: no se especificó ningún procesador.
STATUS_INSUFFICIENT_RESOURCES: no había suficiente grupo no paginado.
Comentarios
Los nuevos controladores deben usar la rutina IoConnectInterruptEx , que es más fácil de usar. Los controladores para dispositivos que admiten interrupciones señaladas por mensajes (MSI) deben usar IoConnectInterruptEx.
Un controlador PnP debe llamar a IoConnectInterrupt como parte del inicio del dispositivo antes de completar la solicitud de IRP_MN_START_DEVICE de PnP.
Cuando un controlador recibe una solicitud de IRP_MN_START_DEVICE , el controlador recibe recursos de hardware sin procesar y traducidos en los miembros Parameters.StartDevice.AllocatedResources y Parameters.StartDevice.AllocatedResourcesTranslated de la estructura IO_STACK_LOCATION del IRP, respectivamente. Para conectar su interrupción, el controlador usa los recursos de AllocatedResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. El controlador debe examinar la matriz de descriptores parciales para los recursos de tipo CmResourceTypeInterrupt.
Si el controlador proporciona el almacenamiento para SpinLock, debe llamar a KeInitializeSpinLock antes de pasar su bloqueo de giro de interrupción a IoConnectInterrupt.
Cuando se devuelve una llamada correcta a IoConnectInterrupt, se puede llamar al ISR del autor de la llamada si las interrupciones están habilitadas en el dispositivo del controlador o si ShareVector se estableció en TRUE. Los controladores no deben habilitar las interrupciones hasta que IoConnectInterrupt vuelva.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Disponible a partir de Windows 2000. |
Plataforma de destino | Universal |
Encabezado | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
Archivo DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
Reglas de cumplimiento de DDI | HwStorPortProhibitedDDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm) |