Prefix Table Management

RDBSS defines data structures that enable use of prefix tables to catalog SRV_CALL, NET_ROOT, and V_NET_ROOT names.

The current implementation of name management in RDBSS uses a table that has the following components:

  • A queue of inserted names

  • A version stamp

  • A table lock resource that controls table access

  • A value that indicates whether name matches are case insensitive

  • A bucket of hash value entries for this prefix table

The table lock resource is used in the normal way: shared for lookup operations, exclusive for change operations.

The version stamp changes with each change. The reason for the queue is that the prefix table package allows multiple callers to be enumerating at a time. The queue of inserted names and version stamp allow multiple callers to be enumerating simultaneously. The queue could be used as a faster lookup for file names, but the prefix table is definitely the correct approach for NET_ROOT structures.

These prefix table management routines are used internally by RDBSS in response to a call from MUP to claim a name or to form the create path for a NET_ROOT structure. These RDBSS prefix table management routines can also be used by network mini-redirectors, as long as the appropriate lock is acquired before accessing the table and the lock is released when work is completed. The normal use by a driver would be as follows:

  • Acquire a shared lock by calling RxAcquirePrefixTableLockShared.

  • Look up a name by calling RxPrefixTableLookupName.

  • Release the shared lock by calling RxReleasePrefixTableLock.

Note that certain routines are implemented only on Windows XP and previous versions of Windows. RxPrefixTableLookupName is the only prefix table management routine implemented on all versions of Windows

The RDBSS prefix table management routines include the following:

Routine Description

RxpAcquirePrefixTableLockExclusive

This routine acquires an exclusive lock on a prefix table used to catalog SRV_CALL and NET_ROOT names.

This routine is only available on Windows XP and Windows 2000. This routine is used internally by RDBSS and should not be used by network mini-redirectors.

RxpAcquirePrefixTableLockShared

This routine acquires a shared lock on a prefix table used to catalog SRV_CALL and NET_ROOT names.

This routine is only available on Windows XP and Windows 2000. This routine is used internally by RDBSS and should not be used by network mini-redirectors.

RxPrefixTableLookupName

The routine looks up a name in a prefix table used to catalog SRV_CALL and NET_ROOT names and converts from the underlying pointer to the containing structure.

RxpReleasePrefixTableLock

This routine releases a lock on a prefix table used to catalog SRV_CALL and NET_ROOT names.

This routine is only available on Windows XP and Windows 2000. This routine is used internally by RDBSS and should not be used by network mini-redirectors.

Starting with Windows Server 2003, the routines mentioned in the previous table, except RxPrefixTableLookupName, are replaced by macros.The following macros are defined that call the prefix table routines with fewer parameters.

Macro Description

RxAcquirePrefixTableLockExclusive (TABLE, WAIT)

This macro acquires the prefix table lock in exclusive mode for change operations.

RxAcquirePrefixTableLockShared (TABLE, WAIT)

This macro acquires the prefix table lock in shared mode for lookup operations.

RxIsPrefixTableLockAcquired (TABLE)

This macro indicates if the prefix table lock was acquired in either exclusive or shared mode.

RxIsPrefixTableLockExclusive (TABLE)

This macro indicates if the prefix table lock was acquired in exclusive mode.

RxReleasePrefixTableLock (TABLE)

This macro frees the prefix table lock.