Freigeben über


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.