CmEnumerateValueKeyFromMergedView

__int64 __fastcall CmEnumerateValueKeyFromMergedView(
        __int64 a1,
        __int64 a2,
        char a3,
        unsigned int a4,
        int a5,
        _DWORD *Size,
        int a7,
        __int64 a8,
        __int64 a9){
  CM_TRANS *v12; 
  int KeyValueData; 
  unsigned int *v14; 
  _CM_KEY_CONTROL_BLOCK *v15; 
  __int64 v16; 
  char v17; 
  _CHILD_LIST *p_TransValueCache; 
  __int64 v19; 
  __int64 v20; 
  __int64 v21; 
  unsigned int v22; 
  unsigned int v23; 
  __int64 v24; 
  __int64 v25; 
  _HHIVE *KeyHive; 
  __int64 v27; 
  _CELL_DATA *(__fastcall *GetCellRoutine)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *); 
  __int64 v29; 
  _CM_KEY_VALUE *v30; 
  __int16 v31; 
  _CM_KEY_CONTROL_BLOCK *v32; 
  __int64 v33; 
  unsigned int v34; 
  __int64 v35; 
  __int64 v36; 
  _CELL_DATA *(__fastcall *v37)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *); 
  unsigned int v39; 
  int v40; 
  CM_TRANS *CmTrans; 
  int v42[2]; 
  __int64 v43; 
  _CHILD_LIST *v44; 
  int v45[2]; 
  __int64 v46; 
  int v47[2]; 
  int v48[2]; 
  int v49[2]; 
  __int64 v50; 
  __int128 v51; 
  int v52; 

  CmTrans = 0i64;
  v50 = 0i64;
  v48[0] = -1;
  v48[1] = 0;
  v46 = 0i64;
  v49[0] = -1;
  v12 = 0i64;
  v49[1] = 0;
  KeyValueData = 0;
  v44 = 0i64;
  v14 = 0i64;
  v52 = 0;
  v39 = 0;
  v43 = 0i64;
  v45[0] = -1;
  v45[1] = 0;
  v47[0] = -1;
  v47[1] = 0;
  v42[0] = -1;
  v42[1] = 0;
  v40 = 0;
  v51 = 0i64;
  if( !a3 )
    CmpLockRegistry();
  if( *(_QWORD *)(a1 + 56) || *(_QWORD *)(a1 + 64) )
  {
    KeyValueData = CmpTransSearchAddTransFromKeyBody((_CM_KEY_BODY *)a1, &CmTrans);
    if( KeyValueData < 0 )
    {
      if( !a3 )
        goto LABEL_67;
      return(unsigned int)KeyValueData;
    }
    v12 = CmTrans;
  }
  v15 = *(_CM_KEY_CONTROL_BLOCK **)(a1 + 8);
  v16 = *(_QWORD *)(a2 + 8);
  if( !a3 )
    CmpLockTwoKcbsShared(*(_CM_KEY_CONTROL_BLOCK **)(a1 + 8), *(_CM_KEY_CONTROL_BLOCK **)(a2 + 8));
  if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a1, v12) )
  {
    v17 = *(_BYTE *)(a1 + 48);
LABEL_13:
    KeyValueData = (v17 & 1) != 0 ? -1073740763 : -1073741444;
    goto LABEL_65;
  }
  if( CmpIsKeyDeletedForKeyBody((CM_KEY_BODY *)a2, v12) )
  {
    v17 = *(_BYTE *)(a2 + 48);
    goto LABEL_13;
  }
  if( !v12 )
    goto LABEL_23;
  if( v15->TransValueListOwner == v12 )
  {
    p_TransValueCache = &v15->TransValueCache;
    v44 = &v15->TransValueCache;
  }
  else
  {
    p_TransValueCache = 0i64;
  }
  if( *(CM_TRANS **)(v16 + 288) == v12 )
    v14 = (unsigned int *)(v16 + 280);
  if( !p_TransValueCache )
  {
LABEL_23:
    v19 = (__int64)v15->KeyHash.KeyHive->GetCellRoutine(
                     v15->KeyHash.KeyHive,
                     v15->KeyHash.KeyCell,
                     (_HV_GET_CELL_CONTEXT *)v48);
    v50 = v19;
    if( !v19 )
    {
      KeyValueData = -1073741670;
      goto LABEL_65;
    }
    p_TransValueCache = (_CHILD_LIST *)(v19 + 36);
    v44 = (_CHILD_LIST *)(v19 + 36);
  }
  if( v14 )
    goto LABEL_30;
  v20 = (*(__int64(__fastcall **)(_QWORD, _QWORD, int *))(*(_QWORD *)(v16 + 32) + 8i64))(
          *(_QWORD *)(v16 + 32),
          *(unsigned int *)(v16 + 40),
          v49);
  v46 = v20;
  v21 = v20;
  if( v20 )
  {
    v14 = (unsigned int *)(v20 + 36);
LABEL_30:
    v22 = 0;
    v23 = 0;
    while( v23 < p_TransValueCache->Count )
    {
      v24 = v43;
      if( !v43 )
      {
        v24 = (__int64)v15->KeyHash.KeyHive->GetCellRoutine(
                         v15->KeyHash.KeyHive,
                         p_TransValueCache->List,
                         (_HV_GET_CELL_CONTEXT *)v45);
        v43 = v24;
        if( !v24 )
        {
          KeyValueData = -1073741670;
          goto LABEL_60;
        }
      }
      v25 = v23;
      KeyHive = v15->KeyHash.KeyHive;
      v27 = *(unsigned int *)(v24 + 4 * v25);
      GetCellRoutine = KeyHive->GetCellRoutine;
      LODWORD(CmTrans) = v27;
      v29 = (__int64)GetCellRoutine(KeyHive, v27, (_HV_GET_CELL_CONTEXT *)v42);
      v30 = (_CM_KEY_VALUE *)v29;
      if( !v29 )
      {
        KeyValueData = -1073741670;
LABEL_46:
        v33 = 0i64;
        goto LABEL_56;
      }
      v31 = *(_WORD *)(v29 + 16);
      *((_QWORD *)&v51 + 1) = v29 + 20;
      LOWORD(v51) = *(_WORD *)(v29 + 2);
      if( CmpFindNameInList(*(_QWORD *)(v16 + 32), v14, (__int64)&v51, (v31 & 1) << 16, 0i64, &v40) && v40 == -1 )
      {
        if( v22 == a4 )
        {
          v32 = v15;
          v33 = 0i64;
          goto LABEL_54;
        }
        v39 = ++v22;
      }
      v23 = ++v52;
      v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v42);
      if( v43 )
      {
        v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v45);
        v43 = 0i64;
      }
      if( v22 > a4 )
        goto LABEL_46;
      p_TransValueCache = v44;
    }
    v34 = v22 + *v14;
    if( v34 <= a4 )
    {
      KeyValueData = -2147483622;
      if( a9 )
        *(_DWORD *)a9 = v34;
      goto LABEL_46;
    }
    v35 = (*(__int64(__fastcall **)(_QWORD, _QWORD, int *))(*(_QWORD *)(v16 + 32) + 8i64))(
            *(_QWORD *)(v16 + 32),
            v14[1],
            v47);
    v33 = v35;
    if( !v35
      || (KeyHive = *(_HHIVE **)(v16 + 32),
          v36 = *(unsigned int *)(v35 + 4i64 * (a4 - v39)),
          v37 = KeyHive->GetCellRoutine,
          LODWORD(CmTrans) = v36,
          (v30 = (_CM_KEY_VALUE *)v37(KeyHive, v36, (_HV_GET_CELL_CONTEXT *)v42)) == 0i64) )
    {
      KeyValueData = -1073741670;
      goto LABEL_56;
    }
    v32 = (_CM_KEY_CONTROL_BLOCK *)v16;
