次の方法で共有


WDI TLV ジェネレーター/パーサーの特殊メンバー

省略可能なメンバー

省略可能な子 TLV メンバーを持つ TLV の場合、その親には Optional という名前のフィールドが 1 つあります。 そのフィールド内には、省略可能な子ごとに <child_name>_IsPresent という名前の 1 つのブール値フィールドがあり、パーサーによって、その子が存在する場合は TRUE に、存在しない場合は FALSE に設定されます。 同様に、生成 API は、TLV バイト ストリームに存在する必要がある場合はそのフィールドが TRUE、それ以外の場合は 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;
    }
}

配列メンバー

同じ型の複数の子が同じ親 (例: <container /> の isCollection 属性) 内に出現する場合、パーサーとジェネレーターでは特殊な構造体を使用して配列 ArrayOfElements を表します。 C++ クライアントの場合、これは厳密に型指定されたテンプレート構造であり、破棄セマンティクスでクリーンアップされます。 C クライアントの場合は、明示的な名前付き構造体が作成されます (例: ArrayOfElementsOfUINT8)。 ただし、C はデストラクターに対応していないため、これらの構造体は自動的にクリーンアップされないことから、C API のユーザーはメモリ リーク (またはダブルフリー) が発生しないように注意する必要があります。

ArrayOfElements には、ElementCountpElements という 2 つの重要なフィールドがあります。 ElementCount は、配列内の要素の数です。 pElements は、要素の C スタイル配列です。 この要素は、このサンプルに示すように反復処理できます。

for (UINT32 i = 0;
    i < pConnectTaskParameters->ConnectParameters.
            MulticastCipherAlgorithms.ElementCount;
    i++)
{
    // Safe to use pElements[i]
    pConnectTaskParameters->ConnectParameters.MulticastCipherAlgorithms.
        pElements[i];
}

3 番目のフィールド MemoryInternallyAllocated は、パーサー/ジェネレーターによって内部的に使用されます。 IHV によって変更されないようにしてください。