CmEnumerateKey
INT64 __fastcall CmEnumerateKey(WCHAR *String){
__int64 v1;
unsigned int v2;
unsigned int v3;
__int64 v4;
LIST_ENTRY *v6;
unsigned int v7;
_CM_TRANS *CmTrans;
INT64 v9;
char v10;
_CM_KEY_CONTROL_BLOCK *v11;
int SubKeyByNumber;
__int64 v13;
INT64 v14;
_CM_KEY_CONTROL_BLOCK *LockedKcb;
_CM_KEY_CONTROL_BLOCK *v16;
unsigned int v17;
INT64 v18;
__int64 v19;
bool v21;
LIST_ENTRY **v22;
INT64 v23;
INT64 v24;
_CM_KEY_CONTROL_BLOCK *ParentKcb;
UINT64 ChildCell;
int v27[2];
unsigned int Number;
unsigned int Number_4;
LIST_ENTRY *v30;
INT64 a9;
INT64 a6;
UINT64 *v33;
INT64 v34;
INT64 a5[2];
struct _PRIVILEGE_SET *v36;
__int64 v37;
KAPC_STATE ApcState;
INT64 v39;
unsigned int v40;
UINT64 *v41;
v4 = v1;
v6 = 0i64;
v7 = v2;
v34 = v39;
CmTrans = 0i64;
v33 = v41;
v27[1] = 0;
Number_4 = v3;
Number = v2;
v37 = v1;
HIDWORD(ChildCell) = 0;
memset(&ApcState, 0, sizeof(ApcState));
a6 = 0i64;
v27[0] = -1;
a9 = 0i64;
*(_OWORD *)a5 = 0i64;
v30 = 0i64;
v36 = 0i64;
CmpInitializeDelayDerefContext(a5);
CmpAttachToRegistryProcess(&ApcState);
if( *(_WORD *)(*((_QWORD *)String + 1) + 66i64) )
{
do
{
v21 = (unsigned int)v6 <= 0xA;
LODWORD(v6) = (_DWORD)v6 + 1;
SubKeyByNumber = CmpEnumerateLayeredKey((__int64)String, v7, Number_4, v34, v40, (unsigned int *)v33, &v36, v21);
}
while( SubKeyByNumber == -1073741267 );
v10 = 0;
goto LABEL_24;
}
if( *((_QWORD *)String + 7) || *((_QWORD *)String + 8) )
CmpLockRegistryExclusive();
else
CmpLockRegistry();
v9 = *((_QWORD *)String + 1);
v10 = 1;
if( v4 )
v11 = *(_CM_KEY_CONTROL_BLOCK **)(v4 + 8);
else
v11 = 0i64;
CmpLockTwoKcbsShared(v11, (_CM_KEY_CONTROL_BLOCK *)v9);
SubKeyByNumber = CmpPerformKeyBodyDeletionCheck((__int64)String, 0i64);
if( SubKeyByNumber >= 0 )
{
if( !*((_QWORD *)String + 7) && !*((_QWORD *)String + 8)
|| (SubKeyByNumber = CmpTransSearchAddTransFromKeyBody((_CM_KEY_BODY *)String, (_CM_TRANS **)&a9),
SubKeyByNumber >= 0)
&& (CmTrans = (_CM_TRANS *)a9,
SubKeyByNumber = CmpPerformKeyBodyDeletionCheck((__int64)String, a9),
SubKeyByNumber >= 0) )
{
v13 = v37;
if( v37 )
{
SubKeyByNumber = CmpPerformKeyBodyDeletionCheck(v37, (__int64)CmTrans);
if( SubKeyByNumber < 0 )
goto LABEL_22;
}
else if( !CmpVEEnabled || (*(_DWORD *)(v9 + 184) & 0x1000000) == 0 )
{
v14 = *(_QWORD *)(v9 + 32);
if( CmTrans )
{
LockedKcb = v11;
v16 = (_CM_KEY_CONTROL_BLOCK *)v9;
}
else
{
LockedKcb = 0i64;
v16 = 0i64;
}
SubKeyByNumber = CmpFindSubKeyByNumberEx(
(_HHIVE *)v14,
*(unsigned int *)(v9 + 40),
Number,
(UINT64 *)((char *)&ChildCell + 4),
v16,
LockedKcb,
CmTrans,
(_CM_KEY_CONTROL_BLOCK **)a5);
if( SubKeyByNumber >= 0 )
goto LABEL_16;
goto LABEL_28;
}
v22 = &v30;
if( !CmTrans )
v22 = 0i64;
v23 = v9;
v24 = (INT64)v11;
if( !v13 )
v23 = 0i64;
if( !v13 )
v24 = v9;
SubKeyByNumber = CmpFindSubKeyByNumberFromMergedView(
v24,
v23,
Number,
(INT64)CmTrans,
(INT64)a5,
(INT64)&a6,
(INT64)&ChildCell + 4,
(INT64)v22,
(INT64)&a9);
if( SubKeyByNumber >= 0 )
{
v14 = a6;
LABEL_16:
v17 = HIDWORD(ChildCell);
if( HIDWORD(ChildCell) != -1 )
{
v18 = (*(__int64(__fastcall **)(INT64, _QWORD, int *))(v14 + 8))(v14, HIDWORD(ChildCell), v27);
if( CmpKeyNodeNeedsAccessBitUpdate(v14, v18) )
{
(*(void(__fastcall **)(__int64, int *))(v14 + 16))(v19, v27);
HvLockHiveFlusherShared(v14);
v18 = (*(__int64(__fastcall **)(INT64, _QWORD, int *))(v14 + 8))(v14, v17, v27);
CmpUpdateKeyNodeAccessBits(v14, v18, v17);
HvUnlockHiveFlusherShared(v14);
}
v6 = v30;
LODWORD(ParentKcb) = v40;
SubKeyByNumber = CmpQueryKeyDataFromNode(v14, v18, Number_4, v34, (UINT64)ParentKcb, v33, v30, (INT64)CmTrans);
if( v18 )
(*(void(__fastcall **)(INT64, int *))(v14 + 16))(v14, v27);
v10 = 1;
goto LABEL_22;
}
SubKeyByNumber = -2147483622;
}
LABEL_28:
v6 = v30;
}
}
LABEL_22:
CmpUnlockTwoKcbs(v11, (_CM_KEY_CONTROL_BLOCK *)v9);
if( v6 )
CmpDereferenceKeyControlBlock((UINT64)v6);
LABEL_24:
CmpDrainDelayDerefContext((UINT64 **)a5);
if( v10 )
CmpUnlockRegistry();
CmpDetachFromRegistryProcess(&ApcState);
return(unsigned int)SubKeyByNumber;
}Referenced by:
NtEnumerateKey