CmpUpdateParentForEachSon

CHAR __fastcall CmpUpdateParentForEachSon(UINT64 a1, INT64 a2, CHAR a3){
  unsigned int v4; 
  _CM_KEY_NODE *v6; 
  CHAR v7; 
  unsigned int v8; 
  unsigned int v9; 
  __int64 v10; 
  int v12[14]; 
  UINT ChildCell; 
  int v14; 
  int v15; 
  v12[0] = -1;
  ChildCell = 0;
  v14 = -1;
  v12[1] = 0;
  v4 = a2;
  v15 = 0;
  v6 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(UINT64, INT64, int *))(a1 + 8))(a1, a2, v12);
  if( !v6 )
    return 0;
  if( !a3 || (v7 = CmpMarkAllChildrenDirty(a1, v4)) != 0 )
  {
    v7 = 1;
    v8 = 0;
    v9 = v6->SubKeyCounts[0] + v6->SubKeyCounts[1];
    if( v9 )
    {
      while( 1 )
      {
        CmpFindSubKeyByNumber((_HHIVE *)a1, v6, v8, &ChildCell);
        if( ChildCell == -1 )
          break;
        v10 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(a1 + 8))(a1, ChildCell, &v14);
        if( !v10 )
          break;
        *(_DWORD *)(v10 + 16) = v4;
        (*(void(__fastcall **)(UINT64, int *))(a1 + 16))(a1, &v14);
        if( ++v8 >= v9 )
          goto LABEL_11;
      }
      v7 = 0;
    }
  }
LABEL_11:
  (*(void(__fastcall **)(UINT64, int *))(a1 + 16))(a1, v12);
  return v7;
}

Referenced by:

CmRenameKey
CmpCommitRenameKeyUoW
CmpLightWeightCommitRenameKeyUoW