Membres spéciaux du générateur/analyseur WDI TLV
Membres facultatifs
Pour tout TLV qui a des membres TLV enfants facultatifs, le parent a un champ nommé Facultatif. Dans ce champ, il existe un champ booléen pour chaque enfant facultatif nommé <child_name>_IsPresent, qui est défini sur TRUE par l’analyseur si l’enfant est présent, et FALSE dans le cas contraire. De même, les API de génération s’attendent à ce que le champ soit TRUE s’il doit être présent dans le flux d’octetS TLV, et FALSE dans le cas contraire.
WDI_SET_FIRMWARE_CONFIGURATION_PARAMETERS fwConfig = { 0 };
NDIS_STATUS status;
status = ParseWdiSetAdapterConfiguration(
pNdisRequest->DATA.METHOD_INFORMATION.InputBufferLength -
sizeof(WDI_MESSAGE_HEADER),
(PUINT8)pNdisRequest->DATA.METHOD_INFORMATION.InformationBuffer +
sizeof(WDI_MESSAGE_HEADER),
0,
&fwConfig);
if (status == NDIS_STATUS_SUCCESS)
{
if (fwConfig.Optional.MacAddress_IsPresent)
{
// Safe to use fwConfig.MacAddress
fwConfig.MacAddress;
}
}
Membres de tableau
Lorsque plusieurs enfants du même type apparaissent dans le même parent (par exemple, <l’attribut isCollection du conteneur />), l’analyseur et le générateur utilisent une structure spéciale pour représenter le tableau : ArrayOfElements. Pour les clients C++, il s’agit d’une structure de modèle fortement typée avec propre sur la sémantique de destruction. Pour les clients C, des structures nommées explicitement sont créées (par exemple, ArrayOfElementsOfUINT8). Toutefois, ces structures ne sont pas nettoyées automatiquement, car C ne prend pas en charge les destructeurs. Les utilisateurs des API C doivent donc veiller à ne pas introduire de fuites de mémoire (ou de doubles libres).
Il existe deux champs importants dans ArrayOfElements : ElementCount et pElements. ElementCount est le nombre d’éléments dans le tableau. pElements est un tableau C-Style des éléments. Les éléments peuvent être itérés comme indiqué dans cet exemple.
for (UINT32 i = 0;
i < pConnectTaskParameters->ConnectParameters.
MulticastCipherAlgorithms.ElementCount;
i++)
{
// Safe to use pElements[i]
pConnectTaskParameters->ConnectParameters.MulticastCipherAlgorithms.
pElements[i];
}
Le troisième champ, MemoryInternallyAllocated, est utilisé en interne par l’analyseur/générateur. Il ne doit pas être modifié par l’IHV.