CmEnumerateValueFromLayeredKey
__int64 __fastcall CmEnumerateValueFromLayeredKey(__int64 a1, unsigned int a2, int a3, __int64 a4, int a5, __int64 a6){
__int64 v7;
char v8;
INT64 v9;
INT64 KcbAtLayerHeight;
INT64 v11;
int started;
INT16 v13;
__int16 v14;
char v15;
__int16 v16;
int v17;
unsigned int v18;
_CM_KEY_CONTROL_BLOCK *v19;
INT64 KeyNodeForKcb;
_CM_KEY_VALUE *v21;
INT64 v23;
__int64 v24;
__int64 v25;
_KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass;
INT64 v27[2];
PPRIVILEGE_SET Privileges[2];
unsigned int *ResultLength;
size_t v30[2];
INT64 v31[12];
v7 = a2;
KeyValueInformationClass = a3;
*(_QWORD *)v30 = a4;
ResultLength = (unsigned int *)a6;
memset(v31, 0i64, 0x58u);
*(_OWORD *)v27 = 0i64;
WORD1(v27[0]) = -1;
v8 = 0;
*(_OWORD *)Privileges = 0i64;
CmpValueEnumStackInitialize(v31);
v9 = *(_QWORD *)(a1 + 8);
KcbAtLayerHeight = 0i64;
v11 = 0i64;
v25 = 0xFFFFFFFFi64;
v23 = 0xFFFFFFFFi64;
v24 = 0xFFFFFFFFi64;
started = CmpStartKcbStackForTopLayerKcb((INT64)v27, v9);
if( started < 0 )
goto LABEL_22;
CmpLockKcbStackShared((INT64)v27);
v8 = 1;
if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, 0i64) )
{
started = (*(_BYTE *)(a1 + 48) & 1) != 0 ? -1073740763 : -1073741444;
goto LABEL_22;
}
v13 = WORD1(v27[0]);
if( SWORD1(v27[0]) <= 0 )
goto LABEL_15;
do
{
KcbAtLayerHeight = CmpGetKcbAtLayerHeight((INT64)v27, v13);
if( *(_DWORD *)(KcbAtLayerHeight + 40) != -1 )
v15 = 1;
v13 = v16 + v14;
}
while( v13 > 0 );
if( !v15 )
{
LABEL_15:
KcbAtLayerHeight = v27[1];
v19 = (_CM_KEY_CONTROL_BLOCK *)v27[1];
KeyNodeForKcb = CmpGetKeyNodeForKcb(v27[1], (INT64)&v23, 0);
v11 = KeyNodeForKcb;
if( *(_DWORD *)(KeyNodeForKcb + 36) <= (unsigned int)v7 )
{
started = -2147483622;
goto LABEL_22;
}
v18 = *(_DWORD *)((*(__int64(__fastcall **)(_QWORD, _QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 8i64))(
*(_QWORD *)(KcbAtLayerHeight + 32),
*(unsigned int *)(KeyNodeForKcb + 40),
&v24)
+ 4 * v7);
(*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
*(_QWORD *)(KcbAtLayerHeight + 32),
&v24);
(*(void(__fastcall **)(_QWORD, INT64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
*(_QWORD *)(KcbAtLayerHeight + 32),
&v23);
goto LABEL_18;
}
started = CmpValueEnumStackStartFromKcbStack((INT64)v31, (INT64)v27);
if( started < 0 )
goto LABEL_22;
started = CmpValueEnumStackAdvance((__int64)v31);
if( started < 0 )
goto LABEL_22;
v17 = 0;
if( !(_DWORD)v7 )
{
LABEL_14:
v18 = v31[0];
v19 = (_CM_KEY_CONTROL_BLOCK *)CmpGetKcbAtLayerHeight((INT64)v27, SHIWORD(v31[0]));
LABEL_18:
v21 = (_CM_KEY_VALUE *)v19->KeyHash.KeyHive->GetCellRoutine(v19->KeyHash.KeyHive, v18, (_HV_GET_CELL_CONTEXT *)&v25);
started = CmpQueryKeyValueData(v19, v18, v21, KeyValueInformationClass, *(void **)v30, a5, ResultLength);
if( started >= 0 )
started = 0;
v11 = 0i64;
if( v21 )
v19->KeyHash.KeyHive->ReleaseCellRoutine(v19->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)&v25);
goto LABEL_22;
}
while( 1 )
{
started = CmpValueEnumStackAdvance((__int64)v31);
if( started < 0 )
break;
if( ++v17 >= (unsigned int)v7 )
goto LABEL_14;
}
LABEL_22:
CmpValueEnumStackCleanup((INT64)v31);
if( v11 )
(*(void(__fastcall **)(_QWORD, INT64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
*(_QWORD *)(KcbAtLayerHeight + 32),
&v23);
if( v8 )
CmpUnlockKcbStack((INT64)v27);
if( Privileges[1] )
CmSiFreeMemory(Privileges[1]);
return(unsigned int)started;
}Referenced by:
CmEnumerateValueKey