共用方式為


WDI TLV 產生器/剖析器特殊成員

選擇性成員

對於任何具有選擇性子 TLV 成員的 TLV,父系有一個名為 Optional的欄位。 在該欄位中,每個名為< child_name >選擇性子系都有一個布林值欄位_IsPresent,如果子系存在,剖析器就會設定為 TRUE,否則為 FALSE。 同樣地,如果欄位應該出現在 TLV 位元組資料流程中,則產生 API 預期欄位為 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;
    }
}

陣列成員

例如,當相同類型的多個子系出現在相同的父系 (時, < 容器 / > 's isCollection 屬性) ,剖析器和產生器會使用特殊結構來表示陣列:ArrayOfElements。 對於 C++ 用戶端,這是強型別範本結構,可清除解構語意。 針對 C 用戶端,會 (建立明確命名的結構,例如 ArrayOfElementsOfUINT8) 。 不過,這些結構不會自動清除,因為 C 不支援解構函式,因此 C API 的使用者必須小心不要在記憶體流失 (或雙釋放) 。

ArrayOfElements 中有兩個重要欄位: ElementCountpElementsElementCount 是陣列內的元素計數。 pElements 是專案的 C 樣式陣列。 元素可以逐一查看,如此範例所示。

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

剖析器/產生器會在內部使用 MemoryInternallyAllocated第三個欄位。 IHV 不應修改它。