RtlGetElementGenericTableAvl
VOID *__stdcall RtlGetElementGenericTableAvl(_RTL_AVL_TABLE *Table, UINT64 I){
unsigned int WhichOrderedElement;
unsigned int v3;
_RTL_AVL_TABLE *v4;
unsigned int NumberGenericTableElements;
_RTL_BALANCED_LINKS *OrderedPointer;
_RTL_BALANCED_LINKS *i;
int v9;
_RTL_BALANCED_LINKS *k;
int v11;
unsigned int v12;
int v13;
_RTL_BALANCED_LINKS *j;
int v15;
WhichOrderedElement = Table->WhichOrderedElement;
v3 = I;
v4 = Table;
if( (_DWORD)I == -1 )
return 0i64;
NumberGenericTableElements = Table->NumberGenericTableElements;
if( v3 + 1 > NumberGenericTableElements )
return 0i64;
OrderedPointer = (_RTL_BALANCED_LINKS *)Table->OrderedPointer;
if( !OrderedPointer )
{
OrderedPointer = v4->BalancedRoot.RightChild;
for( i = OrderedPointer->LeftChild; i; i = i->LeftChild )
OrderedPointer = i;
WhichOrderedElement = 0;
v4->OrderedPointer = OrderedPointer;
v4->WhichOrderedElement = 0;
}
if( v3 != WhichOrderedElement )
{
if( v3 >= WhichOrderedElement )
{
v12 = NumberGenericTableElements - v3;
if( v3 - WhichOrderedElement > v12 )
{
OrderedPointer = v4->BalancedRoot.RightChild;
for( j = OrderedPointer->RightChild; j; j = j->RightChild )
OrderedPointer = j;
if( v12 != 1 )
{
do
OrderedPointer = RealPredecessor(OrderedPointer);
while( v15 != 1 );
}
}
else if( v3 != WhichOrderedElement )
{
do
OrderedPointer = RealSuccessor(OrderedPointer);
while( v13 != 1 );
}
}
else if( v3 < WhichOrderedElement >> 1 )
{
OrderedPointer = v4->BalancedRoot.RightChild;
for( k = OrderedPointer->LeftChild; k; k = k->LeftChild )
OrderedPointer = k;
if( v3 )
{
do
OrderedPointer = RealSuccessor(OrderedPointer);
while( v11 != 1 );
}
}
else if( WhichOrderedElement != v3 )
{
do
OrderedPointer = RealPredecessor(OrderedPointer);
while( v9 != 1 );
}
v4->OrderedPointer = OrderedPointer;
v4->WhichOrderedElement = v3;
}
return &OrderedPointer[1];
}Referenced by:
No references.