VfAvlInitializeTreeEx

NTSTATUS __stdcall VfAvlInitializeTreeEx(
        _VF_AVL_TREE *Tree,
        UINT64 NodeRangeSize,
        UINT64 NodeSize,
        INT64 UseSessionId,
        VOID *FreeRoutine,
        _RTL_AVL_TABLE *a6,
        VOID *a7){
  char v7; 
  int v9; 
  union {unsigned int NodeSize;unsigned int UseLookaside;} v10; 
  __int64 v11; 
  _VF_AVL_TABLE *PoolWithTag; 
  unsigned __int64 v13; 
  _RTL_GENERIC_COMPARE_RESULTS(__stdcall *v14)(_RTL_AVL_TABLE *, VOID *, VOID *); 
  __int64 v15; 
  unsigned int MaximumProcessorCount; 

  Tree->NodeCount = 0i64;
  v7 = UseSessionId;
  Tree->NodeRangeSize = NodeRangeSize;
  Tree->UseSessionId = UseSessionId;
  if( (_DWORD)NodeSize )
  {
    v9 = 0;
  }
  else
  {
    if( (_BYTE)UseSessionId )
      v9 = 0;
    else
      v9 = ViAvlInitialized;
    LODWORD(NodeSize) = (_BYTE)UseSessionId != 0 ? 24 : 16;
  }
  if( v9 )
    v10.NodeSize = 1;
  else
    v10.NodeSize = NodeSize + 32;
  Tree->u1 = (union {unsigned int NodeSize;unsigned int UseLookaside;})v10.NodeSize;
  if( NodeRangeSize )
  {
    MaximumProcessorCount = HalQueryMaximumProcessorCount();
    v11 = 64i64;
    if( MaximumProcessorCount >= 0x40 || (v11 = 32i64, MaximumProcessorCount >= 0x20) )
    {
      Tree->TablesNo = v11;
    }
    else
    {
      Tree->TablesNo = 16;
      v11 = 16i64;
    }
  }
  else
  {
    Tree->TablesNo = 1;
    v11 = 1i64;
  }
  PoolWithTag = (_VF_AVL_TABLE *)ExAllocatePoolWithTag(0x200ui64, 192 * v11, 1413572182i64);
  Tree->Tables = PoolWithTag;
  if( !PoolWithTag )
    return -1073741801;
  v13 = 0i64;
  if( Tree->TablesNo )
  {
    v14 = ViAvlCompareNodeUseSessionId;
    if( !v7 )
      v14 = ViAvlCompareNode;
    v15 = 0i64;
    do
    {
      Tree->Tables[v15].ReservedNode = 0i64;
      Tree->Tables[v15].Lock = 0;
      Tree->Tables[v15].NodeToFree = 0i64;
      RtlInitializeGenericTableAvl(
        &Tree->Tables[v15].RtlTable,
        (PRTL_AVL_COMPARE_ROUTINE)v14,
        (PRTL_AVL_ALLOCATE_ROUTINE)ViAvlAllocateNode,
        (PRTL_AVL_FREE_ROUTINE)FreeRoutine,
        Tree);
      ++v13;
      ++v15;
    }
    while( v13 < Tree->TablesNo );
  }
  return 0;
}

Referenced by:

VfAvlInitializeTree