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;
    }
}

数组成员

当同一类型的多个子级出现在同一个父 (例如 container </>'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 不应对其进行修改。