CmpEnumerateAllOpenSubKeys

void __fastcall CmpEnumerateAllOpenSubKeys(__int64 a1, char a2, __int64 (__fastcall *a3)(__int64, __int64), __int64 a4){
  INT64 v4; 
  __int64 v9; 
  unsigned int v10; 
  int v11; 
  int v12; 

  v4 = *(_QWORD *)(a1 + 32);
  CmpCleanUpKCBCacheTable(v4);
  if( *(_QWORD *)a1 != 1i64 && ((*(_DWORD *)(a1 + 184) & 0x40000) == 0 || *(_QWORD *)a1 != 2i64) )
  {
    v9 = 0i64;
    v10 = 0;
    if( *(_DWORD *)(v4 + 1648) )
    {
      while( 1 )
      {
        v11 = CmpEnumerateKcbCacheBucket(a1, *(_QWORD *)(v4 + 1640) + 24i64 * v10, a3, a4);
        if( v11 == 1 )
          break;
        if( v11 == 2 )
          --v10;
        if( ++v10 >= *(_DWORD *)(v4 + 1648) )
          goto LABEL_9;
      }
    }
    else
    {
LABEL_9:
      if( a2 && *(_DWORD *)(v4 + 1664) )
      {
        do
        {
          v12 = CmpEnumerateKcbCacheBucket(a1, *(_QWORD *)(v4 + 1656) + 24 * v9, a3, a4);
          if( v12 == 1 )
            break;
          if( v12 == 2 )
            LODWORD(v9) = v9 - 1;
          v9 = (unsigned int)(v9 + 1);
        }
        while( (unsigned int)v9 < *(_DWORD *)(v4 + 1664) );
      }
    }
  }
}

Referenced by:

CmpDoesKeyHaveOpenSubkeys
CmpInvalidateSubtree
CmpPrepareForSubtreeInvalidation
CmpSearchForOpenSubKeys