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