WDI TLV generator/parser bijzondere leden
Optionele leden
Voor elke TLV met optionele kind-TLV-leden heeft de bovenliggende TLV één veld genaamd Optioneel. In dat veld is er één Booleaanse waarde voor elk optioneel onderliggend item met de naam <child_name>_IsPresent, dat is ingesteld op TRUE door de parser als het onderliggende element aanwezig is en anders FALSE. Op dezelfde manier verwachten de generatie-API's dat het veld WAAR is als het aanwezig moet zijn in de TLV-bytestroom en anders ONWAAR.
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;
}
}
Array-elementen
Wanneer meerdere onderliggende elementen van hetzelfde type binnen hetzelfde bovenliggende element voorkomen (bijvoorbeeld <container />'s isCollectie attribuut), gebruiken de parser en de generator een speciale structuur om de array weer te geven: ArrayOfElements. Voor C++-clients is dit een sterk getypeerde sjabloonstructuur met opschoning op vernietigingssemantiek. Voor C-clients worden expliciet benoemde structuren gemaakt (bijvoorbeeld ArrayOfElementsOfUINT8). Deze structuren worden echter niet automatisch opgeschoond omdat C geen ondersteuning biedt voor destructors, dus gebruikers van de C API's moeten voorzichtig zijn met het niet introduceren van geheugenlekken (of dubbele vrije waarden).
Er zijn twee belangrijke velden in ArrayOfElements: ElementCount en pElements. ElementCount is het aantal elementen in de matrix. pElements is een C-stijlmatrix van de elementen. De elementen kunnen worden doorlopen zoals getoond in dit voorbeeld.
for (UINT32 i = 0;
i < pConnectTaskParameters->ConnectParameters.
MulticastCipherAlgorithms.ElementCount;
i++)
{
// Safe to use pElements[i]
pConnectTaskParameters->ConnectParameters.MulticastCipherAlgorithms.
pElements[i];
}
Het derde veld, MemoryInternallyAllocated, wordt intern gebruikt door de parser/generator. Het mag niet worden gewijzigd door de IHV.