MINIPORT_ISR función de devolución de llamada (ndis.h)

NDIS llama a la función MiniportInterrupt cuando una NIC u otro dispositivo que comparte la interrupción con la NIC genera una interrupción.

Nota Debe declarar esta función mediante el tipo MINIPORT_ISR . Para obtener más información, consulte la sección Ejemplos siguientes.
 

Sintaxis

MINIPORT_ISR MiniportIsr;

BOOLEAN MiniportIsr(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [out] PBOOLEAN QueueDefaultInterruptDpc,
  [out] PULONG TargetProcessors
)
{...}

Parámetros

[in] MiniportInterruptContext

Identificador de un bloque de información de contexto de interrupción. El controlador de minipuerto proporcionó este controlador en el parámetro MiniportInterruptContext que el controlador de miniporte pasó al Función NdisMRegisterInterruptEx .

[out] QueueDefaultInterruptDpc

Puntero a una variable BOOLEAN que el controlador de miniporte establece antes de que vuelva de esta llamada. Un controlador de minipuerto establece este valor en TRUE para indicar que el controlador requiere un DPC en la CPU predeterminada (actual). Si este valor se establece en TRUE, NDIS omite el valor del parámetro TargetProcessors . Si se establece en FALSE, NDIS usa el valor del parámetro TargetProcessors para programar DPC. Si QueueDefaultInterruptDpc es TRUE, NDIS programará un DPC independientemente del valor devuelto de MiniportInterrupt.

[out] TargetProcessors

Máscara de bits que indica los procesadores de destino para los que NDIS debe programar un DPC. Esta máscara de bits representa los primeros 32 procesadores del grupo de procesadores 0. Cada bit de la máscara de bits identifica una CPU. Si el autor de la llamada establece el bit 0, NDIS programa un DPC para la CPU 0. Si el autor de la llamada establece el bit 1, NDIS programa un DPC para la CPU 1, etc. Si QueueDefaultInterruptDpc está establecido en FALSE y TargetProcessors está establecido en cero, NDIS no programará ningún DPC. De lo contrario, NDIS programará DPC independientemente del valor devuelto de MiniportInterrupt.

Nota Los controladores NDIS 6.20 y versiones posteriores no deben usar este parámetro para programar DPC. En su lugar, deben establecer este parámetro en cero y usar la función NdisMQueueDpcEx para programar DPC.
 

Valor devuelto

MiniportInterrupt devuelve uno de los siguientes valores:

Código devuelto Descripción
VERDAD

MiniportInterrupt determinó que la NIC subyacente generó la interrupción.

FALSO

MiniportInterrupt determinó que la NIC subyacente no generaba la interrupción.

 
Nota NDIS pondrá en cola los DPC en función de los valores especificados en los parámetros QueueDefaultInterruptDpc y TargetProcessors , independientemente del valor que devuelve MiniportInterrupt . Sin embargo, MiniportInterrupt todavía debe devolver el valor correcto.
 

Comentarios

Los controladores miniport que registran una interrupción con la función NdisMRegisterInterruptEx deben proporcionar una función MiniportInterrupt .

Un controlador de minipuerto debe hacer el menor trabajo posible en su función MiniportInterrupt . Debe aplazar las operaciones de E/S para las interrupciones que genera la NIC en la función MiniportInterruptDPC .

Cuando se produce una interrupción en la línea de interrupción de una NIC, NDIS llama a la función MiniportInterrupt del controlador de miniport.

Todas las NIC pueden compartir interrupciones basadas en línea con otros dispositivos en el bus de E/S. Si la NIC no generó la interrupción, MiniportInterrupt debe devolver FALSE inmediatamente para que el sistema pueda llamar al controlador del dispositivo que generó la interrupción. Si QueueDefaultInterruptDpc se establece en FALSE y el parámetro TargetProcessors se establece en cero, NDIS no programará ningún DPC. De lo contrario, NDIS programará LOS DPC independientemente del valor de giro deMiniportInterruptde MiniportInterrupt.

Si la interrupción es para la NIC, MiniportInterrupt descarta la interrupción en la NIC, guarda el estado que tenga sobre la interrupción y aplaza la mayor parte del procesamiento de E/S posible a la función MiniportInterruptDPC .

