RDBSS 使用六种基本数据结构来管理连接和文件结构。 这些数据结构由 RDBSS 和各种网络微型重定向程序在内部使用。 这些数据结构有两个版本。 网络微型重定向程序版本包含可由网络微型重定向程序驱动程序操作的字段。 这些数据结构的网络微型重定向程序版本以MRX_前缀开头。 RDBSS 版本中包含的附加字段只能由 RDBSS 操作。
这六个基本数据结构如下所示:
SRV_CALL--服务器调用上下文。 此结构为远程服务器提供抽象。
NET_ROOT-网络根目录。 此结构抽象地表示与共享资源的连接。
V_NET_ROOT——网络根的视图(也称为虚拟网络根)。
FCB--文件控制块。 此结构表示共享上的打开文件。
SRV_OPEN--服务器端打开上下文。 此结构封装服务器上的打开句柄。
FOBX--文件对象扩展。 此结构是 FILE_OBJECT 结构的 RDBSS 扩展。
这些数据结构按以下层次结构进行组织:
SRV_CALL
FCB <------> NET_ROOT
SRV_OPEN <---> V_NET_ROOT
FOBX
FILE_OBJECT
为了响应内核文件系统调用,RDBSS 通常会为网络微型重定向程序驱动程序创建和完成上述所有结构,但 FOBX 结构除外。 因此,网络微型重定向程序驱动程序通常只调用用于连接和文件结构管理的几个 RDBSS 例程。 其中大多数例程由 RDBSS 在内部调用。
所有这些数据结构都进行引用计数。 数据结构的引用计数如下所示:
| 数据结构 | 引用计数说明 |
|---|---|
SRV_CALL |
指向SRV_CALL的NET_ROOT条目数量,加上一些动态值。 |
NET_ROOT |
指向 NET_ROOT 的 FCB 条目数、V_NET_ROOT 条目数加上一些动态值。 |
V_NET_ROOT |
指向 V_NET_ROOT 的 SRV_OPEN 条目数,以及一些动态值。 |
FCB |
指向 FCB 的 SRV_OPEN 条目数量,再加上一些动态值。 |
SRV_OPEN |
指向SRV_OPEN的 FOBX 条目数,以及一些动态值。 |
FOBX |
某个动态值。 |
在每种情况下,动态值指的是引用结构但未取消引用的调用方数。 引用计数的静态部分由例程本身维护。 例如,RxCreateNetRoot 会增加与之关联的 SRV_CALL 结构的引用计数。
引用调用和成功查找会递增引用计数,解除引用调用则减少计数。 创建例程调用分配结构并将引用计数设置为 1。
与任何数据结构关联的引用计数至少是 1 加上与其关联的下一个较低级别的数据结构的实例数。 例如,一个与两个NET_ROOT关联的SRV_CALL的引用计数至少为3。 除了 RDBSS 内部 NameTable 结构和下一个较低级别的数据结构持有的引用之外,还可能获得了其他引用。
这些限制可确保在任何给定级别的数据结构都无法最终(释放和释放关联的内存块),直到下一级的所有数据结构都已敲定或已发布其引用。 例如,如果保留对 FCB 的引用,则可以安全地访问与其关联的V_NET_ROOT、NET_ROOT和SRV_CALL结构。
网络微型重定向器和 RDBSS 之间的接口中使用的两个重要抽象是SRV_CALL和NET_ROOT结构。 SRV_CALL结构对应于与建立连接的服务器关联的上下文,NET_ROOT结构对应于服务器上的共享(也可以将其视为命名空间的一部分,该命名空间已由网络微型重定向程序声明)。
创建SRV_CALL和NET_ROOT结构通常至少涉及一个网络往返。 为了使异步操作能够继续进行,这些操作被建模为两阶段活动。 用于创建SRV_CALL和NET_ROOT结构的每次网络微型重定向程序调用,都会伴随一个从网络微型重定向程序到RDBSS的回传调用,以通知请求的完成状态。 目前这些是同步的。
SRV_CALL结构的创建进一步复杂,因为 RDBSS 必须从多个网络微型重定向器中进行选择,才能与服务器建立连接。 若要为 RDBSS 提供最大的灵活性来选择想要部署的网络微型重定向程序,创建SRV_CALL结构涉及 RDBSS 通知获胜者的网络微型重定向程序的第三个阶段。 所有丢失的网络微型重定向程序都会破坏关联的上下文。
本节包含以下主题: