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