Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Modello di allocazione del chiamato
Un punto di ingresso all'interno del driver riceve un messaggio o un'indicazione che contiene TLV. Dopo che il codice estrae l'ID messaggio e determina se si tratta di un ID che vuole gestire, chiama la routine di analisi generica e passa il BLOB TLV (dopo aver superato il WDI_MESSAGE_HEADER) per analizzare i valori TLV in una struttura C.
ndisStatus = Parse(
cbBufferLength,
pvBuffer,
messageId,
&Context,
&pParsed);
Dopo aver verificato la presenza di errori, il codice può eseguire il cast del buffer di output (pParsed) in un tipo concreto, ad esempio nell'esempio seguente.
((WDI_INDICATION_BSS_ENTRY_LIST_PARAMETERS*)pParsed)
Una volta che il chiamante ha terminato di utilizzare i dati analizzati, deve restituire le risorse di memoria al parser. Il parser deve conoscere l'ID del messaggio originale usato per allocare in modo da liberare i dati corretti.
FreeParsed(messageId, pParsed);
pParsed = NULL;
Modello di allocazione del chiamante
In questo modello il chiamante ha già determinato il TLV specifico corretto da analizzare ed è possibile usare uno stack locale per evitare allocazioni nell'heap. Il chiamante crea il locale e chiama una routine di parsing specifica. L'API non richiede l'ID messaggio e il parametro è fortemente tipizzato con un livello inferiore di riferimento indiretto.
WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS adapterCapabilitiesParsed;
ndisStatus = ParseWdiGetAdapterCapabilities(
cbBufferLength,
pvBuffer,
&Context
&adapterCapabilitiesParsed);
Al termine dell'utilizzo della struttura da parte del chiamante, il chiamante deve fornire al parser la possibilità di pulire qualsiasi allocazione eseguita durante l'analisi e cancellare la struttura in modo che sia pronta per essere riutilizzata. Il parametro è fortemente tipizzato, pertanto la funzione chiamata non richiede parametri aggiuntivi.
CleanupParsedWdiGetAdapterCapabilities(&adapterCapabilitiesParsed);
Dopo aver chiamato l'API CleanupParse, tutti i dati nella struttura non sono validi.
Alcuni messaggi non dispongono di dati associati. Per completezza dell'API, vengono forniti metodi Parse denominati in modo appropriato. Questi metodi convalidano che il flusso di byte sia vuoto. I typedef vengono forniti per il tipo di parametro, ma i chiamanti possono anche passare NULL per il parametro out se usano il modello di allocazione del chiamante. In tutti i casi, il parser evita le allocazioni restituendo una struttura di analisi vuota costante. I chiamanti non devono mai scrivere in questa struttura vuota restituita ( di conseguenza l'unico campo è denominato _Reserved). Questi messaggi sono documentati come "Nessun dato aggiuntivo. I dati nell'intestazione sono sufficienti".
Direzione del messaggio
La maggior parte dei messaggi ha un formato diverso per M1 rispetto a M0, M3 o M4. Per soddisfare questo problema, tali messaggi hanno analisi diverse e generano API. Per i messaggi M1, le API seguono la convenzione di denominazione Parse<MessageName>ToIhv o Generate<MessageName>ToIhv. Per i messaggi M0, M3 o M4, le API seguono la convenzione di denominazione parse<MessageName>FromIhv o Generate<MessageName>FromIhv. Tuttavia, per semplificare il codice nel miniport IHV, le definizioni vengono aggiunte all'alias Parse<MessageName> a Parse<MessageName>ToIhv e Generate<MessageName> per generare<MessageName>FromIhv. Il codice IHV deve essere a conoscenza di questo aliasing solo se deve analizzare il proprio M3 o generare un M1.
Codici di errore
Il generatore di parser TLV può restituire diversi codici di NDIS_STATUS. Per ulteriori informazioni, consultare i registri di traccia WPP. I log devono sempre indicare la causa radice. Di seguito è riportato un elenco dei codici di errore più comuni e dei relativi significato.
NDIS_STATUS_INVALID_DATA |
Durante l'analisi, indica che una TLV a dimensione fissa è di dimensioni non corrette. Per gli elenchi, ciò significa che la dimensione complessiva non è nemmeno un multiplo delle dimensioni dei singoli elementi o ci sono più elementi di quanto dovrebbe essere presente. Ciò può anche significare che un elenco contiene 0 elementi, quando è necessario 1 o più. Se si desiderano 0 elementi, Optional_IsPresent deve essere impostato su false (l'intestazione TLV non deve trovarsi nel flusso di byte). |
NDIS_STATUS_BUFFER_OVERFLOW |
Durante la generazione, ciò indica che a causa del numero di elementi in una matrice (elenco), supera i 2 byte campo Length all'interno dell'intestazione TLV. È consigliabile ridurre il numero di elementi. Ciò può verificarsi anche quando un TLV esterno ha troppi TLV interni (o di dimensioni troppo grandi), facendo nuovamente overflow nel campo di lunghezza nell'intestazione. Durante l'analisi, questo indica che il campo di lunghezza di un'intestazione TLV è più grande del TLV esterno o del flusso di byte. |
NDIS_STATUS_FILE_NOT_FOUND (File non trovato) |
Durante l'analisi, indica che un TLV obbligatorio non è presente nel flusso di byte. Si tratta in genere di un bug con il generatore del flusso di byte. |
NDIS_STATUS_RESOURCES |
Quando si genera, ciò indica che l'allocatore ha fallito. |
NDIS_STATUS_UNSUPPORTED_REVISION (Revisione non supportata) |
Durante l'analisi o la generazione, il parametro Context è NULL oppure il PeerVersion è minore di WDI_VERSION_MIN_SUPPORTED. |