CmpEnumerateLayeredKey

INT64 __stdcall CmpEnumerateLayeredKey(
        CM_KEY_BODY *KeyBody,
        UINT64 Index,
        KEY_INFORMATION_CLASS KeyInformationClass,
        VOID *KeyInformation,
        UINT64 Length,
        UINT64 *ResultLength){
  unsigned int v6; 
  char v8; 
  __int64 KcbAtLayerHeight; 
  _PRIVILEGE_SET *v10; 
  _PRIVILEGE_SET *v11; 
  __int64 v12; 
  int started; 
  INT16 v14; 
  __int16 v15; 
  char v16; 
  __int64 v17; 
  __int16 v18; 
  _CM_KEY_NODE *KeyNodeForKcb; 
  _CM_KEY_NODE *v20; 
  _HHIVE *v21; 
  unsigned int Control; 
  unsigned int v24; 
  int v25; 
  int ResumeContext; 
  int KeyDataFromKeyNodeStack; 
  INT64 a5; 
  _CM_KEY_NODE *v29; 
  _KEY_INFORMATION_CLASS KeyInformationClassa; 
  unsigned int v31; 
  UINT ChildCell; 
  __int64 v33; 
  INT64 v34; 
  INT64 v35[2]; 
  __int128 v36; 
  unsigned int *v37; 
  void *KeyInformationa; 
  _CM_KEY_NODE *v39; 
  UINT64 *RegLockHeldEx[2]; 
  _QWORD *v41; 
  INT16 a1[176]; 
  _PRIVILEGE_SET **v43; 
  char v44; 

  v6 = Index;
  KeyInformationClassa = KeyInformationClass;
  v31 = Index;
  v37 = (unsigned int *)ResultLength;
  v41 = v43;
  KeyInformationa = KeyInformation;
  memset(a1, 0i64, sizeof(a1));
  ChildCell = 0;
  *(_OWORD *)v35 = 0i64;
  WORD1(v35[0]) = -1;
  v8 = 0;
  *(_OWORD *)RegLockHeldEx = 0i64;
  v36 = 0i64;
  CmpKeyEnumStackInitialize(a1);
  v34 = 0xFFFFFFFFi64;
  KcbAtLayerHeight = 0i64;
  v33 = 0xFFFFFFFFi64;
  v10 = 0i64;
  v29 = 0i64;
  v39 = 0i64;
  CmpInitializeDelayDerefContext(RegLockHeldEx);
  v11 = *v43;
  *v43 = (_PRIVILEGE_SET *)(v12 & (unsigned __int64)*v43);
  a5 = (INT64)v11;
  if( KeyInformationClassa == KeyFullInformation )
    CmpLockRegistryExclusive();
  else
    CmpLockRegistry();
  started = CmpStartKcbStackForTopLayerKcb((INT64)v35, (INT64)KeyBody->KeyControlBlock);
  if( started < 0 )
  {
    KeyNodeForKcb = 0i64;
  }
  else
  {
    CmpLockKcbStackShared((INT64)v35);
    v8 = 1;
    started = CmpPerformKeyBodyDeletionCheck(KeyBody, 0i64);
    if( started < 0 )
    {
      KeyNodeForKcb = 0i64;
    }
    else
    {
      v14 = WORD1(v35[0]);
      if( SWORD1(v35[0]) <= 0 )
        goto LABEL_10;
      do
      {
        KcbAtLayerHeight = CmpGetKcbAtLayerHeight((INT64)v35, v14);
        if( *(_DWORD *)(KcbAtLayerHeight + 40) != -1 )
          v16 = 1;
        v14 = v18 + v15;
      }
      while( v14 > 0 );
      if( v16 )
      {
        if( v11
          || (v11 = (_PRIVILEGE_SET *)_InterlockedExchange64(
                                        (volatile __int64 *)&KeyBody->EnumerationResumeContext,
                                        v17),
              (a5 = (INT64)v11) != 0) )
        {
          if( (unsigned int)CmpKeyEnumStackVerifyResumeContext((INT64)v35) == -1073741735 || v11->Control > v6 )
          {
            v10 = v11;
            v11 = 0i64;
            a5 = 0i64;
          }
        }
        started = CmpKeyEnumStackStartFromKcbStack(a1, (INT64)v35);
        if( started < 0
          || (!v11 ? (Control = 0) : (Control = v11->Control, v10 = v11, v11 = 0i64, a5 = 0i64),
              started = CmpKeyEnumStackAdvance(a1),
              started < 0) )
        {
LABEL_52:
          KeyNodeForKcb = 0i64;
        }
        else
        {
          v24 = Control;
          if( Control >= v31 )
          {
LABEL_45:
            ResumeContext = CmpKeyEnumStackCreateResumeContext((INT64)v35, (INT64)a1, v24, 0, (INT64)&a5);
            v11 = (_PRIVILEGE_SET *)a5;
            if( ResumeContext >= 0 )
              v11 = (_PRIVILEGE_SET *)_InterlockedExchange64((volatile __int64 *)&KeyBody->EnumerationResumeContext, a5);
            KeyDataFromKeyNodeStack = CmpQueryKeyDataFromKeyNodeStack(
                                        &a1[4],
                                        KeyInformationClassa,
                                        (__int64)KeyInformationa,
                                        Length,
                                        v37);
            KeyNodeForKcb = v29;
            started = KeyDataFromKeyNodeStack;
            if( KeyDataFromKeyNodeStack >= 0 )
              started = 0;
            v8 = 1;
          }
          else
          {
            while( !CmpIsRegistryLockContended() || v24 - Control < 0xA || !v44 )
            {
              started = CmpKeyEnumStackAdvance(a1);
              if( started < 0 )
              {
                v8 = 1;
                goto LABEL_52;
              }
              if( ++v24 >= v31 )
                goto LABEL_45;
            }
            v25 = CmpKeyEnumStackCreateResumeContext((INT64)v35, (INT64)a1, v24, 1, (INT64)&a5);
            v8 = 1;
            started = v25;
            KeyNodeForKcb = 0i64;
            if( v25 < 0 )
            {
              v11 = (_PRIVILEGE_SET *)a5;
            }
            else
            {
              v11 = 0i64;
              started = -1073741267;
              *v41 = a5;
            }
          }
        }
      }
      else
      {
LABEL_10:
        KcbAtLayerHeight = v35[1];
        KeyNodeForKcb = (_CM_KEY_NODE *)CmpGetKeyNodeForKcb(v35[1], (INT64)&v34, 0);
        started = CmpFindSubKeyByNumber(*(_HHIVE **)(KcbAtLayerHeight + 32), KeyNodeForKcb, v6, &ChildCell);
        if( started >= 0 )
        {
          if( ChildCell == -1 )
          {
            started = -2147483622;
          }
          else
          {
            v20 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(_QWORD, _QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32)
                                                                                       + 8i64))(
                                    *(_QWORD *)(KcbAtLayerHeight + 32),
                                    ChildCell,
                                    &v33);
            v21 = *(_HHIVE **)(KcbAtLayerHeight + 32);
            v39 = v20;
            started = CmpQueryKeyDataFromNode(v21, v20, KeyInformationClassa, KeyInformationa, Length, v37, 0i64, 0i64);
            if( started >= 0 )
              started = 0;
          }
        }
      }
    }
  }
  CmpKeyEnumStackCleanup((INT64)a1);
  if( v39 )
    (*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)(KcbAtLayerHeight + 32) + 16i64))(
      *(_QWORD *)(KcbAtLayerHeight + 32),
      &v33);
  if( KeyNodeForKcb )
    CmpReleaseKeyNodeForKcb(KcbAtLayerHeight);
  if( v8 )
    CmpUnlockKcbStack((INT64)v35);
  CmpCleanupKcbStack((INT64)v35);
  if( v11 )
    CmpKeyEnumStackFreeResumeContext(v11);
  if( v10 )
    CmpKeyEnumStackFreeResumeContext(v10);
  CmpDrainDelayDerefContext(RegLockHeldEx);
  CmpUnlockRegistry();
  return(unsigned int)started;
}

Referenced by:

CmEnumerateKey