Compartir a través de


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)

Consulte también

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution