Membros especiais do gerador/analisador TLV do WDI
Membros opcionais
Para qualquer TLV que tenha membros TLV filho opcionais, o pai tem um campo chamado Opcional. Dentro desse campo, há um campo booliano para cada filho opcional chamado <child_name>_IsPresent, que é definido como TRUE pelo analisador se o filho estiver presente e FALSE caso contrário. Da mesma forma, as APIs de geração esperam que o campo seja TRUE se ele deve estar presente no fluxo de bytes TLV e, caso contrário, 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;
}
}
Membros de matriz
Quando vários filhos do mesmo tipo aparecem no mesmo pai (por exemplo, <o atributo isCollection do contêiner />), o analisador e o gerador usam uma estrutura especial para representar a matriz: ArrayOfElements. Para clientes C++, essa é uma estrutura de modelo fortemente tipada com limpo em semântica de destruição. Para clientes C, estruturas nomeadas explicitamente são criadas (por exemplo, ArrayOfElementsOfUINT8). No entanto, essas estruturas não são limpas automaticamente porque c não dá suporte a destruidores, portanto, os usuários das APIs C devem ter cuidado para não introduzir vazamentos de memória (ou double-frees).
Há dois campos importantes em ArrayOfElements: ElementCount e pElements. ElementCount é a contagem de elementos dentro da matriz. pElements é uma matriz C-Style dos elementos. Os elementos podem ser iterados conforme mostrado neste exemplo.
for (UINT32 i = 0;
i < pConnectTaskParameters->ConnectParameters.
MulticastCipherAlgorithms.ElementCount;
i++)
{
// Safe to use pElements[i]
pConnectTaskParameters->ConnectParameters.MulticastCipherAlgorithms.
pElements[i];
}
O terceiro campo, MemoryInternallyAllocated, é usado internamente pelo analisador/gerador. Ele não deve ser modificado pelo IHV.