VfAvlDeleteTreeNode
VOID *__stdcall VfAvlDeleteTreeNode(_VF_AVL_TREE *Tree, _VF_AVL_LOCK_CONTEXT *LockContext, VOID *p, UINT64 RangeSize){
__int64 v6;
__int64 v7;
__int64 v8;
_VF_AVL_TABLE *Tables;
VOID *NodeToFree;
_VF_AVL_TREE_NODE_EX Node;
*(_QWORD *)&Node.SessionId = 0i64;
Node.Base.p = p;
if( RangeSize )
Node.Base.RangeSize = RangeSize;
else
Node.Base.RangeSize = Tree->NodeRangeSize;
ViAvlNodeInitializeSessionId(Tree, &Node);
ViAvlTableIndex(Tree, Node.Base.p);
v7 = v6;
ViAvlRaiseIrqlSafe(LockContext);
v8 = v7;
ViAvlAcquireTableLockAtDpcLevelSafe(&Tree->Tables[v7], LockContext);
RtlDeleteElementGenericTableAvl(&Tree->Tables[v7].RtlTable, &Node);
_InterlockedDecrement64((volatile signed __int64 *)&Tree->NodeCount);
Tables = Tree->Tables;
NodeToFree = Tables[v7].NodeToFree;
Tables[v8].NodeToFree = 0i64;
ViAvlReleaseTableLockFromDpcLevel(&Tree->Tables[v8], LockContext);
return NodeToFree;
}Referenced by:
VerifierExDeleteResourceLite
VerifierExInitializeResourceLite
VfCheckForResource
VfTargetDriversRemove
ViDevObjRemove
ViLookasideAdd
ViLookasideDelete
ViRemLockDeleteFirstTreeNode