Поделиться через


Специальные члены генератора и парсера WDI TLV

Необязательные члены

Для всех TLV с необязательными дочерними элементами TLV родительский элемент имеет одно поле с именем Необязательный. В этом поле есть логическое поле для каждого необязательного дочернего элемента по имени <child_name>_IsPresent, которое устанавливается в значение TRUE, если дочерний элемент присутствует, и в значение FALSE в противном случае. Аналогичным образом API-интерфейсы создания ожидают, что поле должно быть TRUE, если оно должно присутствовать в потоке байтов TLV и 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 не поддерживает деструкторы, поэтому пользователи API C должны быть осторожны, чтобы избегать утечек памяти (или повторного освобождения).

В 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.