Condividi tramite


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.

Nota È necessario dichiarare questa funzione usando il tipo di MINIPORT_ISR . Per altre informazioni, vedere la sezione Esempi seguenti.
 

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.

Nota I driver NDIS 6.20 e versioni successive non devono usare questo parametro per pianificare i controller di dominio. È invece necessario impostare questo parametro su zero e usare la funzione NdisMQueueDpcEx per pianificare i controller di dominio.
 

Valore restituito

MiniportInterrupt restituisce uno dei valori seguenti:

Codice restituito Descrizione
VERO

MiniportInterrupt ha determinato che la scheda di interfaccia di rete sottostante ha generato l'interruzione.

FALSE

MiniportInterrupt ha determinato che la scheda di interfaccia di rete sottostante non ha generato l'interruzione.

 
Nota NDIS accoderà i controller di dominio in base ai valori specificati nei parametri QueueDefaultInterruptDpc e TargetProcessors indipendentemente dal valore restituito da MiniportInterrupt . Tuttavia, MiniportInterrupt deve comunque restituire il valore corretto.
 

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.
Se un driver miniport elabora pacchetti ricevuti in controller di dominio separati, il driver imposta il parametro QueueDefaultInterruptDpc su FALSE. Il driver miniport deve impostare il bit TargetProcessors per la CPU associata a ogni coda di ricezione non interrotta. NDIS pianifica un DPC in ognuna delle CPU indicate.
Nota NDIS accoderà i controller di dominio in base ai valori specificati nei parametri QueueDefaultInterruptDpc e TargetProcessors indipendentemente dal valore restituito da MiniportInterrupt . Tuttavia, MiniportInterrupt deve comunque restituire il valore corretto.
 
Se MiniportInterrupt condivide le risorse, ad esempio i registri della scheda di interfaccia di interfaccia di rete o le variabili di stato, con un'altra funzione MiniportXxx eseguita in una funzione IRQL inferiore, tale funzione MiniportXxx deve chiamare la funzione Funzione NdisMSynchronizeWithInterruptEx . Ciò garantisce che la funzione MiniportSynchronizeInterrupt del driver 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 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

Vedi anche

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)