Si la NIC subyacente generó la interrupción especificada y el controlador de minipuerto solicitará llamadas a procedimiento diferido (DPC), el controlador de miniporte debe deshabilitar todas las interrupciones adicionales de la NIC y volver a habilitar las interrupciones una vez finalizadas todas las DPC.

El controlador de minipuerto debe establecer QueueDefaultInterruptDpc en TRUE para programar un DPC solo para la CPU predeterminada. El controlador podría hacerlo, por ejemplo, si:

  • La NIC generó la interrupción para indicar la finalización de una operación de envío o cualquier otra solicitud que no se ejecute en otras CPU.
  • La NIC generó la interrupción para indicar los datos recibidos y el controlador de minipuerto no puede procesar paquetes recibidos en DPC independientes.
  • La interrupción indica que los paquetes recibidos y el controlador de miniporte pueden procesar paquetes recibidos en DPC independientes, pero el escalado lateral de recepción (RSS) no está habilitado para el controlador de minipuerto. Para obtener más información, vea OID_GEN_RECEIVE_SCALE_CAPABILITIES y OID_GEN_RECEIVE_SCALE_PARAMETERS.
Si un controlador de minipuerto procesa paquetes recibidos en DPC independientes, el controlador establece el parámetro QueueDefaultInterruptDpc en FALSE. El controlador de minipuerto debe establecer el bit TargetProcessors para la CPU asociada a cada cola de recepción no vacía. NDIS programará un DPC en cada una de las CPU indicadas.
Nota NDIS pondrá en cola los DPC en función de los valores especificados en los parámetros QueueDefaultInterruptDpc y TargetProcessors , independientemente del valor que devuelve MiniportInterrupt . Sin embargo, MiniportInterrupt todavía debe devolver el valor correcto.
 
Si MiniportInterrupt comparte recursos, como registros NIC o variables de estado, con otra función MiniportXxx que se ejecuta en un IRQL inferior, esa función MiniportXxx debe llamar a Función NdisMSynchronizeWithInterruptEx . Esto garantiza que la función MiniportSynchronizeInterrupt del controlador tenga acceso a los recursos compartidos de una manera sincronizada y segura para varios procesadores.

Un controlador de minipuerto puede llamar a Función NdisMDeregisterInterruptEx de su función MiniportInitializeEx o MiniportHaltEx para liberar recursos asignados con NdisMRegisterInterruptEx. Después de que NdisMDeregisterInterruptEx devuelva, NDIS no llama a la función MiniportInterrupt o MiniportInterruptDPC del controlador de miniport.

NDIS llama a MiniportInterrupt en el DIRQL de la interrupción que el controlador de miniporte registró en una llamada anterior a NdisMRegisterInterruptEx. Por lo tanto, MiniportInterrupt debe llamar al subconjunto de las funciones NDIS, como las funciones NdisRawXxx o NdisRead/WriteRegisterXxx , que son seguras para llamar a en cualquier IRQL.

Ejemplos

Para definir una función MiniportInterrupt , primero debe proporcionar una declaración de función que identifique el tipo de función que va a definir. Windows proporciona un conjunto de tipos de función para controladores. Declarar una función mediante los tipos de función ayuda a Code Analysis for Drivers, Static Driver Verifier (SDV) y otras herramientas de comprobación a encontrar errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir una función MiniportInterrupt denominada "MyInterrupt", use el tipo MINIPORT_ISR como se muestra en este ejemplo de código:

MINIPORT_ISR MyInterrupt;

A continuación, implemente la función de la siguiente manera:

_Use_decl_annotations_
BOOLEAN
 MyInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

El tipo de función MINIPORT_ISR se define en el archivo de encabezado Ndis.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación Use_decl_annotations a la definición de función. La anotación Use_decl_annotations garantiza que se usen las anotaciones que se aplican al tipo de función MINIPORT_ISR en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de roles de función para controladores NDIS.

Para obtener información sobre Use_decl_annotations, consulte Anotación del comportamiento de la función.

Requisitos

Requisito Value
Cliente mínimo compatible Compatible con NDIS 6.0 y versiones posteriores.
Plataforma de destino Windows
Encabezado ndis.h (incluya Ndis.h)
IRQL Consulte la sección Comentarios.

Consulte también

MiniportHaltEx

MiniportInitializeEx

MiniportInterruptDPC

MiniportSynchronizeInterrupt NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

Receive Side Scaling (RSS)