RtlInsertUnicodePrefix

INT8 __fastcall RtlInsertUnicodePrefix(INT64 a1, UINT16 *a2, INT64 a3){
  __int16 v6; 
  INT64 *v7; 
  __int64 v8; 
  INT64 i; 
  INT64 j; 
  _COMPARISON v11; 
  __int64 v12; 
  INT64 v13; 
  _RTL_SPLAY_LINKS *v14; 
  _RTL_SPLAY_LINKS *v15; 
  INT64 v17; 

  v6 = ComputeUnicodeNameLength((_UNICODE_STRING *)a2);
  v7 = (INT64 *)(a3 + 24);
  *(_WORD *)(a3 + 2) = v6;
  *(_QWORD *)(a3 + 32) = 0i64;
  *(_QWORD *)(a3 + 40) = 0i64;
  *(_QWORD *)(a3 + 48) = v8;
  *(_QWORD *)(a3 + 24) = a3 + 24;
  for( i = *(_QWORD *)(a1 + 8); *(__int16 *)(i + 2) > v6; i = *(_QWORD *)(i + 8) )
    a1 = i;
  if( *(_WORD *)(i + 2) == v6 )
  {
    for( j = i; ; j = v12 - 24 )
    {
      v11 = CompareUnicodeStrings(*(const _UNICODE_STRING **)(j + 48), (const _UNICODE_STRING *)a2, 0i64);
      if( v11 == IsEqual )
        break;
      if( v11 == IsGreaterThan )
      {
        v12 = *(_QWORD *)(j + 32);
        if( !v12 )
        {
          *(_QWORD *)(a3 + 8) = 0i64;
          v13 = j + 24;
          *(_WORD *)a3 = 2050;
          *(_QWORD *)(a3 + 16) = a3;
          *(_QWORD *)(j + 32) = v7;
LABEL_12:
          *v7 = v13;
          goto LABEL_13;
        }
      }
      else
      {
        v12 = *(_QWORD *)(j + 40);
        if( !v12 )
        {
          *(_QWORD *)(a3 + 8) = 0i64;
          v13 = j + 24;
          *(_WORD *)a3 = 2050;
          *(_QWORD *)(a3 + 16) = a3;
          *(_QWORD *)(j + 40) = v7;
          goto LABEL_12;
        }
      }
    }
    v17 = j;
    do
    {
      if( CompareUnicodeStrings(*(const _UNICODE_STRING **)(v17 + 48), (const _UNICODE_STRING *)a2, 0xFFFFFFFFui64) == IsEqual )
        return 0;
      v17 = *(_QWORD *)(v17 + 16);
    }
    while( v17 != j );
    *(_QWORD *)(a3 + 8) = 0i64;
    *(_WORD *)a3 = 2051;
    *(_QWORD *)(a3 + 16) = *(_QWORD *)(j + 16);
    *(_QWORD *)(j + 16) = a3;
LABEL_13:
    v14 = *(_RTL_SPLAY_LINKS **)(i + 8);
    *(_QWORD *)(i + 8) = 0i64;
    *(_WORD *)i = 2050;
    v15 = RtlSplay((_RTL_SPLAY_LINKS *)(j + 24)) - 1;
    LOWORD(v15->Parent) = 2049;
    *(_QWORD *)(a1 + 8) = v15;
    v15->LeftChild = v14;
  }
  else
  {
    *(_QWORD *)(a1 + 8) = a3;
    *(_WORD *)a3 = 2049;
    *(_QWORD *)(a3 + 8) = i;
    *(_QWORD *)(a3 + 16) = a3;
  }
  return 1;
}

Referenced by:

No references.