Compartir a través de


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

NDIS llama a la función miniportMessageInterrupt cuando una NIC genera una interrupción basada en mensajes.

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

Sintaxis

MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;

BOOLEAN MiniportMessageInterrupt(
  [in]  NDIS_HANDLE MiniportInterruptContext,
  [in]  ULONG MessageId,
  [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.

[in] MessageId

Identificador de mensaje de interrupción con señal de mensaje (MSI). messageId es un índice de un IO_INTERRUPT_MESSAGE_INFO_ENTRY estructura dentro de estructura IO_INTERRUPT_MESSAGE_INFO. NDIS pasa un puntero a la estructura de IO_INTERRUPT_MESSAGE_INFO asociada en el miembro MessageInfoTable de cuando el controlador se registra correctamente para MSI con la función NdisMRegisterInterruptEx.

[out] QueueDefaultInterruptDpc

Puntero a una variable booleana que el controlador de miniporte establece antes de volver de esta llamada. Un controlador de miniport establece este valor en TRUE para indicar que el controlador requiere un DPC en la CPU predeterminada (actual). Si 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.

[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.

Nota 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

miniportMessageInterrupt devuelve TRUE si la NIC subyacente generó la interrupción; de lo contrario, devuelve FALSE.

Observaciones

Los controladores de miniport que se registran para la compatibilidad de interrupciones con señal de mensaje (MSI) con la función NdisMRegisterInterruptEx de deben proporcionar una función MiniportMessageInterrupt.

Un controlador de miniport debe realizar el menor trabajo posible en su función MiniportMessageInterrupt. Debe aplazar las operaciones de E/S para las interrupciones que genera la NIC en el función miniportMessageInterruptDPC.

Cuando una NIC genera un MSI, NDIS llama a la función miniportMessageInterrupt del controlador de miniporte.

MiniportMessageInterrupt guarda la información de estado necesaria sobre la interrupción y aplaza tanto el procesamiento de E/S como sea posible a la función miniportMessageInterruptDPC.

Si el controlador de miniporta solicita llamadas a procedimiento diferido (DPC) para un mensaje especificado, el controlador de miniporte debe deshabilitar todas las interrupciones adicionales para ese mensaje y volver a habilitar las interrupciones después de que finalicen todos los DPC.

El controlador de miniport debe establecer QueueDefaultInterruptDpc en TRUE para programar un DPC solo para la CPU predeterminada. El controlador puede 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 miniporte no puede procesar paquetes recibidos en DPC independientes.
  • La interrupción indica los paquetes recibidos y el controlador de miniportar puede procesar paquetes recibidos en DPC independientes, pero escala lateral de recepción (RSS) no está habilitado para el controlador de miniport. Para obtener más información, consulte OID_GEN_RECEIVE_SCALE_CAPABILITIES y OID_GEN_RECEIVE_SCALE_PARAMETERS.
  • El escalado lateral de recepción está habilitado para el controlador de miniporte y el controlador de miniporte puede generar mensajes diferentes en cada cola de recepción.
Si un controlador de miniporte procesa paquetes recibidos en DPC independientes, el controlador de miniporta establece el parámetro QueueDefaultInterruptDpc en FALSE. El controlador de miniport debe establecer el TargetProcessors bit para la CPU asociada a cada cola de recepción no vacía. NDIS programará un DPC en cada una de las CPU indicadas en el grupo de procesadores 0.

Si MiniportMessageInterrupt comparte recursos para un mensaje especificado, como registros de NIC o variables de estado, con otra función MiniportXxx que se ejecuta en un IRQL inferior, esa función MiniportXxx debe llamar a la función función NdisMSynchronizeWithInterruptEx. Esto garantiza que la función MiniportSynchronizeMessageInterrupt del controlador acceda a los recursos compartidos de forma sincronizada y segura para varios procesadores.

Un controlador de minipuerto puede llamar al función NdisMDeregisterInterruptEx de su MiniportInitializeEx o función miniportHaltEx para liberar los recursos asignados con NdisMRegisterInterruptEx. Después de NdisMDeregisterInterruptEx, NDIS no llama a la función miniportMessageInterrupt o miniportMessageInterruptDPC.

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

Ejemplos de

Para definir una función miniportMessageInterrupt, 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 análisis de código para controladores, comprobador de controladores estáticos (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir un miniportMessageInterrupt función denominada "MyMessageInterrupt", use el tipo MINIPORT_MESSAGE_INTERRUPT tal como se muestra en este ejemplo de código:

MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;

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

_Use_decl_annotations_
BOOLEAN
 MyMessageInterrupt(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PBOOLEAN  QueueDefaultInterruptDpc,
    PULONG  TargetProcessors
    )
  {...}

El tipo de función MINIPORT_MESSAGE_INTERRUPT 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_MESSAGE_INTERRUPT en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declaración de funciones mediante el uso de tipos de roles de función para controladores NDIS.

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

Requisitos

Requisito Valor
cliente mínimo admitido Se admite en NDIS 6.0 y versiones posteriores.
de la plataforma de destino de Windows
encabezado de ndis.h (incluya Ndis.h)
irQL Consulte la sección Comentarios.

Consulte también

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterruptDPC

miniportSynchronizeMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS

NdisMDeregisterInterruptEx

NdisMQueueDpcEx

NdisMRegisterInterruptEx

NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS

de escalado lateral de recepción (RSS) de