CmEnumerateValueKeyFromMergedView
__int64 __fastcall CmEnumerateValueKeyFromMergedView(
__int64 a1,
__int64 a2,
char a3,
unsigned int a4,
int a5,
_DWORD *Size,
int a7,
__int64 a8,
__int64 a9){
CM_TRANS *v12;
int KeyValueData;
unsigned int *v14;
_CM_KEY_CONTROL_BLOCK *v15;
__int64 v16;
char v17;
_CHILD_LIST *p_TransValueCache;
__int64 v19;
__int64 v20;
__int64 v21;
unsigned int v22;
unsigned int v23;
__int64 v24;
__int64 v25;
_HHIVE *KeyHive;
__int64 v27;
_CELL_DATA *(__fastcall *GetCellRoutine)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *);
__int64 v29;
_CM_KEY_VALUE *v30;
__int16 v31;
_CM_KEY_CONTROL_BLOCK *v32;
__int64 v33;
unsigned int v34;
__int64 v35;
__int64 v36;
_CELL_DATA *(__fastcall *v37)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *);
unsigned int v39;
int v40;
CM_TRANS *CmTrans;
int v42[2];
__int64 v43;
_CHILD_LIST *v44;
int v45[2];
__int64 v46;
int v47[2];
int v48[2];
int v49[2];
__int64 v50;
__int128 v51;
int v52;
CmTrans = 0i64;
v50 = 0i64;
v48[0] = -1;
v48[1] = 0;
v46 = 0i64;
v49[0] = -1;
v12 = 0i64;
v49[1] = 0;
KeyValueData = 0;
v44 = 0i64;
v14 = 0i64;
v52 = 0;
v39 = 0;
v43 = 0i64;
v45[0] = -1;
v45[1] = 0;
v47[0] = -1;
v47[1] = 0;
v42[0] = -1;
v42[1] = 0;
v40 = 0;
v51 = 0i64;
if( !a3 )
CmpLockRegistry();
if( *(_QWORD *)(a1 + 56) || *(_QWORD *)(a1 + 64) )
{
KeyValueData = CmpTransSearchAddTransFromKeyBody((_CM_KEY_BODY *)a1, &CmTrans);
if( KeyValueData < 0 )
{
if( !a3 )
goto LABEL_67;
return(unsigned int)KeyValueData;
}
v12 = CmTrans;
}
v15 = *(_CM_KEY_CONTROL_BLOCK **)(a1 + 8);
v16 = *(_QWORD *)(a2 + 8);
if( !a3 )
CmpLockTwoKcbsShared(*(_CM_KEY_CONTROL_BLOCK **)(a1 + 8), *(_CM_KEY_CONTROL_BLOCK **)(a2 + 8));
if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, v12) )
{
v17 = *(_BYTE *)(a1 + 48);
LABEL_13:
KeyValueData = (v17 & 1) != 0 ? -1073740763 : -1073741444;
goto LABEL_65;
}
if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a2, v12) )
{
v17 = *(_BYTE *)(a2 + 48);
goto LABEL_13;
}
if( !v12 )
goto LABEL_23;
if( v15->TransValueListOwner == v12 )
{
p_TransValueCache = &v15->TransValueCache;
v44 = &v15->TransValueCache;
}
else
{
p_TransValueCache = 0i64;
}
if( *(CM_TRANS **)(v16 + 288) == v12 )
v14 = (unsigned int *)(v16 + 280);
if( !p_TransValueCache )
{
LABEL_23:
v19 = (__int64)v15->KeyHash.KeyHive->GetCellRoutine(
v15->KeyHash.KeyHive,
v15->KeyHash.KeyCell,
(_HV_GET_CELL_CONTEXT *)v48);
v50 = v19;
if( !v19 )
{
KeyValueData = -1073741670;
goto LABEL_65;
}
p_TransValueCache = (_CHILD_LIST *)(v19 + 36);
v44 = (_CHILD_LIST *)(v19 + 36);
}
if( v14 )
goto LABEL_30;
v20 = (*(__int64(__fastcall **)(_QWORD, _QWORD, int *))(*(_QWORD *)(v16 + 32) + 8i64))(
*(_QWORD *)(v16 + 32),
*(unsigned int *)(v16 + 40),
v49);
v46 = v20;
v21 = v20;
if( v20 )
{
v14 = (unsigned int *)(v20 + 36);
LABEL_30:
v22 = 0;
v23 = 0;
while( v23 < p_TransValueCache->Count )
{
v24 = v43;
if( !v43 )
{
v24 = (__int64)v15->KeyHash.KeyHive->GetCellRoutine(
v15->KeyHash.KeyHive,
p_TransValueCache->List,
(_HV_GET_CELL_CONTEXT *)v45);
v43 = v24;
if( !v24 )
{
KeyValueData = -1073741670;
goto LABEL_60;
}
}
v25 = v23;
KeyHive = v15->KeyHash.KeyHive;
v27 = *(unsigned int *)(v24 + 4 * v25);
GetCellRoutine = KeyHive->GetCellRoutine;
LODWORD(CmTrans) = v27;
v29 = (__int64)GetCellRoutine(KeyHive, v27, (_HV_GET_CELL_CONTEXT *)v42);
v30 = (_CM_KEY_VALUE *)v29;
if( !v29 )
{
KeyValueData = -1073741670;
LABEL_46:
v33 = 0i64;
goto LABEL_56;
}
v31 = *(_WORD *)(v29 + 16);
*((_QWORD *)&v51 + 1) = v29 + 20;
LOWORD(v51) = *(_WORD *)(v29 + 2);
if( CmpFindNameInList(*(_QWORD *)(v16 + 32), v14, (__int64)&v51, (v31 & 1) << 16, 0i64, &v40) && v40 == -1 )
{
if( v22 == a4 )
{
v32 = v15;
v33 = 0i64;
goto LABEL_54;
}
v39 = ++v22;
}
v23 = ++v52;
v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v42);
if( v43 )
{
v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v45);
v43 = 0i64;
}
if( v22 > a4 )
goto LABEL_46;
p_TransValueCache = v44;
}
v34 = v22 + *v14;
if( v34 <= a4 )
{
KeyValueData = -2147483622;
if( a9 )
*(_DWORD *)a9 = v34;
goto LABEL_46;
}
v35 = (*(__int64(__fastcall **)(_QWORD, _QWORD, int *))(*(_QWORD *)(v16 + 32) + 8i64))(
*(_QWORD *)(v16 + 32),
v14[1],
v47);
v33 = v35;
if( !v35
|| (KeyHive = *(_HHIVE **)(v16 + 32),
v36 = *(unsigned int *)(v35 + 4i64 * (a4 - v39)),
v37 = KeyHive->GetCellRoutine,
LODWORD(CmTrans) = v36,
(v30 = (_CM_KEY_VALUE *)v37(KeyHive, v36, (_HV_GET_CELL_CONTEXT *)v42)) == 0i64) )
{
KeyValueData = -1073741670;
goto LABEL_56;
}
v32 = (_CM_KEY_CONTROL_BLOCK *)v16;
LABEL_54:
KeyValueData = CmpQueryKeyValueData(
v32,
(unsigned int)CmTrans,
v30,
(_KEY_VALUE_INFORMATION_CLASS)a5,
Size,
a7,
(unsigned int *)a8);
if( v30 )
KeyHive->ReleaseCellRoutine(KeyHive, (_HV_GET_CELL_CONTEXT *)v42);
LABEL_56:
if( v43 )
v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v45);
if( v33 )
(*(void(__fastcall **)(_QWORD, int *))(*(_QWORD *)(v16 + 32) + 16i64))(*(_QWORD *)(v16 + 32), v47);
LABEL_60:
v21 = v46;
goto LABEL_61;
}
KeyValueData = -1073741670;
LABEL_61:
if( v50 )
v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v48);
if( v21 )
(*(void(__fastcall **)(_QWORD, int *))(*(_QWORD *)(v16 + 32) + 16i64))(*(_QWORD *)(v16 + 32), v49);
LABEL_65:
if( !a3 )
{
CmpUnlockTwoKcbs(v15, (_CM_KEY_CONTROL_BLOCK *)v16);
LABEL_67:
CmpUnlockRegistry();
}
return(unsigned int)KeyValueData;
}Referenced by:
CmQueryKey
NtEnumerateValueKey