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 には、ElementCount と pElements という 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 によって変更されないようにしてください。