MINIPORT_ISR funzione di callback (ndis.h)
NDIS chiama la funzione MiniportInterrupt quando una scheda di interfaccia di rete o un altro dispositivo che condivide l'interruzione con la scheda di interfaccia di rete, genera un interruzione.
Sintassi
MINIPORT_ISR MiniportIsr;
BOOLEAN MiniportIsr(
[in] NDIS_HANDLE MiniportInterruptContext,
[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 .
[out] QueueDefaultInterruptDpc
Puntatore a una variabile BOOLEAN impostata dal driver miniport prima che venga restituita da questa chiamata. Un driver miniport imposta questo valore su TRUE per indicare che il driver richiede un DPC nella CPU predefinita (corrente). Se questo valore è 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. Se QueueDefaultInterruptDpc è TRUE, NDIS pianifica un DPC indipendentemente dal valore restituito da MiniportInterrupt.
[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. Se QueueDefaultInterruptDpc è impostato su FALSE e TargetProcessor è impostato su zero, NDIS non pianifica alcun controller di dominio. In caso contrario, NDIS pianifica i controller di dominio indipendentemente dal valore restituito da MiniportInterrupt.
Valore restituito
MiniportInterrupt restituisce uno dei valori seguenti:
Codice restituito | Descrizione |
---|---|
|
MiniportInterrupt ha determinato che la scheda di interfaccia di rete sottostante ha generato l'interruzione. |
|
MiniportInterrupt ha determinato che la scheda di interfaccia di rete sottostante non ha generato l'interruzione. |
Commenti
I driver Miniport che registrano un interruzione con la funzione NdisMRegisterInterruptEx devono fornire una funzione MiniportInterrupt .
Un driver miniport deve fare il meno possibile nella sua funzione MiniportInterrupt . Deve rinviare le operazioni di I/O per gli interruzioni generati dalla scheda di interfaccia di rete alla funzione MiniportInterruptDPC .
Quando si verifica un interruzione sulla riga di interruzione di una scheda di interfaccia di rete, NDIS chiama la funzione MiniportInterrupt del driver miniport .
Tutte le schede di interfaccia di rete possono condividere interruzioni basate su linea con altri dispositivi nel bus di I/O. Se la scheda di interfaccia di rete non ha generato l'interruzione, MiniportInterrupt deve restituire FALSE immediatamente in modo che il sistema possa chiamare il driver del dispositivo che ha generato l'interruzione. Se il parametro QueueDefaultInterruptDpc è impostato su FALSE e il parametro TargetProcessors è impostato su zero, NDIS non pianifica alcun controller di dominio. In caso contrario, NDIS pianifica i controller di dominio indipendentemente dal valore di turnoMiniportInterruptda MiniportInterrupt.
Se l'interruzione è per la scheda di interfaccia di rete, MiniportInterrupt ignora l'interruzione nella scheda di interfaccia di rete, salva qualsiasi stato necessario per l'interruzione e defera la maggior parte dell'elaborazione di I/O possibile alla funzione MiniportInterruptDPC .
Se la scheda di interfaccia di rete sottostante ha generato l'interruzione specificata e il driver miniport richiederà chiamate di routine posticipate (DPCS), il driver miniport deve disabilitare tutti gli interruzioni aggiuntivi dalla scheda di interfaccia di rete 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 potrebbe 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.
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 MiniportInterrupt o MiniportInterruptDPC.
NDIS chiama MiniportInterrupt alla DIRQL dell'interruzione registrata nel driver miniport registrato in una chiamata precedente a NdisMRegisterInterruptEx. Pertanto, MiniportInterrupt 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 MiniportInterrupt , è prima necessario fornire 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 MiniportInterrupt denominata "MyInterrupt ", usare il tipo di MINIPORT_ISR come illustrato nell'esempio di codice seguente:
MINIPORT_ISR MyInterrupt;
Implementare quindi la funzione come indicato di seguito:
_Use_decl_annotations_
BOOLEAN
MyInterrupt(
NDIS_HANDLE MiniportInterruptContext,
PBOOLEAN QueueDefaultInterruptDpc,
PULONG TargetProcessors
)
{...}
Il tipo di funzione MINIPORT_ISR è 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_ISR 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 |