Disattivazione di una porta NDIS
Per disattivare le porte NDIS, un driver miniport invia un evento di disattivazione della porta Plug and Play (PnP) a NDIS. Dopo che un driver miniport attiva correttamente una porta, il driver deve disattivare la porta prima di liberare la porta. Inoltre, il driver potrebbe disattivare una porta per motivi specifici dell'applicazione. Una porta può essere riattivata dopo la disattivazione, ma non è possibile riattivare una porta se è liberata.
Per inviare un evento PnP di disattivazione della porta, i driver miniport usano il codice evento NetEventPortDeactivation PnP nella chiamata alla funzione NdisMNetPnPEvent . Per disattivare le porte, il driver miniport deve impostare i membri della struttura di NET_PNP_EVENT_NOTIFICATION che il parametro NetPnPEvent di NdisMNetPnPEvent punta a come indicato di seguito:
Portnumber
Porta di origine della notifica dell'evento. Impostare questo membro su zero perché i numeri di porta vengono forniti nel membro Buffer della struttura specificata dal membro NetPnPEvent .
NetPnPEvent
Struttura NET_PNP_EVENT che descrive l'evento di disattivazione della porta. Impostare i membri di questa struttura come indicato di seguito:
NetEvent
Codice evento che descrive l'evento. Impostare questo membro su NetEventPortDeactivation.
Buffer
Puntatore a una matrice di elementi tipizzato NDIS_PORT_NUMBER. La matrice contiene i numeri di porta di tutte le porte che il driver miniport disattiva.
BufferLength
Numero di byte specificati in Buffer . Impostare BufferLength sulle dimensioni della matrice su cui punta Buffer . Per ottenere il numero di elementi nella matrice, dividere il valore in BufferLength in base alle dimensioni del tipo di dati NDIS_PORT_NUMBER.
Altri membri
Impostare i membri rimanenti di NET_PNP_EVENT su NULL.
Un driver miniport può fornire una matrice con un elenco di porte da disattivare. Tuttavia, se la porta predefinita di una scheda miniport è la destinazione di un evento NetEventPortDeactivation PnP, la porta predefinita deve essere l'unica porta specificata nella matrice.
I driver miniport possono disattivare le porte attive in qualsiasi momento. Tuttavia, prima che un driver miniport disattiva una porta, deve assicurarsi che non siano presenti indicazioni di stato in sospeso o ricevano indicazioni associate a tale porta. Dopo che il driver miniport invia l'evento PnP di disattivazione della porta, non deve avviare alcun stato o ricevere indicazioni associate alle porte disattivate.
Un driver miniport può anche riattivare una porta. Per altre informazioni sull'attivazione delle porte NDIS, vedere Attivazione delle porte NDIS.
Quando un driver miniport disattiva le porte, NDIS notifica a tutti i driver di protocollo associati al driver miniport con l'evento NetEventPortDeactivation PnP. Questo evento PnP elenca le porte che sono state modificate nello stato allocato e non includono porte già disattivate. Per altre informazioni sulla gestione degli eventi di disattivazione delle porte in un driver di protocollo, vedere Gestione dell'evento PnP di disattivazione della porta.
Prima che un driver miniport alloca una porta NDIS, il driver deve chiamare la funzione NdisMSetMiniportAttributes per impostare gli attributi di registrazione nella struttura NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES . I driver Miniport possono controllare l'attivazione della porta predefinita impostando il flag di attributo NDIS_MINIPORT_CONTROLS_DEFAULT_PORT quando chiamano NdisMSetMiniportAttributes. Se un driver miniport presuppone la responsabilità di attivare la porta predefinita e il driver miniport ha attivato la porta predefinita, deve disattivare la porta predefinita prima di restituire dalla funzione MiniportHaltEx .
Tutte le porte specificate dalla matrice di elementi NDIS_PORT_NUMBER devono trovarsi nello stato attivato. Un driver miniport non deve tentare di disattivare una porta già disattivata.
Se NDIS non riesce a disattivare le porte nella matrice di porte, nessuno delle porte nella matrice di porte cambierà lo stato. Se la disattivazione ha esito negativo perché alcune delle porte specificate non esistono, la funzione NdisMNetPnPEvent restituisce il valore restituito NDIS_STATUS_INVALID_PORT. Se la disattivazione ha esito negativo perché alcune porte non sono nello stato attivato, NdisMNetPnPEvent restituisce il valore restituito NDIS_STATUS_INVALID_PORT_STATE.
Fino a quando la chiamata a NdisMNetPnPEvent restituisce, una porta non viene disattivata e i driver miniport devono essere in grado di gestire le richieste OID e inviare richieste associate a tale porta.
Quando un driver miniport disattiva la porta predefinita, NDIS chiude tutte le associazioni tra i driver del protocollo overlying e l'adattatore miniport. Se un driver miniport tenta di disattivare la porta predefinita e la porta predefinita è già disattivata, NdisMNetPnPEvent ha esito negativo e restituisce il valore restituito NDIS_STATUS_INVALID_PORT_STATE. Se un driver miniport tenta di disattivare la porta predefinita e la porta predefinita non è l'unica porta specificata nella matrice di elementi NDIS_PORT_NUMBER, NdisMNetPnPEvent ha esito negativo e restituisce il valore restituito NDIS_STATUS_INVALID_PORT. Se un driver miniport imposta il membro buffer su NULL o BufferLength su zero, NDIS non riesce la chiamata NdisMNetPnPEvent e restituisce il valore restituito NDIS_STATUS_INVALID_PARAMETER.
Dopo la disattivazione di una porta, la porta si trova nello stato allocato. I driver miniport non possono indicare i dati ricevuti o lo stato per la porta nello stato allocato.