CmQueryLayeredKey
__int64 __fastcall CmQueryLayeredKey(__int64 a1, int a2, unsigned int *a3, unsigned int a4, unsigned int *a5){
_CM_KEY_CONTROL_BLOCK *v9;
signed int started;
unsigned int v11;
const VOID **v12;
size_t v13;
INT64 v15;
bool v16;
int v17;
bool v18;
unsigned __int32 bf_b8;
int v20;
unsigned int v21;
int v22;
unsigned int v23;
unsigned int v24;
INT16 LayerHeight;
INT64 KcbAtLayerHeight;
__int16 v27;
__int64 v28;
int v29;
int v30;
char v31;
PVOID P;
INT64 v33[2];
__int128 v34;
__int128 v35;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
INT64 v37[10];
*(_OWORD *)v33 = 0i64;
v34 = 0i64;
memset(v37, 0i64, sizeof(v37));
memset(&SubjectContext, 0, sizeof(SubjectContext));
CmpInitializeKcbStack((INT64)v33);
v31 = 0;
CmpInitializeKeyNodeStack((INT64)v37);
P = 0i64;
v35 = 0i64;
v9 = *(_CM_KEY_CONTROL_BLOCK **)(a1 + 8);
started = CmpStartKcbStackForTopLayerKcb((INT64)v33, (INT64)v9);
if( started < 0 )
goto LABEL_11;
CmpLockKcbStackShared((INT64)v33);
v31 = 1;
if( a2 == 3 )
{
if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, 0i64) && (*(_DWORD *)(a1 + 48) & 1) != 0 )
{
started = -1073740763;
}
else
{
started = CmpConstructNameWithStatus(v9, (_UNICODE_STRING **)&P);
if( started >= 0 )
{
v11 = *(unsigned __int16 *)P + 4;
*a5 = v11;
if( a4 >= 4 )
{
v12 = (const VOID **)P;
*a3 = *(unsigned __int16 *)P;
v13 = a4 - 4;
if( a4 - 4 >= *(unsigned __int16 *)v12 )
v13 = *(unsigned __int16 *)v12;
memmove(a3 + 1, v12[1], v13);
if( v11 > a4 )
started = -2147483643;
else
started = CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, 0i64) != 0 ? 0xC000017C : 0;
}
else
{
started = -1073741789;
}
}
}
goto LABEL_11;
}
started = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)a1, 0i64);
if( started < 0 )
goto LABEL_11;
if( a2 == 6 )
{
SeCaptureSubjectContextEx((PETHREAD)KeGetCurrentThread(), KeGetCurrentThread()->Process, &SubjectContext);
v16 = KCBNeedsVirtualImage_0((__int64)v9);
v17 = v16 | v35 & 0xFFFFFFFE;
v18 = KCBNeedsVirtualImage_0((__int64)v9);
bf_b8 = v9->_bf_b8;
if( !v18 || (v20 = 2, (bf_b8 & 0x20) != 0) )
v20 = 0;
v21 = v20 | v17 & 0xFFFFFFFD;
if( !CmpVEEnabled || (v22 = 4, (bf_b8 & 0x1000000) == 0) )
v22 = 0;
v23 = v22 & 0xFFFFFFE7 | v21 & 0xFFFFFFE3 | ((HIWORD(bf_b8) & 0x80 | (bf_b8 >> 19) & 0x40) >> 3);
SeReleaseSubjectContext(&SubjectContext);
*a5 = 4;
if( a4 < 4 )
{
started = -1073741789;
goto LABEL_11;
}
*a3 = v23;
goto LABEL_30;
}
if( a2 == 8 )
{
if( (v9->KeyHash.KeyHive[2].Storage[1].FreeDisplay[6].RealVectorSize & 1) != 0 )
v24 = v35 & 0xFFFFFFFE;
else
v24 = v35 | 1;
*a5 = 4;
if( a4 < 4 )
{
started = -1073741789;
goto LABEL_11;
}
*a3 = v24;
goto LABEL_30;
}
LayerHeight = v9->LayerHeight;
if( LayerHeight < 0 )
{
LABEL_43:
v28 = 0i64;
}
else
{
while( 1 )
{
KcbAtLayerHeight = CmpGetKcbAtLayerHeight((INT64)v33, LayerHeight);
if( *(_DWORD *)(KcbAtLayerHeight + 40) != -1 )
break;
LayerHeight = v27 - 1;
if( LayerHeight < 0 )
goto LABEL_43;
}
v28 = KcbAtLayerHeight;
}
if( a2 == 5 )
{
LODWORD(v35) = CmGetKeyFlags(v28, 0i64, v15);
DWORD1(v35) = *(int *)(v28 + 40) < 0;
if( CmpIsKeyStackSymlink((INT64)v33) )
DWORD1(v35) = v29 | 2;
v30 = (*(_DWORD *)(v28 + 184) >> 4) & 0xF;
*a5 = 12;
if( a4 < 0xC )
{
started = -1073741789;
goto LABEL_11;
}
*(_QWORD *)a3 = v35;
a3[2] = v30;
LABEL_30:
started = 0;
goto LABEL_11;
}
started = CmpStartKeyNodeStackFromKcbStack((INT64)v37, (INT64)v33);
if( started >= 0 )
{
started = CmpQueryKeyDataFromKeyNodeStack((__int16 *)v37, a2, (__int64)a3, a4, a5);
if( started >= 0 )
started = 0;
}
LABEL_11:
CmpCleanupKeyNodeStack((INT64)v37);
if( P )
ExFreePoolWithTag(P, 0x624E4D43u);
if( v31 )
CmpUnlockKcbStack((INT64)v33);
CmpCleanupKcbStack((INT64)v33);
return(unsigned int)started;
}Referenced by:
CmQueryKey