RtlLookupElementGenericTable 函数 (ntddk.h)

RtlLookupElementGenericTable 例程在泛型表中搜索与指定数据匹配的元素。

语法

NTSYSAPI PVOID RtlLookupElementGenericTable(
  PRTL_GENERIC_TABLE Table,
  PVOID              Buffer
);

参数

Table

指向泛型表 (RTL_GENERIC_TABLE) 的指针。 表必须已通过调用 RtlInitializeGenericTable 进行初始化。

Buffer

要传递给在 RtlInitializeGenericTable 初始化泛型表时注册的 CompareRoutine 的搜索数据的缓冲区。 有关详细信息,请参阅 RtlInitializeGenericTable 的说明。

返回值

RtlLookupElementGenericTable 返回一个指针,指向泛型表中所需元素的调用方提供的数据。 如果泛型表当前没有元素或找不到匹配元素,则返回 NULL

注解

如果找到匹配的元素, RtlLookupElementGenericTable 会重新平衡泛型表的 splay 树。

Rtl. 的调用方。GenericTable 例程负责以独占方式同步对泛型表的访问。 排他快速互斥体是用于此目的的最有效同步机制。

默认情况下,操作系统使用 splay 树来实现泛型表。 在某些情况下,对 splay 树的操作会使树变得深而窄,甚至可能将其变成直线。 非常深的树会降低搜索的性能。 可以通过使用 Adelson-Velsky/Landis (AVL) 树来确保泛型表的更平衡、更浅的树实现。 如果要将泛型表例程配置为在驱动程序中使用 AVL 树而不是 splay 树,请在包含 ntddk.h 之前在通用头文件中插入以下 define 语句:

`#define RTL_USE_AVL_TABLES 0`

如果未按上面指定定义RTL_USE_AVL_TABLES,则必须使用泛型表例程的 AVL 形式。 例如,使用 RtlLookupElementGenericTableAvl 例程,而不是 RtlLookupElementGenericTable。 在调用 RtlLookupElementGenericTableAvl 时,调用方必须传递 RTL_AVL_TABLE 表结构,而不是 RTL_GENERIC_TABLE

如果满足以下任一条件, 则 RtlLookupElementGenericTable 的调用方必须在 IRQL < DISPATCH_LEVEL 上运行:

  • 调用方在 TableBuffer 处分配的内存是可分页的。

  • 调用方提供的 CompareRoutine 包含可分页代码。

否则,使用非分页内存或代码时, RtlLookupElementGenericTable 的调用方可以在 IRQL <= DISPATCH_LEVEL 运行。

要求

要求
目标平台 通用
标头 ntddk.h (包括 Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL 请参见“备注”部分。

另请参阅

RTL_AVL_TABLE

RTL_GENERIC_TABLE

RtlInitializeGenericTable

RtlIsGenericTableEmpty

RtlNumberGenericTableElements