MINIPORT_MESSAGE_INTERRUPT funzione di callback (ndis.h)
NDIS chiama la funzione MiniportMessageInterrupt quando una scheda di interfaccia di rete genera un interruzione basata su messaggi.
Sintassi
MINIPORT_MESSAGE_INTERRUPT MiniportMessageInterrupt;
BOOLEAN MiniportMessageInterrupt(
[in] NDIS_HANDLE MiniportInterruptContext,
[in] ULONG MessageId,
[out] PBOOLEAN QueueDefaultInterruptDpc,
[out] PULONG TargetProcessors
)
{...}
Parametri
[in] MiniportInterruptContext
Handle a un blocco di informazioni sul contesto di interruzione. Il driver miniport ha fornito questo handle nel parametro MiniportInterruptContext passato al driver miniport Funzione NdisMRegisterInterruptEx .
[in] MessageId
Identificatore del messaggio di interruzione segnalato dal messaggio .MSI. MessageId è un indice a un IO_INTERRUPT_MESSAGE_INFO_ENTRY struttura all'interno di un IO_INTERRUPT_MESSAGE_INFO struttura. NDIS passa un puntatore alla struttura di IO_INTERRUPT_MESSAGE_INFO associata nel membro MessageInfoTable quando il driver registra correttamente per MSI con la funzione NdisMRegisterInterruptEx .
[out] QueueDefaultInterruptDpc
Puntatore a una variabile booleana impostata dal driver miniport prima di tornare da questa chiamata. Un driver miniport imposta questo valore su TRUE per indicare che il driver richiede un DPC nella CPU predefinita (corrente). Se impostato su TRUE, NDIS ignora il valore del parametro TargetProcessors . Se impostato su FALSE, NDIS usa il valore del parametro TargetProcessors per pianificare i controller di dominio.
[out] TargetProcessors
Maschera di bit che indica i processori di destinazione per i quali NDIS deve pianificare un DPC. Questa maschera di bit rappresenta i primi 32 processori nel gruppo di processori 0. Ogni bit nella maschera di bit identifica una CPU. Se il chiamante imposta bit 0, NDIS pianifica un DPC per CPU 0. Se il chiamante imposta bit 1, NDIS pianifica un DPC per CPU 1 e così via.
Valore restituito
MiniportMessageInterrupt restituisce TRUE se la scheda di interfaccia di rete sottostante ha generato l'interruzione; in caso contrario, restituisce FALSE.
Commenti
I driver miniport che registrano gli interruzioni con segnale di messaggio (MSI) supportano la funzione NdisMRegisterInterruptEx devono fornire una funzione MiniportMessageInterrupt .
Un driver miniport deve fare il meno possibile nella sua funzione MiniportMessageInterrupt . Deve rinviare le operazioni di I/O per gli interruzioni generati dalla scheda di interfaccia di rete Funzione MiniportMessageInterruptDPC .
Quando una scheda di interfaccia di rete genera un'NIC, NDIS chiama la funzione MiniportMessageInterrupt del driver miniport .
MiniportMessageInterrupt salva le informazioni sullo stato necessarie relative all'interruzione e ai deferatori la maggior parte dell'elaborazione di I/O il più possibile all'oggetto Funzione MiniportMessageInterruptDPC .
Se il driver miniport richiede chiamate di routine posticipate (DPCS) per un messaggio specificato, il driver miniport deve disabilitare tutti gli interruzioni aggiuntivi per tale messaggio e riabilitare gli interruzioni dopo il completamento di tutti i DPC.
Il driver miniport deve impostare QueueDefaultInterruptDpc su TRUE per pianificare un DPC solo per la CPU predefinita. Il driver può eseguire questa operazione, ad esempio se:
- La scheda di interfaccia di rete ha generato l'interruzione per segnalare il completamento di un'operazione di invio o qualsiasi altra richiesta che non viene eseguita su altre CPU.
- La scheda di interfaccia di rete ha generato l'interruzione per segnalare i dati ricevuti e il driver miniport non può elaborare i pacchetti ricevuti in schede di rete separate.
- L'interruzione indica i pacchetti ricevuti e il driver miniport può elaborare i pacchetti ricevuti in schede dpc separate, ma il ridimensionamento lato ricezione (RSS) non è abilitato per il driver miniport. Per ulteriori informazioni, vedere OID_GEN_RECEIVE_SCALE_CAPABILITIES e OID_GEN_RECEIVE_SCALE_PARAMETERS.
- Il ridimensionamento lato ricezione è abilitato per il driver miniport e il driver miniport può generare messaggi diversi in ogni coda di ricezione.
Se MiniportMessageInterrupt condivide le risorse per un messaggio specificato, ad esempio i registri della scheda di interfaccia di rete o le variabili di stato, con un'altra funzione MiniportXxx che viene eseguita in una funzione IRQL inferiore, tale funzione MiniportXxx deve chiamare la funzione Funzione NdisMSynchronizeWithInterruptEx . Ciò garantisce che la funzione MiniportSynchronizeMessageInterrupt acceda alle risorse condivise in modo sincronizzato e multiprocessore.
Un driver miniport può chiamare il Funzione NdisMDeregisterInterruptEx dalla funzione MiniportInitializeEx o MiniportHaltEx per rilasciare le risorse allocate con NdisMRegisterInterruptEx. Dopo che NdisMDeregisterInterruptEx restituisce, NDIS non chiama una funzione MiniportMessageInterrupt o MiniportMessageInterruptDPC.
NDIS chiama MiniportMessageInterrupt all'istanza DIRQL dell'msi che il driver miniport registrato in una chiamata precedente a NdisMRegisterInterruptEx. Pertanto, MiniportMessageInterrupt deve chiamare il subset delle funzioni NDIS, ad esempio NdisRawXxx o NdisRead/WriteRegisterXxx , che sono sicure per chiamare in qualsiasi irQL.
Esempi
Per definire una funzione MiniportMessageInterrupt , è prima necessario specificare una dichiarazione di funzione che identifica il tipo di funzione che si sta definendo. Windows fornisce un set di tipi di funzione per i driver. La dichiarazione di una funzione usando i tipi di funzione consente l'analisi del codice per i driver, il verifica driver statico (SDV) e altri strumenti di verifica trovano errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.Ad esempio, per definire una funzione MiniportMessageInterrupt denominata "MyMessageInterrupt ", usare il tipo di MINIPORT_MESSAGE_INTERRUPT come illustrato in questo esempio di codice:
MINIPORT_MESSAGE_INTERRUPT MyMessageInterrupt;
Implementare quindi la funzione come indicato di seguito:
_Use_decl_annotations_
BOOLEAN
MyMessageInterrupt(
NDIS_HANDLE MiniportInterruptContext,
ULONG MessageId,
PBOOLEAN QueueDefaultInterruptDpc,
PULONG TargetProcessors
)
{...}
Il tipo di funzione MINIPORT_MESSAGE_INTERRUPT è definito nel file di intestazione Ndis.h. Per identificare in modo più accurato gli errori durante l'esecuzione degli strumenti di analisi del codice, assicurarsi di aggiungere l'annotazione Use_decl_annotations alla definizione della funzione. L'annotazione Use_decl_annotations garantisce che vengano usate le annotazioni applicate al tipo di funzione MINIPORT_MESSAGE_INTERRUPT nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo per i driver NDIS.
Per informazioni su Use_decl_annotations, vedere Annotazione del comportamento della funzione.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Supportato in NDIS 6.0 e versioni successive. |
Piattaforma di destinazione | Windows |
Intestazione | ndis.h (includere Ndis.h) |
IRQL | Vedere La sezione Osservazioni |
Vedi anche
IO_INTERRUPT_MESSAGE_INFO_ENTRYMiniportSynchronizeMessageInterrupt
NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS NdisMSynchronizeWithInterruptEx OID_GEN_RECEIVE_SCALE_CAPABILITIES OID_GEN_RECEIVE_SCALE_PARAMETERS