LABEL_54:
    KeyValueData = CmpQueryKeyValueData(
                     v32,
                     (unsigned int)CmTrans,
                     v30,
                     (_KEY_VALUE_INFORMATION_CLASS)a5,
                     Size,
                     a7,
                     (unsigned int *)a8);
    if( v30 )
      KeyHive->ReleaseCellRoutine(KeyHive, (_HV_GET_CELL_CONTEXT *)v42);
LABEL_56:
    if( v43 )
      v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v45);
    if( v33 )
      (*(void(__fastcall **)(_QWORD, int *))(*(_QWORD *)(v16 + 32) + 16i64))(*(_QWORD *)(v16 + 32), v47);
LABEL_60:
    v21 = v46;
    goto LABEL_61;
  }
  KeyValueData = -1073741670;
LABEL_61:
  if( v50 )
    v15->KeyHash.KeyHive->ReleaseCellRoutine(v15->KeyHash.KeyHive, (_HV_GET_CELL_CONTEXT *)v48);
  if( v21 )
    (*(void(__fastcall **)(_QWORD, int *))(*(_QWORD *)(v16 + 32) + 16i64))(*(_QWORD *)(v16 + 32), v49);
LABEL_65:
  if( !a3 )
  {
    CmpUnlockTwoKcbs(v15, (_CM_KEY_CONTROL_BLOCK *)v16);
LABEL_67:
    CmpUnlockRegistry();
  }
  return(unsigned int)KeyValueData;
}

Referenced by:

CmQueryKey
NtEnumerateValueKey