windows蓝牙驱动开发-SDP结构和生成 SDP 记录

发布于:2025-02-13 ⋅ 阅读:(135) ⋅ 点赞:(0)
将 SDP 记录转换为树状结构

服务发现协议 (SDP) 记录在复杂的二进制流中编码。 为了使配置文件驱动程序能够更轻松地分析 SDP 记录,蓝牙驱动程序堆栈提供了许多函数,配置文件驱动程序可以使用这些函数将 SDP 记录流转换为分层树结构,然后再返回。

客户端配置文件驱动程序可以使用 SdpConvertStreamToTree 函数将 SDP 记录转换为树结构。 由调用 SdpConvertStreamToTree 函数生成的 SDP 记录的树表示形式包含根节点,该节点包含由 SDP_TREE_ROOT_NODE 结构定义的与 SDP 记录关联的所有信息。 根节点包含一系列相互关联的 SDP_NODE 结构,每个结构都包含有关单个 SDP 属性的信息。

每个 SDP_NODE 结构都包含一个 SDP_NODE_HEADER 结构和一个 SDP_NODE_DATA 联合。 标头结构指定节点中包含的数据类型。 配置文件驱动程序使用 LIST_ENTRY 结构访问指向对等 SDP_NODE 结构的链接。 通过使用 SDP_NODE 结构的 hdr.Link.Flink 和 hdr.Link.Blink 成员,配置文件驱动程序可以获取树中对等节点的地址。 请记住,LIST_ENTRY 指针会保存指向其他 LIST_ENTRY 结构的地址,并且配置文件驱动程序必须使用 CONTAINING_RECORD 宏提取包含节点记录的地址。 

将 SDP 记录流转换为树表示形式后,配置文件驱动程序可以调用 SdpFindAttributeInTree 函数来获取树中指定节点的地址。

配置文件驱动程序可以通过查询 BTHDDI_SDP_PARSE_INTERFACE 和 BTHDDI_SDP_NODE_INTERFACE 接口来获取指向本主题中所讨论的所有函数的指针。

生成 SDP 记录

播发其服务的配置文件驱动程序可以从头开始生成服务发现协议 (SDP) 树状层次结构,然后将其转换为 SDP 记录流。 配置文件驱动程序必须首先调用 SdpCreateNodeTree 函数。 SdpCreateNodeTree 函数会返回一个已分配的空 SDP_TREE_ROOT_NODE 结构,配置文件驱动程序可以使用以下函数填充该结构:

SdpAddAttributeToTree
SdpAppendNodeToContainerNode
SdpCreateNodeAlternative
SdpCreateNodeBoolean
SdpCreateNodeInt128
SdpCreateNodeInt16
SdpCreateNodeInt32
SdpCreateNodeInt64
SdpCreateNodeInt8
SdpCreateNodeNil
SdpCreateNodeSequence
SdpCreateNodeString
SdpCreateNodeUInt128
SdpCreateNodeUInt16
SdpCreateNodeUInt32
SdpCreateNodeUInt64
SdpCreateNodeUInt8
SdpCreateNodeUrl
SdpCreateNodeUUID128
SdpCreateNodeUUID16
SdpCreateNodeUUID32

配置文件驱动程序生成基于树的 SDP 记录后,它会调用 SdpConvertTreeToStream 函数以生成 SDP 记录的原始字节流版本。 在此窗体中,SDP 记录已准备好让配置文件驱动程序将其发布到本地 SDP 服务器。 与将 SDP 记录构造为流相比,此过程更方便配置文件驱动程序使用。

SdpConvertTreeToStream 函数会分配必要的内存来存储 SDP 记录的流版本。 当配置文件驱动程序不再需要 SDP 记录时,它必须使用 ExFreePool 释放内存。

此外,当配置文件驱动程序不再需要基于树的 SDP 记录版本时,它必须调用 SdpFreeTree 以释放使用关联的 SDP_TREE_ROOT_NODE 结构分配的内存。

配置文件驱动程序可以通过查询 BTHDDI_SDP_PARSE_INTERFACE 和 BTHDDI_SDP_NODE_INTERFACE 接口来获取指向本主题中所讨论的所有函数的指针。 


网站公告

今日签到

点亮在社区的每一天
去签到