CmEnumerateValueFromLayeredKey

__int64 __fastcall CmEnumerateValueFromLayeredKey(__int64 a1, unsigned int a2, int a3, __int64 a4, int a5, __int64 a6){
  __int64 v7; 
  char v8; 
  INT64 v9; 
  INT64 KcbAtLayerHeight; 
  INT64 v11; 
  int started; 
  INT16 v13; 
  __int16 v14; 
  char v15; 
  __int16 v16; 
  int v17; 
  unsigned int v18; 
  _CM_KEY_CONTROL_BLOCK *v19; 
  INT64 KeyNodeForKcb; 
  _CM_KEY_VALUE *v21; 
  INT64 v23; 
  __int64 v24; 
  __int64 v25; 
  _KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; 
  INT64 v27[2]; 
  PPRIVILEGE_SET Privileges[2]; 
  unsigned int *ResultLength; 
  size_t v30[2]; 
  INT64 v31[12]; 

  v7 = a2;
  KeyValueInformationClass = a3;
  *(_QWORD *)v30 = a4;
  ResultLength = (unsigned int *)a6;
  memset(v31, 0i64, 0x58u);
  *(_OWORD *)v27 = 0i64;
  WORD1(v27[0]) = -1;
  v8 = 0;
  *(_OWORD *)Privileges = 0i64;
  CmpValueEnumStackInitialize(v31);
  v9 = *(_QWORD *)(a1 + 8);
  KcbAtLayerHeight = 0i64;
  v11 = 0i64;
  v25 = 0xFFFFFFFFi64;
  v23 = 0xFFFFFFFFi64;
  v24 = 0xFFFFFFFFi64;
  started = CmpStartKcbStackForTopLayerKcb((INT64)v27, v9);
  if( started < 0 )
    goto LABEL_22;
  CmpLockKcbStackShared((INT64)v27);
  v8 = 1;
  if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, 0i64) )
  {
    started = (*(_BYTE *)(a1 + 48) & 1) != 0 ? -1073740763 : -1073741444;
    goto LABEL_22;
  }
  v13 = WORD1(v27[0]);
  if( SWORD1(v27[0]) <= 0 )
    goto LABEL_15;
  do
  {
    KcbAtLayerHeight = CmpGetKcbAtLayerHeight((INT64)v27, v13);
    if( *(_DWORD *)(KcbAtLayerHeight + 40) != -1 )
      v15 = 1;
    v13 = v16 + v14;
  }
  while( v13 > 0 );
  if( !v15 )
  {
LABEL_15:
    KcbAtLayerHeight = v27[1];
    v19 = (_CM_KEY_CONTROL_BLOCK *)v27[1];
    KeyNodeForKcb = CmpGetKeyNodeForKcb(v27[1], (INT64)&v23, 0);
    v11 = KeyNodeForKcb;
    if( *(_DWORD *)(KeyNodeForKcb + 36) <= (unsigned int)v7 )
    {
      started = -2147483622;
      goto LABEL_22;
    }
    v18 = *(_DWORD *)((*(__int64(__fastcall **)(_QWORD, _QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 8i64))(
                        *(_QWORD *)(KcbAtLayerHeight + 32),
                        *(unsigned int *)(KeyNodeForKcb + 40),
                        &v24)
                    + 4 * v7);
    (*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
      *(_QWORD *)(KcbAtLayerHeight + 32),
      &v24);
    (*(void(__fastcall **)(_QWORD, INT64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
      *(_QWORD *)(KcbAtLayerHeight + 32),
      &v23);
    goto LABEL_18;
  }
  started = CmpValueEnumStackStartFromKcbStack((INT64)v31, (INT64)v27);
  if( started < 0 )
    goto LABEL_22;
  started = CmpValueEnumStackAdvance((__int64)v31);
  if( started < 0 )
    goto LABEL_22;
  v17 = 0;
  if( !(_DWORD)v7 )
  {
LABEL_14:
    v18 = v31[0];
    v19 = (_CM_KEY_CONTROL_BLOCK *)CmpGetKcbAtLayerHeight((INT64)v27, SHIWORD(v31[0]));
LABEL_18:
    v21 = (_CM_KEY_VALUE *)v19->KeyHash.KeyHive->GetCellRoutine(v19->KeyHash.KeyHive, v18, (_HV_GET_CELL_CONTEXT *)&v25);
    started = CmpQueryKeyValueData(v19, v18, v21, KeyValueInformationClass, *(void **)v30, a5, ResultLength);
    if( started >= 0 )
      started = 0;
    v11 = 0i64;
    if( v21 )
      v19->KeyHash.KeyHive->ReleaseCellRoutine(v19->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)&v25);
    goto LABEL_22;
  }
  while( 1 )
  {
    started = CmpValueEnumStackAdvance((__int64)v31);
    if( started < 0 )
      break;
    if( ++v17 >= (unsigned int)v7 )
      goto LABEL_14;
  }
LABEL_22:
  CmpValueEnumStackCleanup((INT64)v31);
  if( v11 )
    (*(void(__fastcall **)(_QWORD, INT64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
      *(_QWORD *)(KcbAtLayerHeight + 32),
      &v23);
  if( v8 )
    CmpUnlockKcbStack((INT64)v27);
  if( Privileges[1] )
    CmSiFreeMemory(Privileges[1]);
  return(unsigned int)started;
}

Referenced by:

CmEnumerateValueKey