CmpSyncSubKeysAfterDelete

BOOL __fastcall CmpSyncSubKeysAfterDelete(INT64 a1, INT64 a2, UINT64 a3, _DWORD *a4, WCHAR *a5){
  unsigned int v5; 
  _CM_KEY_NODE *v9; 
  int v10; 
  _CM_KEY_NODE *v11; 
  UINT ChildCell; 
  UINT Cell; 
  int v15[2]; 
  _UNICODE_STRING KeyName; 
  ChildCell = 0;
  v5 = 0;
  v15[0] = -1;
  v15[1] = 0;
  KeyName = 0i64;
  while( 1 )
  {
    LODWORD(v9) = CmpFindSubKeyByNumber((_HHIVE *)a3, (_CM_KEY_NODE *)a4, v5, &ChildCell);
    v10 = (int)v9;
    if( (int)v9 < 0 || ChildCell == -1 )
      break;
    v9 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(UINT64, _QWORD, int *))(a3 + 8))(a3, ChildCell, v15);
    v11 = v9;
    if( !v9 )
    {
      v10 = -1073741670;
LABEL_13:
      if( v11 )
        LODWORD(v9) = (*(__int64(__fastcall **)(UINT64, int *))(a3 + 16))(a3, v15);
      break;
    }
    CmpInitializeKeyNameString(v9, &KeyName, a5);
    Cell = 0;
    CmpFindSubKeyByNameWithStatus((_HHIVE *)a1, (_CM_KEY_NODE *)a2, &KeyName, &Cell);
    if( Cell == -1 )
    {
      if( v11->SubKeyCounts[0] + v11->SubKeyCounts[1] )
        CmpDeleteTree(a3, ChildCell);
      LODWORD(v9) = CmpFreeKeyByCell((_HHIVE *)a3, ChildCell, 1u);
      v10 = (int)v9;
      if( (int)v9 < 0 )
        goto LABEL_13;
    }
    else
    {
      ++v5;
    }
    (*(void(__fastcall **)(UINT64, int *))(a3 + 16))(a3, v15);
  }
  LOBYTE(v9) = v10 >= 0;
  return(int)v9;
}

Referenced by:

CmpCopySyncTree2