WDI TLV 生成器/分析器特殊成员

可选成员

对于具有可选子 TLV 成员的任何 TLV,父节点有一个名为 " 可选" 的字段。 在该字段中,名< 为 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;
    }
}

数组成员

如果同一类型的多个子级出现在同一父 ((例如, < 容器/ > 的 isCollection 特性) ),则分析器和生成器将使用特殊的结构来表示数组: ArrayOfElements。 对于 c + + 客户端,这是一个强类型的模板结构,其中包含对析构语义的清理。 对于 C 客户端,会创建显式命名的结构 (例如 ArrayOfElementsOfUINT8) 。 但是,这些结构不会自动清理,因为 C 不支持析构函数,因此,C Api 的用户必须小心地不要引入内存泄漏 (或加倍) 。

ArrayOfElements 中有两个重要字段: elementcount 多于pElementsElementcount 多于 是数组中元素的计数。 pElements 是元素的 C 样式数组。 可以循环访问元素,如本示例中所示。

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

第三个字段 MemoryInternallyAllocated由分析器/生成器在内部使用。 它不应由 IHV 修改。