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