WDI TLV 版本控制

为了保持向后兼容性,WDI 和微型端口都使用 TLV 流作为版本控制边界。 TLV 字节流的生成者必须始终生成向后兼容的 TLV,并且不包含任何新添加的字段。 这是通过将 PeerVersion 添加到 Context 参数来实现的。 此字段应由调用方初始化在初始化期间收到的 WdiVersion

下面是 上下文 参数的类型定义,该参数将传递到每个分析和生成 API 中。

typedef struct _TLV_CONTEXT
{
    ULONG_PTR   AllocationContext;
    ULONG       PeerVersion;
} TLV_CONTEXT, *PTLV_CONTEXT;
typedef const TLV_CONTEXT * PCTLV_CONTEXT;

AllocationContext 未由 Parse 和 Generate API 修改,并继续传递到微型端口提供的运算符 new 回调。 有关详细信息,请参阅 WDI TLV 生成器/分析器内存接口

如果基于 WDI 的单一二进制驱动程序针对较旧版本的 WDI 运行,微型端口中的生成器将使用 PeerVersion 生成较旧的字节流。 相反,分析程序使用基于 PeerVersion 的旧字节流,并将其转换为新的数据结构。

如果微型端口驱动程序不使用 TLV 分析程序生成器库,而是编写自己的 TLV 分析器和生成器,并且希望让单个二进制文件仅运行较旧的操作系统版本 (,因此 WDI) 的旧版本,则它们还必须包含此功能。 其分析程序必须接受旧 WDI 生成的 TLV 语法,并且其生成器必须仅根据旧语法生成 TLV。

XML 已得到扩充,以支持此版本控制,并具有 containerRefs 上允许的两个属性: versionAddedversionRemoved。 这是驱动分析器和生成器根据对等版本调整字节流的内容。

注意 分析器和生成器假定它们始终与WDI_VERSION_LATEST链接。 调用 NdisMRegisterWdiMiniportDriver 时,微型端口应始终传递 NDIS_MINIPORT_DRIVER_WDI_CHARACTERISTICS::WdiVersion 的WDI_VERSION_LATEST,而不是使用特定版本(如 WDI_VERSION_1_0),因为它们将过时并导致 TLV 分析器生成器出现问题,因为另一端可能会发送意外的字节流。