实验室的产品需要添加一个驱动,其中用到了RTL_GENERIC_TABLE,也就不可避免地用到了RtlDeleteElementGenericTable。
RTL_GENERIC_TABLE默认实现是伸展树,RtlDeleteElementGenericTable主要执行三个步骤:
1. 查找要删除的element的位置。
2. 使用RtlDelete移除element,RtlDelete会调用RtlSplay调整树结构
3. 调用FreeRoutine释放element内存。
RtlDeleteElementGenericTable实现在NtosKrnl.exe中,将其反编译,得到的代码大致是:
uint RtlDeleteElementGenericTable(undefined4 *param_1,int param_2)
{
int iVar1;
int *piVar2;
int iVar3;
uint uVar4;
undefined4 uVar5;
/* 0x1534fa 1067 RtlDeleteElementGenericTable */
uVar4 = FUN_0055345c(param_2,¶m_2);
iVar3 = param_2;
if ((uVar4 == 0) || (uVar4 != 1)) {
uVar4 = uVar4 & 0xffffff00;
}
else {
uVar5 = RtlDelete(param_2);
*param_1 = uVar5;
iVar1 = *(int *)(iVar3 + 0xc);
piVar2 = *(int **)(iVar3 + 0x10);
*piVar2 =