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 中有兩個重要欄位: ElementCount 和 pElements。 ElementCount 是陣列內的元素計數。 pElements 是專案的 C 樣式陣列。 元素可以逐一查看,如此範例所示。
for (UINT32 i = 0;
i < pConnectTaskParameters->ConnectParameters.
MulticastCipherAlgorithms.ElementCount;
i++)
{
// Safe to use pElements[i]
pConnectTaskParameters->ConnectParameters.MulticastCipherAlgorithms.
pElements[i];
}
剖析器/產生器會在內部使用 MemoryInternallyAllocated第三個欄位。 IHV 不應修改它。