CmpEnumerateLayeredKey
INT64 __stdcall CmpEnumerateLayeredKey(
CM_KEY_BODY *KeyBody,
UINT64 Index,
KEY_INFORMATION_CLASS KeyInformationClass,
VOID *KeyInformation,
UINT64 Length,
UINT64 *ResultLength){
unsigned int v6;
char v8;
__int64 KcbAtLayerHeight;
_PRIVILEGE_SET *v10;
_PRIVILEGE_SET *v11;
__int64 v12;
int started;
INT16 v14;
__int16 v15;
char v16;
__int64 v17;
__int16 v18;
_CM_KEY_NODE *KeyNodeForKcb;
_CM_KEY_NODE *v20;
_HHIVE *v21;
unsigned int Control;
unsigned int v24;
int v25;
int ResumeContext;
int KeyDataFromKeyNodeStack;
INT64 a5;
_CM_KEY_NODE *v29;
_KEY_INFORMATION_CLASS KeyInformationClassa;
unsigned int v31;
UINT ChildCell;
__int64 v33;
INT64 v34;
INT64 v35[2];
__int128 v36;
unsigned int *v37;
void *KeyInformationa;
_CM_KEY_NODE *v39;
UINT64 *RegLockHeldEx[2];
_QWORD *v41;
INT16 a1[176];
_PRIVILEGE_SET **v43;
char v44;
v6 = Index;
KeyInformationClassa = KeyInformationClass;
v31 = Index;
v37 = (unsigned int *)ResultLength;
v41 = v43;
KeyInformationa = KeyInformation;
memset(a1, 0i64, sizeof(a1));
ChildCell = 0;
*(_OWORD *)v35 = 0i64;
WORD1(v35[0]) = -1;
v8 = 0;
*(_OWORD *)RegLockHeldEx = 0i64;
v36 = 0i64;
CmpKeyEnumStackInitialize(a1);
v34 = 0xFFFFFFFFi64;
KcbAtLayerHeight = 0i64;
v33 = 0xFFFFFFFFi64;
v10 = 0i64;
v29 = 0i64;
v39 = 0i64;
CmpInitializeDelayDerefContext(RegLockHeldEx);
v11 = *v43;
*v43 = (_PRIVILEGE_SET *)(v12 & (unsigned __int64)*v43);
a5 = (INT64)v11;
if( KeyInformationClassa == KeyFullInformation )
CmpLockRegistryExclusive();
else
CmpLockRegistry();
started = CmpStartKcbStackForTopLayerKcb((INT64)v35, (INT64)KeyBody->KeyControlBlock);
if( started < 0 )
{
KeyNodeForKcb = 0i64;
}
else
{
CmpLockKcbStackShared((INT64)v35);
v8 = 1;
started = CmpPerformKeyBodyDeletionCheck(KeyBody, 0i64);
if( started < 0 )
{
KeyNodeForKcb = 0i64;
}
else
{
v14 = WORD1(v35[0]);
if( SWORD1(v35[0]) <= 0 )
goto LABEL_10;
do
{
KcbAtLayerHeight = CmpGetKcbAtLayerHeight((INT64)v35, v14);
if( *(_DWORD *)(KcbAtLayerHeight + 40) != -1 )
v16 = 1;
v14 = v18 + v15;
}
while( v14 > 0 );
if( v16 )
{
if( v11
|| (v11 = (_PRIVILEGE_SET *)_InterlockedExchange64(
(volatile __int64 *)&KeyBody->EnumerationResumeContext,
v17),
(a5 = (INT64)v11) != 0) )
{
if( (unsigned int)CmpKeyEnumStackVerifyResumeContext((INT64)v35) == -1073741735 || v11->Control > v6 )
{
v10 = v11;
v11 = 0i64;
a5 = 0i64;
}
}
started = CmpKeyEnumStackStartFromKcbStack(a1, (INT64)v35);
if( started < 0
|| (!v11 ? (Control = 0) : (Control = v11->Control, v10 = v11, v11 = 0i64, a5 = 0i64),
started = CmpKeyEnumStackAdvance(a1),
started < 0) )
{
LABEL_52:
KeyNodeForKcb = 0i64;
}
else
{
v24 = Control;
if( Control >= v31 )
{
LABEL_45:
ResumeContext = CmpKeyEnumStackCreateResumeContext((INT64)v35, (INT64)a1, v24, 0, (INT64)&a5);
v11 = (_PRIVILEGE_SET *)a5;
if( ResumeContext >= 0 )
v11 = (_PRIVILEGE_SET *)_InterlockedExchange64((volatile __int64 *)&KeyBody->EnumerationResumeContext, a5);
KeyDataFromKeyNodeStack = CmpQueryKeyDataFromKeyNodeStack(
&a1[4],
KeyInformationClassa,
(__int64)KeyInformationa,
Length,
v37);
KeyNodeForKcb = v29;
started = KeyDataFromKeyNodeStack;
if( KeyDataFromKeyNodeStack >= 0 )
started = 0;
v8 = 1;
}
else
{
while( !CmpIsRegistryLockContended() || v24 - Control < 0xA || !v44 )
{
started = CmpKeyEnumStackAdvance(a1);
if( started < 0 )
{
v8 = 1;
goto LABEL_52;
}
if( ++v24 >= v31 )
goto LABEL_45;
}
v25 = CmpKeyEnumStackCreateResumeContext((INT64)v35, (INT64)a1, v24, 1, (INT64)&a5);
v8 = 1;
started = v25;
KeyNodeForKcb = 0i64;
if( v25 < 0 )
{
v11 = (_PRIVILEGE_SET *)a5;
}
else
{
v11 = 0i64;
started = -1073741267;
*v41 = a5;
}
}
}
}
else
{
LABEL_10:
KcbAtLayerHeight = v35[1];
KeyNodeForKcb = (_CM_KEY_NODE *)CmpGetKeyNodeForKcb(v35[1], (INT64)&v34, 0);
started = CmpFindSubKeyByNumber(*(_HHIVE **)(KcbAtLayerHeight + 32), KeyNodeForKcb, v6, &ChildCell);
if( started >= 0 )
{
if( ChildCell == -1 )
{
started = -2147483622;
}
else
{
v20 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(_QWORD, _QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32)
+ 8i64))(
*(_QWORD *)(KcbAtLayerHeight + 32),
ChildCell,
&v33);
v21 = *(_HHIVE **)(KcbAtLayerHeight + 32);
v39 = v20;
started = CmpQueryKeyDataFromNode(v21, v20, KeyInformationClassa, KeyInformationa, Length, v37, 0i64, 0i64);
if( started >= 0 )
started = 0;
}
}
}
}
}
CmpKeyEnumStackCleanup((INT64)a1);
if( v39 )
(*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
*(_QWORD *)(KcbAtLayerHeight + 32),
&v33);
if( KeyNodeForKcb )
CmpReleaseKeyNodeForKcb(KcbAtLayerHeight);
if( v8 )
CmpUnlockKcbStack((INT64)v35);
CmpCleanupKcbStack((INT64)v35);
if( v11 )
CmpKeyEnumStackFreeResumeContext(v11);
if( v10 )
CmpKeyEnumStackFreeResumeContext(v10);
CmpDrainDelayDerefContext(RegLockHeldEx);
CmpUnlockRegistry();
return(unsigned int)started;
}Referenced by:
CmEnumerateKey