RtlInsertElementGenericTable 函数 (ntddk.h)
RtlInsertElementGenericTable 例程向泛型表添加新元素。
语法
NTSYSAPI PVOID RtlInsertElementGenericTable(
[in] PRTL_GENERIC_TABLE Table,
[in] PVOID Buffer,
[in] CLONG BufferSize,
[out, optional] PBOOLEAN NewElement
);
参数
[in] Table
指向泛型表(RTL_GENERIC_TABLE)的指针。 必须通过调用 RtlInitializeGenericTable来初始化该表。
[in] Buffer
指向调用方分配的缓冲区的指针,其中包含要复制到新元素中的数据。 有关详细信息,请参阅 RtlInitializeGenericTable的说明。
[in] BufferSize
插入新元素时要为调用方提供的数据分配的字节数。
[out, optional] NewElement
如果 Buffer 处的新元素插入到泛型表中,则指向接收 true TRUE 的变量的指针;如果未插入新元素,则 FALSE。
返回值
RtlInsertElementGenericTable 返回指向新插入元素的关联数据的指针,或者在泛型表中已存在匹配元素时返回指向现有元素数据的指针。 如果未找到匹配的元素,但无法插入新元素(例如,因为 AllocateRoutine 失败),RtlInsertElementGenericTable 返回 NULL。
言论
若要插入元素,RtlInsertElementGenericTable 调用 CompareRoutine 和 AllocateRoutine,RtlInitializeGenericTable初始化泛型表时注册的 AllocateRoutine。 插入新元素后,RtlInsertElementGenericTable 重新平衡 splay 链接树。
将新元素插入表中时,其数据将从 Buffer 复制到新元素中。 因此,RtlInsertElementGenericTable 返回的指针绝不等于 Buffer。
如果调用方 CompareRoutine 返回 GenericEqual,则假定 Buffer 处的数据复制泛型表中现有元素的数据。 在这种情况下,RtlInsertElementGenericTable 不会添加新元素(因此不调用 AllocateRoutine),因为泛型表不能具有重复的元素。
如果泛型表中已存在匹配元素,RtlInsertElementGenericTable 返回指向现有元素数据的指针,并将 newElement 设置为 FALSE。
Rtl.的调用方。GenericTable 例程负责专门同步对泛型表的访问。 独占快速互斥体是用于此目的的最高效的同步机制。
默认情况下,作系统使用 splay 树来实现泛型表。 在某些情况下,splay 树上的作会使树变得深窄,甚至可能将其变成直线。 非常深的树会降低搜索的性能。 可以使用 Adelson-Velsky/Landis (AVL) 树确保泛型表的更平衡、更浅的树实现。 如果要将泛型表例程配置为使用 AVL 树而不是驱动程序中的 splay 树,请在包含 Ntddk.h之前,在通用头文件中插入以下 define 语句:
#define RTL_USE_AVL_TABLES 0
如果未定义RTL_USE_AVL_TABLES,则必须使用泛型表例程的 AVL 形式。 例如,使用 RtlInsertElementGenericTableAvl 例程,而不是 RtlInsertElementGenericTable。 在调用 RtlInsertElementGenericTableAvl中,调用方必须传递 RTL_AVL_TABLE 表结构,而不是 RTL_GENERIC_TABLE。
如果满足以下任一条件,RtlInsertElementGenericTable 的调用方必须在 IRQL < DISPATCH_LEVEL 运行:
- 表 或 缓冲区 的调用方分配的内存可分页。
- 调用方提供的 CompareRoutine 或 AllocateRoutine 包含可分页代码。
要求
要求 | 价值 |
---|---|
目标平台 | 普遍 |
标头 | ntddk.h (包括 Ntddk.h、 Ntifs.h) |
库 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL(请参阅“备注”部分) |