Compartir a través de


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

Un controlador de minipuerto debe proporcionar un controlador MiniportMessageInterruptDPC si el controlador llama a la función NdisMRegisterInterruptEx para registrar una interrupción.

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

Sintaxis

MINIPORT_MESSAGE_INTERRUPT_DPC MiniportMessageInterruptDpc;

void MiniportMessageInterruptDpc(
  [in] NDIS_HANDLE MiniportInterruptContext,
  [in] ULONG MessageId,
  [in] PVOID MiniportDpcContext,
  [in] PVOID ReceiveThrottleParameters,
       PVOID NdisReserved2 PULONG NdisReserved1,
  [in] PULONG NdisReserved2
)
{...}

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 minipuerto 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 IO_INTERRUPT_MESSAGE_INFO estructura. NDIS pasa un puntero a la estructura de IO_INTERRUPT_MESSAGE_INFO asociada en el miembro MessageInfoTable cuando el controlador se registra correctamente para MSI con la función NdisMRegisterInterruptEx .

[in] MiniportDpcContext

Puntero a un área de contexto que el controlador de miniporte proporcionó cuando llamó a la función NdisMQueueDpcEx o NdisMQueueDpc . Si NDIS llamó a MiniportMessageInterruptDPC porque el controlador de minipuerto devolvió una máscara de bits en el parámetro TargetProcessors del La función MiniportMessageInterrupt y, a continuación, MiniportDpcContext es NULL.

[in] ReceiveThrottleParameters

Puntero a un NDIS_RECEIVE_THROTTLE_PARAMETERS estructura especifica el número máximo de estructuras de NET_BUFFER_LIST que un controlador de minipuerto debe indicar en un DPC.

Nota En NDIS 6.1 y versiones anteriores, este parámetro se denomina NdisReserved1, su tipo de datos es PULONG y está reservado para NDIS.
 

NdisReserved1

Reservado para NDIS.

[in] NdisReserved2

Reservado para NDIS.

Nota En NDIS 6.1 y versiones anteriores, el tipo de datos de este parámetro es PULONG.
 

Valor devuelto

None

Observaciones

Los controladores de miniport que registran una interrupción señalada por mensaje con la función NdisMRegisterInterruptEx deben proporcionar una función MiniportMessageInterruptDPC .

NDIS llama a MiniportMessageInterruptDPC para completar el procesamiento diferido de una interrupción. El controlador de minipuerto puede llamar a la función NdisMQueueDpcEx o NdisMQueueDpc para solicitar llamadas de procedimiento diferidas adicionales (DPC) para otros procesadores.

Los controladores de minipuerto determinan el origen de cada interrupción y realizan las acciones adecuadas. Por ejemplo, si una interrupción indica la finalización de una operación de transmisión, el controlador de miniporta completa una solicitud de envío pendiente. Si la causa de la interrupción es un cambio en el estado del vínculo, el controlador de minipuerto indica el nuevo estado del vínculo a NDIS. Si hay paquetes de recepción pendientes, el controlador de minipuerto indica los paquetes a NDIS.

Un controlador de minipuerto que admite el escalado lateral de recepción (RSS) y tiene habilitada la característica, examina sus colas de recepción en MiniportMessageInterruptDPC. La NIC podría haber puesto en cola paquetes recibidos en colas independientes en función de los valores hash, si la NIC proporciona estas funcionalidades. De lo contrario, el controlador de minipuerto puede ordenar los paquetes en colas independientes en MiniportMessageInterruptDPC.

MiniportMessageInterruptDPC llama a Función NdisMIndicateReceiveNetBufferLists para indicar los paquetes en el procesador actual. MiniportMessageInterruptDPC puede determinar el procesamiento necesario para otras CPU y solicitar NDIS para programar DPC en CPU en las que un DPC no está pendiente.

Si el DPC actual se ejecuta en la misma CPU que . La función MiniportMessageInterrupt , el controlador de minipuerto debe indicar todos los paquetes que no se pudieron asignar a una CPU. Si este DPC es el último DPC programado y no solicitará DPC adicionales, MiniportMessageInterruptDPC debe volver a habilitar las interrupciones en la NIC, para el mensaje especificado, antes de que devuelva.

Antes de que NDIS llame a MiniportMessageInterruptDPC, las interrupciones del mensaje especificado en la NIC se han deshabilitado normalmente en . Función MiniportMessageInterrupt . Antes de que devuelva el control, MiniportMessageInterruptDPC puede volver a habilitar interrupciones. Si el controlador de minipuerto pone en cola dpCs adicionales mientras se deshabilitan las interrupciones, el controlador debe habilitar las interrupciones después de que se ejecute la última DPC.

Nota Para mejorar el rendimiento, los controladores de minipuerto solo deben deshabilitar las interrupciones para mensajes específicos. No deben deshabilitar todas las interrupciones señaladas por mensajes.
 
Los controladores de minipuerto deben limitar el número de búferes de recepción que indican mientras procesan un lote DPC de interrupción para completarse dentro del límite de tiempo necesario. Un lote DPC de interrupción es la colección de todos los DPC que se ejecutan después del ISR y antes de que se vuelvan a habilitar las interrupciones.

Un controlador de miniport puede llamar a NdisMDeregisterInterruptEx desde su función MiniportInitializeEx o MiniportHaltEx para liberar los recursos asignados con NdisMRegisterInterruptEx. Después de que se devuelva NdisMDeregisterInterruptEx , NDIS no llama a la función MiniportMessageInterrupt o MiniportMessageInterruptDPC del controlador de miniport.

NDIS llama a MiniportMessageInterruptDPC en IRQL = DISPATCH_LEVEL.

Ejemplos

Para definir una función MiniportMessageInterruptDPC , 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 MiniportMessageInterruptDPC denominada "MyMessageInterruptDPC", use el tipo MINIPORT_MESSAGE_INTERRUPT_DPC tal como se muestra en este ejemplo de código:

MINIPORT_MESSAGE_INTERRUPT_DPC MyMessageInterruptDPC;

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

_Use_decl_annotations_
VOID
 MyMessageInterruptDPC(
    NDIS_HANDLE  MiniportInterruptContext,
    ULONG  MessageId,
    PVOID  MiniportDpcContext,
    PVOID  ReceiveThrottleParameters,
    PVOID  NdisReserved2
    )
  {...}

El tipo de función MINIPORT_MESSAGE_INTERRUPT_DPC 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_DPC en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, consulte 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, consulte Anotación del comportamiento de la función.

Requisitos

Requisito Value
Cliente mínimo compatible Se admite en NDIS 6.0 y versiones posteriores.
Plataforma de destino Windows
Encabezado ndis.h (incluya Ndis.h)
IRQL DISPATCH_LEVEL

Consulte también

IO_INTERRUPT_MESSAGE_INFO

IO_INTERRUPT_MESSAGE_INFO_ENTRY

MiniportHaltEx

MiniportInitializeEx

MiniportMessageInterrupt

NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NDIS_RECEIVE_THROTTLE_PARAMETERS

NET_BUFFER_LIST

NdisMDeregisterInterruptEx

NdisMIndicateReceiveNetBufferLists

NdisMQueueDpc

NdisMQueueDpcEx

NdisMRegisterInterruptEx

Receive Side Scaling (RSS)