WDI TLV Generator/Parser Special Members
Optionale Member
Für alle TLV-Elemente mit optional untergeordneten TLV-Membern verfügt das übergeordnete Element über ein Feld mit dem Namen Optional. Innerhalb dieses Felds befindet sich für jedes optionale untergeordnete Feld mit dem Namen< child_name>_IsPresent ein boolescher Feld, das vom Parser auf TRUE festgelegt wird, wenn das untergeordnete Element vorhanden ist, andernfalls FALSE. Entsprechend erwarten die Generierungs-APIs, dass das Feld TRUE ist, wenn es im TLV-Bytestream vorhanden sein soll, und andernfalls FALSE.
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 members (Arraymember)
Wenn mehrere untergeordnete Elemente desselben Typs innerhalb desselben übergeordneten Elements (z. B. das isCollection-Attribut des Containers)> angezeigt werden, <verwenden der Parser und der Generator eine spezielle Struktur, um das Array darzustellen: ArrayOfElements. Für C++-Clients ist dies eine stark typisierte Vorlagenstruktur mit sauber Vernichtungssemantik. Für C-Clients werden explizit benannte Strukturen erstellt (z. B. ArrayOfElementsOfUINT8). Diese Strukturen werden jedoch nicht automatisch bereinigt, da C keine Destruktoren unterstützt, sodass Benutzer der C-APIs darauf achten müssen, dass sie keine Speicherverluste (oder doppelte Freie) einführen.
Es gibt zwei wichtige Felder in ArrayOfElements: ElementCount und pElements. ElementCount ist die Anzahl der Elemente innerhalb des Arrays. pElements ist ein C-Style-Array der Elemente. Die Elemente können wie in diesem Beispiel gezeigt durchlaufen werden.
for (UINT32 i = 0;
i < pConnectTaskParameters->ConnectParameters.
MulticastCipherAlgorithms.ElementCount;
i++)
{
// Safe to use pElements[i]
pConnectTaskParameters->ConnectParameters.MulticastCipherAlgorithms.
pElements[i];
}
Das dritte Feld, MemoryInternallyAllocated, wird intern vom Parser/Generator verwendet. Sie sollte vom IHV nicht geändert werden.