CmpConstructNameFromKeyNodes

__int64 __fastcall CmpConstructNameFromKeyNodes(__int64 a1, _QWORD *a2, __int64 a3, _LOOKASIDE_LIST_EX *a4){
  unsigned int v4; 
  __int64 v5; 
  _CM_KEY_CONTROL_BLOCK *v6; 
  int LayerHeight; 
  _PRIVILEGE_SET *v8; 
  unsigned int v9; 
  unsigned int v10; 
  _WORD *v11; 
  _WORD *v12; 
  unsigned __int16 v13; 
  _CM_NAME_CONTROL_BLOCK *NameBlock; 
  unsigned __int16 NameLength; 
  int v16; 
  __int16 v17; 
  unsigned __int16 v18; 
  unsigned __int16 v19; 
  __int64 i; 
  const VOID *v21; 
  __int64 v22; 
  __int64 v23; 
  __int64 v24; 
  _WORD *v25; 
  unsigned __int8 *v26; 
  __int64 v27; 
  __int16 v28; 
  _PRIVILEGE_SET *TransientPoolWithTag; 
  _CM_KCB_LAYER_INFO *LayerInfo; 
  __int16 v32; 
  __int64 v33; 
  __int16 v34; 
  __int64 v35; 
  wchar_t *v36; 
  __int128 v37; 
  __int128 v38; 
  __int64 v39; 
  _QWORD *v40; 

  v40 = a2;
  v4 = 0;
  v39 = 0i64;
  v37 = 0i64;
  WORD1(v37) = -1;
  v5 = *(__int16 *)(a1 + 2);
  LODWORD(v39) = -1;
  v38 = 0i64;
  _mm_lfence();
  if( (int)v5 >= 2 )
    v6 = *(_CM_KEY_CONTROL_BLOCK **)(*(_QWORD *)(a1 + 24) + 8 * v5 - 16);
  else
    v6 = *(_CM_KEY_CONTROL_BLOCK **)(a1 + 8 * v5 + 8);
  LayerHeight = v6->LayerHeight;
  v8 = 0i64;
  if( LayerHeight >= 2 )
  {
    TransientPoolWithTag = (_PRIVILEGE_SET *)CmpAllocateTransientPoolWithTag(
                                               1ui64,
                                               8i64 * (unsigned int)(LayerHeight - 1));
    v8 = TransientPoolWithTag;
    if( !TransientPoolWithTag )
    {
      v8 = (_PRIVILEGE_SET *)*((_QWORD *)&v38 + 1);
      v4 = -1073741670;
      goto LABEL_27;
    }
    memset(TransientPoolWithTag, 0i64, 8 * (LayerHeight - 1));
  }
  LOWORD(v37) = LayerHeight;
  *((_QWORD *)&v38 + 1) = v8;
  v9 = CmpKeyFullNameLength(v6);
  v10 = v9;
  if( v9 > 0xFFFF )
  {
    v4 = -1073741811;
  }
  else
  {
    v11 = CmpAllocateTransientPoolWithTag(1ui64, v9 + 16i64);
    v12 = v11;
    if( v11 )
    {
      memset(v11, 0i64, v10 + 16);
      *v12 = v10;
      v12[1] = v10;
      *((_QWORD *)v12 + 1) = v12 + 8;
      v13 = (unsigned __int16)v10 >> 1;
      do
      {
        if( (v6->_bf_b8 & 0x40000) != 0 && v6->ParentKcb )
        {
          v6 = v6->ParentKcb;
        }
        else
        {
          NameBlock = v6->NameBlock;
          NameLength = NameBlock->NameHash.NameLength;
          v16 = *(_DWORD *)NameBlock;
          v17 = v6->LayerHeight;
          v18 = NameLength >> 1;
          WORD1(v37) = v17;
          if( (v16 & 1) != 0 )
            v18 = NameLength;
          v19 = v13 - v18;
          if( v17 )
          {
            LayerInfo = v6->LayerInfo;
            v32 = v17;
            if( LayerInfo )
            {
              do
              {
                CmpSetKcbAtLayerHeight((__int64)&v37, v32, (__int64)LayerInfo->Kcb);
                LayerInfo = *(_CM_KCB_LAYER_INFO **)(v33 + 24);
                v32 = v34 - 1;
              }
              while( LayerInfo );
              v17 = v6->LayerHeight;
              v8 = (_PRIVILEGE_SET *)*((_QWORD *)&v38 + 1);
            }
          }
          else
          {
            *((_QWORD *)&v37 + 1) = v6;
          }
          for( i = 0i64; v17 >= 0; --v17 )
          {
            if( v17 >= 2 )
              i = *((_QWORD *)v8 + v17 - 2);
            else
              i = *((_QWORD *)&v37 + v17 + 1);
            if( *(_QWORD *)(i + 200) )
              break;
            if( *(_DWORD *)(i + 40) != -1 )
              break;
          }
          v21 = *(const VOID **)(i + 200);
          if( (unsigned __int64)v21 >= 2 )
          {
            memmove((VOID *)(*((_QWORD *)v12 + 1) + 2i64 * v19), v21, 2 * v18);
          }
          else
          {
            v22 = 2i64 * v19;
            if( v21 == (const VOID *)1 )
            {
              v35 = *(_QWORD *)(i + 80);
              v36 = (wchar_t *)(v22 + *((_QWORD *)v12 + 1));
              if( (*(_DWORD *)v35 & 1) != 0 )
                CmpCopyCompressedName(v36, 2 * (unsigned int)v18, (PWCHAR)(v35 + 26), v18);
              else
                memmove(v36, (const VOID *)(v35 + 26), 2 * v18);
            }
            else
            {
              v23 = (*(__int64(__fastcall **)(_QWORD, _QWORD, __int64 *))(*(_QWORD *)(i + 32) + 8i64))(
                      *(_QWORD *)(i + 32),
                      *(unsigned int *)(i + 40),
                      &v39);
              v25 = (_WORD *)(v22 + *((_QWORD *)v12 + 1));
              if( (*(_BYTE *)(v23 + 2) & 0x20) != 0 )
              {
                if( v18 )
                {
                  v26 = (unsigned __int8 *)(v23 + 76);
                  v27 = v18;
                  do
                  {
                    v28 = *v26++;
                    *v25++ = v28;
                    --v27;
                  }
                  while( v27 );
                }
              }
              else
              {
                memmove((VOID *)(v22 + *((_QWORD *)v12 + 1)), (const VOID *)(v23 + 76), 2 * v18);
              }
              (*(void(__fastcall **)(_QWORD, __int64 *, __int64, _WORD *, _QWORD, _QWORD, _QWORD))(*(_QWORD *)(i + 32)
                                                                                                  + 16i64))(
                *(_QWORD *)(i + 32),
                &v39,
                v24,
                v25,
                v37,
                *((_QWORD *)&v37 + 1),
                v38);
            }
          }
          v13 = v19 - 1;
          *(_WORD *)(*((_QWORD *)v12 + 1) + 2i64 * v13) = 92;
          v6 = v6->ParentKcb;
        }
      }
      while( v6 );
      *v40 = v12;
    }
    else
    {
      v4 = -1073741670;
    }
  }
LABEL_27:
  if( v8 )
    CmSiFreeMemory(v8);
  return v4;
}

Referenced by:

CmpConstructNameWithStatus