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