MiEnableLargeSubsection

NTSTATUS __stdcall MiEnableLargeSubsection(INT64 a1){
  _XSTATE_CONFIGURATION *v1; 
  __int64 v2; 
  NTSTATUS result; 
  _XSTATE_CONFIGURATION *v5; 
  unsigned __int64 v6; 
  ULONG_PTR v7; 
  UINT8 v8; 
  unsigned __int64 v9; 
  _MMPFN *v10; 
  _MMPFN *v11; 
  unsigned __int64 EnabledFeatures; 
  char v13; 
  UINT8 PageIrql; 

  v1 = *(_XSTATE_CONFIGURATION **)(a1 + 8);
  v2 = *(unsigned int *)(a1 + 44);
  result = MiChargeLargeProtoSubsection(a1, 1i64);
  if( result )
  {
    v5 = (_XSTATE_CONFIGURATION *)((char *)v1 + 8 * v2);
    LODWORD(v6) = MiMakeValidPte(v1, -1i64, (*(unsigned __int16 *)(a1 + 32) >> 1) & 0x1F);
    v7 = 0;
    v8 = 17;
    PageIrql = 17;
    v9 = v6;
    if( v1 < v5 )
    {
      do
      {
        if( ((unsigned __int16)v1 & 0xFFF) == 0 || v8 == 17 )
        {
          if( v8 != 17 )
            MiUnlockProtoPoolPage(v7, v8);
          while( 1 )
          {
            v10 = MiLockProtoPoolPage((_MMPTE *)v1, &PageIrql);
            v7 = (unsigned int)v10;
            if( v10 )
              break;
            MmAccessFault(2ui64, v1, 0, 0i64);
          }
        }
        v11 = MiLockLeafPage((_MMPTE *)v1, 0i64);
        EnabledFeatures = v1->EnabledFeatures;
        if( (v1->EnabledFeatures & 1) == 0 )
        {
          if( *(&stru_140C4DB30 + 42) && (EnabledFeatures & 0x10) == 0 )
            EnabledFeatures &= ~*(&stru_140C4DB30 + 42);
          v9 ^= (v9 ^ EnabledFeatures) & 0xFFFFFFFFF000i64;
          v1->EnabledFeatures = v9;
          v11->u2._bf_0 &= 0xC000000000000000ui64;
          MiUnlinkPageFromList(v11, 0i64);
          v13 = *(_BYTE *)(&v11->u3 + 1) & 0xF8 | 6;
          ++v11->u3.ReferenceCount;
          *((_BYTE *)&v11->u3 + 2) = v13;
        }
        v11->u2._bf_0 ^= (v11->u2._bf_0 ^ (v11->u2._bf_0 + 1)) & 0x3FFFFFFFFFFFFFFFi64;
        _InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        v1 = (_XSTATE_CONFIGURATION *)((char *)v1 + 8);
        if( ((unsigned __int16)v1 & 0x1F8) != 0 || !(unsigned int)KeShouldYieldProcessor() )
        {
          v8 = PageIrql;
        }
        else
        {
          MiUnlockProtoPoolPage(v7, PageIrql);
          v8 = 17;
          PageIrql = 17;
        }
      }
      while( v1 < v5 );
      if( v8 != 17 )
        MiUnlockProtoPoolPage(v7, v8);
    }
    return 1;
  }
  return result;
}

Referenced by:

MiIncrementLargeSubsections