Vue d’ensemble de l’interface de l’analyseur WDI TLV
Modèle d’allocation appelé
Un point d’entrée dans le pilote reçoit un message ou une indication qui contient des TTLVs. Une fois que le code a extrait l’ID de message et déterminé s’il s’agit d’un ID qu’il souhaite gérer, il appelle la routine d’analyse générique et transmet l’objet blob TLV (après avoir dépassé le WDI_MESSAGE_HEADER) pour analyser les TLV dans une structure C.
ndisStatus = Parse(
cbBufferLength,
pvBuffer,
messageId,
&Context,
&pParsed);
Après avoir vérifié la recherche d’erreurs dans le retour, le code peut transformer la mémoire tampon de sortie (pParsed) en un type concret, comme dans l’exemple ci-dessous.
((WDI_INDICATION_BSS_ENTRY_LIST_PARAMETERS*)pParsed)
Une fois que l’appelant a terminé avec les données analysées, l’appelant doit retourner la mémoire à l’analyseur. L’analyseur doit connaître l’ID de message d’origine utilisé pour allouer afin de libérer les données correctes.
FreeParsed(messageId, pParsed);
pParsed = NULL;
Modèle d’allocation de l’appelant
Dans ce modèle, l’appelant a déjà déterminé le TLV spécifique approprié à analyser et utilise peut-être une pile locale pour éviter les allocations sur le tas. L’appelant crée le local et appelle une routine d’analyse spécifique. L’API n’a pas besoin de l’ID de message, et le paramètre est fortement typé avec un niveau d’indirection de moins.
WDI_GET_ADAPTER_CAPABILITIES_PARAMETERS adapterCapabilitiesParsed;
ndisStatus = ParseWdiGetAdapterCapabilities(
cbBufferLength,
pvBuffer,
&Context
&adapterCapabilitiesParsed);
Une fois que l’appelant a terminé d’utiliser la structure, l’appelant doit donner à l’analyseur la possibilité de propre toute allocation qu’il a effectuée pendant l’analyse et de réinitialiser la structure afin qu’elle soit prête à être réutilisée. Le paramètre étant fortement typé, le appelé n’a pas besoin de paramètres supplémentaires.
CleanupParsedWdiGetAdapterCapabilities(&adapterCapabilitiesParsed);
Après avoir appelé l’API CleanupParse, toutes les données de la structure ne sont pas valides.
Certains messages n’ont pas de données associées. Pour l’exhaustivité de l’API, des méthodes Parse correctement nommées sont fournies. Ces méthodes valident que le flux d’octets est vide. Les typedefs sont fournis pour le type de paramètre, mais les appelants peuvent également passer la valeur NULL pour le paramètre out s’ils utilisent le modèle d’allocation de l’appelant. Dans tous les cas, l’analyseur évite les allocations en retournant une structure d’analyse vide constante. Les appelants ne doivent jamais écrire dans cette structure vide retournée (par conséquent, le seul champ est nommé _Reserved). Ces messages sont documentés sous la forme « Aucune donnée supplémentaire. Les données de l’en-tête sont suffisantes ».
Sens du message
La plupart des messages ont un format différent pour leur M1 et leur M0, M3 ou M4. Pour ce faire, ces messages ont des API d’analyse et de génération différentes. Pour les messages M1, les API suivent la convention de nommage de Parse<MessageName>ToIhv ou Generate<MessageName>ToIhv. Pour les messages M0, M3 ou M4, les API suivent la convention de nommage de l’option Analyser<messageName>FromIhv ou Générer<messageName>FromIhv. Toutefois, pour simplifier le code dans le miniport IHV, les définitions sont ajoutées à l’alias Parse<MessageName> à Analyser<MessageName>ToIhv et Générer<messageName> pour générer<messageName>FromIhv. Le code IHV doit uniquement être conscient de cet alias s’il doit analyser son propre M3 ou générer un M1.
Codes d’erreur
Le générateur d’analyseurS TLV peut retourner plusieurs codes NDIS_STATUS différents. Pour plus d’informations, consultez les journaux de suivi WPP. Les journaux doivent toujours indiquer la cause racine. Voici une liste des codes d’erreur les plus courants et de ce qu’ils signifient.
NDIS_STATUS_INVALID_DATA |
Lors de l’analyse, cela indique qu’un TLV de taille fixe est de la taille incorrecte. Pour les listes, cela signifie que la taille globale n’est pas un multiple pair de la taille d’élément individuel, ou qu’il y a plus d’éléments qu’il ne devrait y en avoir. Cela peut également signifier qu’une liste contient 0 éléments, lorsque 1 ou plus est requis. Si 0 éléments est souhaité, Optional_IsPresent doit avoir la valeur false (l’en-tête TLV ne doit pas se trouver dans le flux d’octets). |
NDIS_STATUS_BUFFER_OVERFLOW |
Lors de la génération, cela indique qu’en raison du nombre d’éléments dans un tableau (liste), il dépasse le champ Longueur de 2 octets dans l’en-tête TLV. Vous devez réduire le nombre d’éléments. Cela peut également se produire lorsqu’un TLV externe a un trop grand nombre (ou trop grand) de TLV internes, débordant à nouveau le champ Longueur de 2 octets de l’en-tête. Lors de l’analyse, cela indique que le champ Length d’un en-tête TLV est plus grand que le TLV externe ou le flux d’octets. |
NDIS_STATUS_FILE_NOT_FOUND |
Lors de l’analyse, cela indique qu’une TLV requise n’est pas présente dans le flux d’octets. Il s’agit généralement d’un bogue avec le générateur du flux d’octets. |
NDIS_STATUS_RESOURCES |
Lors de la génération, cela indique que l’allocateur a échoué. |
NDIS_STATUS_UNSUPPORTED_REVISION |
Lors de l’analyse ou de la génération, le paramètre Context a la valeur NULL ou PeerVersion est inférieur à WDI_VERSION_MIN_SUPPORTED. |