CmpMarkKeyDirty
char __fastcall CmpMarkKeyDirty(PVOID Hive, PVOID CellIndex, char a3){
char v3;
unsigned int v4;
__int64(__fastcall *v6)(PVOID, PVOID, int *);
__int64 v7;
__int64 v8;
__int64 v9;
void *v10;
void *v11;
__int64 v12;
__int64 v13;
char v14;
__int64 v16;
__int64 v17;
bool v18;
void(__fastcall *v19)(PVOID, int *);
int v20[2];
int v21[2];
int v22[4];
int v23;
int v24;
char v25;
v25 = a3;
v22[1] = 0;
v3 = a3;
v21[1] = 0;
v24 = 0;
v4 = (unsigned int)CellIndex;
v20[1] = 0;
v6 = (__int64(__fastcall *)(PVOID, PVOID, int *))*((_QWORD *)Hive + 1);
v7 = 0i64;
v22[0] = -1;
v21[0] = -1;
v23 = -1;
v20[0] = -1;
v8 = v6(Hive, CellIndex, v22);
v9 = v8;
if( !v8 )
return 0;
if( (*(_BYTE *)(v8 + 2) & 2) == 0 )
{
if( HvpMarkCellDirty(Hive, (PVOID)v4, 0, CmHiveDirtyNormal) )
{
v10 = (void *)*(unsigned int *)(v9 + 48);
if( (_DWORD)v10 == -1 || HvpMarkCellDirty(Hive, v10, 0, CmHiveDirtyNormal) )
{
v11 = (void *)*(unsigned int *)(v9 + 44);
if( (_DWORD)v11 == -1 )
goto LABEL_11;
if( HvpMarkCellDirty(Hive, v11, 0, CmHiveDirtyNormal) )
{
v12 = (*((__int64(__fastcall **)(PVOID, _QWORD, int *))Hive + 1))(Hive, *(unsigned int *)(v9 + 44), &v23);
v13 = v12;
if( v12 )
{
if( HvpMarkCellDirty(Hive, (PVOID)*(unsigned int *)(v12 + 4), 0, CmHiveDirtyNormal)
&& HvpMarkCellDirty(Hive, (PVOID)*(unsigned int *)(v13 + 8), 0, CmHiveDirtyNormal) )
{
(*((void(__fastcall **)(PVOID, int *))Hive + 2))(Hive, &v23);
LABEL_11:
v14 = 1;
if( (*(_BYTE *)(v9 + 2) & 0x40) != 0 || !*(_DWORD *)(v9 + 36) )
goto LABEL_13;
if( HvpMarkCellDirty(Hive, (PVOID)*(unsigned int *)(v9 + 40), 0, CmHiveDirtyNormal) )
{
v7 = (*((__int64(__fastcall **)(PVOID, _QWORD, int *))Hive + 1))(Hive, *(unsigned int *)(v9 + 40), v21);
if( v7 )
{
v16 = 0i64;
if( *(_DWORD *)(v9 + 36) )
{
while( HvpMarkCellDirty(Hive, (PVOID)*(unsigned int *)(v7 + 4 * v16), 0, CmHiveDirtyNormal) )
{
v17 = (*((__int64(__fastcall **)(PVOID, _QWORD, int *))Hive + 1))(
Hive,
*(unsigned int *)(v7 + 4 * v16),
v20);
if( !v17 )
break;
v18 = CmpMarkValueDataDirty(Hive, v17) == 0;
v19 = (void(__fastcall *)(PVOID, int *))*((_QWORD *)Hive + 2);
if( v18 )
{
v19(Hive, v20);
goto LABEL_30;
}
v19(Hive, v20);
v16 = (unsigned int)(v16 + 1);
if( (unsigned int)v16 >= *(_DWORD *)(v9 + 36) )
goto LABEL_28;
}
goto LABEL_30;
}
LABEL_28:
v3 = v25;
LABEL_13:
if( (*(_BYTE *)(v9 + 2) & 4) != 0
|| !v3
|| CmpMarkIndexDirty(Hive, *(_DWORD *)(v9 + 16), v4)
&& HvpMarkCellDirty(Hive, (PVOID)*(unsigned int *)(v9 + 16), 0, CmHiveDirtyNormal) )
{
LABEL_17:
if( v7 )
(*((void(__fastcall **)(PVOID, int *))Hive + 2))(Hive, v21);
goto LABEL_19;
}
LABEL_30:
v14 = 0;
goto LABEL_17;
}
}
goto LABEL_33;
}
(*((void(__fastcall **)(PVOID, int *))Hive + 2))(Hive, &v23);
}
}
}
}
LABEL_33:
v14 = 0;
goto LABEL_19;
}
v14 = 1;
LABEL_19:
(*((void(__fastcall **)(PVOID, int *))Hive + 2))(Hive, v22);
return v14;
}Referenced by:
CmDeleteLayeredKey
CmpCreateChild
CmpFreeKeyByCell
CmpLightWeightPrepareDeleteKeyUoW