前缀表管理

RDBSS 定义了一种数据结构,使得可以使用前缀表来注册 SRV_CALL、NET_ROOT 和 V_NET_ROOT 名称。

RDBSS 中名称管理的当前实现使用具有以下组件的表:

  • 被插入名称的队列

  • 版本标识

  • 控制表访问的表锁资源

  • 一个值,表示名称匹配是否区分大小写

  • 此前缀表的哈希值条目桶

表锁资源以正常方式使用:共享用于查找操作,专用用于更改操作。

每次更改时,版本戳都会更改。 队列的原因是前缀表包允许多个调用方一次枚举。 插入名称和版本戳的队列使得多个调用方能够同时进行枚举操作。 队列可用于文件名的快速检索,但前缀表无疑是处理NET_ROOT结构的最佳选择。

这些前缀表管理例程由 RDBSS 在内部使用,以响应 MUP 的调用来声明名称或形成NET_ROOT结构的创建路径。 网络微型重定向程序也可以使用这些 RDBSS 前缀表管理例程,只要在访问表之前获取适当的锁,并在工作完成时释放锁。 驱动程序的正常使用如下所示:

  • 通过调用 RxAcquirePrefixTableLockShared 获取共享锁。

  • 通过调用 RxPrefixTableLookupName 查找名称。

  • 通过调用 RxReleasePrefixTableLock 释放共享锁。

请注意,某些例程仅在 Windows XP 和早期版本的 Windows 上实现。 RxPrefixTableLookupName 是在所有版本的 Windows 上实现的唯一前缀表管理例程

RDBSS 前缀表管理例程包括:

Routine DESCRIPTION

RxpAcquirePrefixTableLockExclusive

此例程获取用于目录SRV_CALL和NET_ROOT名称的前缀表的排他锁。

此例程仅在 Windows XP 和 Windows 2000 上可用。 此例程由 RDBSS 在内部使用,不应由网络微型重定向程序使用。

RxpAcquirePrefixTableLockShared

此例程获取用于目录SRV_CALL和NET_ROOT名称的前缀表上的共享锁。

此例程仅在 Windows XP 和 Windows 2000 上可用。 此例程由 RDBSS 在内部使用,不应由网络微型重定向程序使用。

RxPrefixTableLookupName

例程在前缀表中查找一个名称,该名称用于编录SRV_CALL和NET_ROOT名称,并从基础指针转换为包含结构。

RxpReleasePrefixTableLock

此例程释放用于编录SRV_CALL和NET_ROOT名称的前缀表的锁。

此例程仅在 Windows XP 和 Windows 2000 上可用。 此例程由 RDBSS 在内部使用,不应由网络微型重定向程序使用。

从 Windows Server 2003 开始,上表中提到的例程( RxPrefixTableLookupName 除外)将替换为宏。定义了以下宏,以更少的参数调用前缀表例程。

DESCRIPTION

RxAcquirePrefixTableLockExclusiveTABLEWAIT

此宏以独占模式获取前缀表锁,以便执行更改作。

RxAcquirePrefixTableLockSharedTABLEWAIT

此宏在共享模式下获取用于查找作的前缀表锁。

RxIsPrefixTableLockAcquiredTABLE

此宏指示前缀表锁是在独占模式还是共享模式下获取的。

RxIsPrefixTableLockExclusiveTABLE

此宏指示前缀表锁是否以独占模式获取。

RxReleasePrefixTableLockTABLE

此宏释放前缀表锁。