CmpSyncSubKeysAfterDelete

bool __fastcall CmpSyncSubKeysAfterDelete(__int64 a1, __int64 a2, __int64 a3, _DWORD *a4, _WORD *a5){
  unsigned int v5; 
  int SubKeyByNumber; 
  _CM_KEY_NODE *v10; 
  _CM_KEY_NODE *v11; 
  UINT CellIndex; 
  UINT CellIndex_4; 
  int v15[2]; 
  _UNICODE_STRING KeyName; 

  CellIndex = 0;
  v5 = 0;
  v15[0] = -1;
  v15[1] = 0;
  KeyName = 0i64;
  while( 1 )
  {
    SubKeyByNumber = CmpFindSubKeyByNumber((_HHIVE *)a3, (_CM_KEY_NODE *)a4, v5, &CellIndex);
    if( SubKeyByNumber < 0 || CellIndex == -1 )
      return SubKeyByNumber >= 0;
    v10 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(a3 + 8))(a3, CellIndex, v15);
    v11 = v10;
    if( !v10 )
    {
      SubKeyByNumber = -1073741670;
LABEL_13:
      if( v11 )
        (*(void(__fastcall **)(__int64, int *))(a3 + 16))(a3, v15);
      return SubKeyByNumber >= 0;
    }
    CmpInitializeKeyNameString(v10, &KeyName, a5);
    CellIndex_4 = 0;
    CmpFindSubKeyByNameWithStatus((_HHIVE *)a1, (_CM_KEY_NODE *)a2, &KeyName, &CellIndex_4);
    if( CellIndex_4 == -1 )
    {
      if( v11->SubKeyCounts[0] + v11->SubKeyCounts[1] )
        CmpDeleteTree(a3, CellIndex);
      SubKeyByNumber = CmpFreeKeyByCell(a3, CellIndex, 1);
      if( SubKeyByNumber < 0 )
        goto LABEL_13;
    }
    else
    {
      ++v5;
    }
    (*(void(__fastcall **)(__int64, int *))(a3 + 16))(a3, v15);
  }
}

Referenced by:

CmpCopySyncTree2