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.