RtlInsertUnicodePrefix
UINT8 __stdcall RtlInsertUnicodePrefix(
_UNICODE_PREFIX_TABLE *PrefixTable,
UNICODE_STRING *Prefix,
_UNICODE_PREFIX_TABLE_ENTRY *PrefixTableEntry){
CSHORT v6;
RTL_SPLAY_LINKS *p_Links;
struct _UNICODE_STRING *v8;
_UNICODE_PREFIX_TABLE *i;
_UNICODE_PREFIX_TABLE *j;
int v11;
PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
_RTL_SPLAY_LINKS *v13;
struct _UNICODE_PREFIX_TABLE_ENTRY *v14;
struct _UNICODE_PREFIX_TABLE_ENTRY *v15;
_UNICODE_PREFIX_TABLE *v17;
v6 = ComputeUnicodeNameLength(Prefix);
p_Links = &PrefixTableEntry->Links;
PrefixTableEntry->NameLength = v6;
PrefixTableEntry->Links.LeftChild = 0i64;
PrefixTableEntry->Links.RightChild = 0i64;
PrefixTableEntry->Prefix = v8;
PrefixTableEntry->Links.Parent = &PrefixTableEntry->Links;
for( i = (_UNICODE_PREFIX_TABLE *)PrefixTable->NextPrefixTree;
i->NameLength > v6;
i = (_UNICODE_PREFIX_TABLE *)i->NextPrefixTree )
{
PrefixTable = i;
}
if( i->NameLength == v6 )
{
for( j = i; ; j = (_UNICODE_PREFIX_TABLE *)&NextPrefixTree[-1].Links.LeftChild )
{
v11 = CompareUnicodeStrings(*(unsigned __int16 **)&j[2].NodeTypeCode, &Prefix->Length, 0);
if( v11 == 2 )
break;
if( v11 == 3 )
{
NextPrefixTree = j[1].NextPrefixTree;
if( !NextPrefixTree )
{
PrefixTableEntry->NextPrefixTree = 0i64;
v13 = (_RTL_SPLAY_LINKS *)&j[1];
PrefixTableEntry->NodeTypeCode = 2050;
PrefixTableEntry->CaseMatch = PrefixTableEntry;
j[1].NextPrefixTree = (PUNICODE_PREFIX_TABLE_ENTRY)p_Links;
LABEL_12:
p_Links->Parent = v13;
goto LABEL_13;
}
}
else
{
NextPrefixTree = j[1].LastNextEntry;
if( !NextPrefixTree )
{
PrefixTableEntry->NextPrefixTree = 0i64;
v13 = (_RTL_SPLAY_LINKS *)&j[1];
PrefixTableEntry->NodeTypeCode = 2050;
PrefixTableEntry->CaseMatch = PrefixTableEntry;
j[1].LastNextEntry = (PUNICODE_PREFIX_TABLE_ENTRY)p_Links;
goto LABEL_12;
}
}
}
v17 = j;
do
{
if( (unsigned int)CompareUnicodeStrings(*(unsigned __int16 **)&v17[2].NodeTypeCode, &Prefix->Length, 0xFFFFFFFF) == 2 )
return 0;
v17 = (_UNICODE_PREFIX_TABLE *)v17->LastNextEntry;
}
while( v17 != j );
PrefixTableEntry->NextPrefixTree = 0i64;
PrefixTableEntry->NodeTypeCode = 2051;
PrefixTableEntry->CaseMatch = j->LastNextEntry;
j->LastNextEntry = PrefixTableEntry;
LABEL_13:
v14 = i->NextPrefixTree;
i->NextPrefixTree = 0i64;
i->NodeTypeCode = 2050;
v15 = (struct _UNICODE_PREFIX_TABLE_ENTRY *)&RtlSplay((RTL_SPLAY_LINKS *)&j[1])[-1];
v15->NodeTypeCode = 2049;
PrefixTable->NextPrefixTree = v15;
v15->NextPrefixTree = v14;
}
else
{
PrefixTable->NextPrefixTree = PrefixTableEntry;
PrefixTableEntry->NodeTypeCode = 2049;
PrefixTableEntry->NextPrefixTree = (struct _UNICODE_PREFIX_TABLE_ENTRY *)i;
PrefixTableEntry->CaseMatch = PrefixTableEntry;
}
return 1;
}Referenced by:
No references.