连接和文件结构管理
RDBSS 使用六种基本数据结构来管理连接和文件结构。 RDBSS 和各种网络微型重定向程序在内部使用这些数据结构。 这些数据结构有两个版本。 网络微型重定向程序版本包含可由网络微型重定向程序驱动程序操作的字段。 这些数据结构的网络微型重定向程序版本以 MRX_ 前缀开头。 RDBSS 版本包含只能由 RDBSS 操作的其他字段。
这六个基本数据结构如下所示:
SRV_CALL--服务器调用上下文。 此结构为远程服务器提供抽象。
NET_ROOT-net 根。 此结构将与共享的连接抽象化。
V_NET_ROOT -- (也称为虚拟 netroots) 的视图。
FCB--file 控制块。 此结构表示共享上打开的文件。
SRV_OPEN服务器端开放上下文。 此结构封装服务器上的打开句柄。
FOBX --file 对象扩展。 此结构是 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_ROOTs 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 的调用,以通知请求的完成状态。 目前这些是同步的。
由于 RDBSS 必须从多个网络微型重定向程序中进行选择来与服务器建立连接,因此创建SRV_CALL结构会进一步复杂化。 为使 RDBSS 在选择希望部署的网络微型重定向程序方面具有最大的灵活性,创建SRV_CALL结构涉及第三阶段,其中 RDBSS 通知网络微型重定向器胜出者。 所有丢失的网络微型重定向程序都会破坏关联的上下文。
本节包含下列主题: