MiReleasePtes

VOID __fastcall MiReleasePtes(INT64 a1, INT64 a2, UINT64 a3){
  ULONG_PTR v3; 
  signed __int64 v6; 
  ULONG_PTR BugCheckParameter4; 
  unsigned __int64 v8; 
  int v9; 
  __int64 v10; 
  __int64 v11; 
  _QWORD *v12; 
  _QWORD *v13; 
  bool v14; 
  _QWORD *v15; 
  ULONG_PTR v16; 
  UINT64 *v17; 
  UINT64 v18; 
  ULONG_PTR v19; 
  UINT64 *v20; 
  char v21; 
  ULONG_PTR v22; 
  unsigned __int64 v23; 
  volatile signed __int32 *v24; 
  int v25; 
  unsigned __int64 v26; 
  int v27; 
  UINT64 v28; 
  int result; 
  __int16 result_4; 
  int v31; 
  __int64 v32; 
  __int64 v33; 
  v3 = (unsigned int)a3;
  v6 = 0i64;
  v28 = 0i64;
  memset((INT64)&result, 0i64);
  if( (INT64 *)a1 == &qword_140C4EC80 && (dword_140CFA17C & 2) != 0 )
    MiCheckPteRelease((MMPTE *)a2, (unsigned int)v3);
  BugCheckParameter4 = (a2 - *(_QWORD *)(a1 + 16)) >> 3;
  if( (*(_DWORD *)(a1 + 24) & 4) != 0 )
    BugCheckParameter4 >>= 4;
  v8 = v3 >> 4;
  if( (*(_DWORD *)(a1 + 24) & 4) == 0 )
    v8 = v3;
  if( (unsigned int)v3 >= 0x200 && (INT64 *)a1 == &qword_140C4EC80 )
  {
    v9 = 1;
    v27 = 1;
    goto LABEL_26;
  }
  v9 = 0;
  v27 = 0;
  if( BugCheckParameter4 >= *(_QWORD *)a1 )
    goto LABEL_61;
  if( v8 > 1 )
  {
    if( *(_QWORD *)a1 - BugCheckParameter4 < v8 )
      goto LABEL_61;
    v10 = *(_QWORD *)(a1 + 8);
    v11 = *(_QWORD *)(v10 + 8 * (BugCheckParameter4 >> 6));
    v12 = (_QWORD *)(v10 + 8 * (BugCheckParameter4 >> 6));
    v13 = (_QWORD *)(v10 + 8 * ((BugCheckParameter4 + v8 - 1) >> 6));
    if( v12 == v13 )
    {
      v14 = ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v8) << BugCheckParameter4) & v11) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v8) << BugCheckParameter4;
    }
    else
    {
      if( ((-1i64 << BugCheckParameter4) & v11) != -1i64 << BugCheckParameter4 )
        goto LABEL_61;
      v15 = v12 + 1;
      if( v15 != v13 )
      {
        while( *v15 == -1i64 )
        {
          if( ++v15 == v13 )
            goto LABEL_23;
        }
        goto LABEL_61;
      }
LABEL_23:
      v14 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)BugCheckParameter4 + (unsigned __int8)v8 - 1)) & *v15) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)BugCheckParameter4 + (unsigned __int8)v8 - 1);
    }
    if( v14 )
    {
      v9 = 0;
      goto LABEL_26;
    }
LABEL_61:
    KeBugCheckEx(0xDAu, 0x302ui64, ((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v3, BugCheckParameter4);
  }
  if( v8 != 1 || !_bittest64(*(const signed __int64 **)(a1 + 8), BugCheckParameter4) )
    goto LABEL_61;
LABEL_26:
  if( (_DWORD)v3 )
  {
    v16 = v3;
    do
    {
      *(_QWORD *)a2 = ZeroPte;
      a2 += 8i64;
      --v16;
    }
    while( v16 );
  }
  v17 = (UINT64 *)(a2 - 8 * v3);
  if( v9 )
    goto LABEL_52;
  if( (*(_DWORD *)(a1 + 24) & 1) != 0 && (unsigned int)MiInsertCachedPte(a1, (UINT64)v17, (unsigned int)v3) == 1 )
    return;
  MiInitializeTbFlushStamps(&v28);
  v18 = v28;
  if( (_DWORD)v3 )
  {
    v19 = v3;
    do
    {
      *v17++ = v18;
      --v19;
    }
    while( v19 );
  }
  v20 = &v17[-v3];
  if( qword_140C4DC80 && (v18 & 0x10) == 0 )
    v18 &= ~qword_140C4DC80;
  if( (v18 & 0xFFFFFFFF00000000ui64) == 0 )
  {
    v21 = ~(unsigned __int8)*(_DWORD *)(a1 + 24);
    result_4 = 0;
    v32 = 0i64;
    result = v21 & 2;
    v31 = 20;
    v33 = 0i64;
    MiInsertTbFlushEntry(
      (INT64)&result,
      (__int64)(((_QWORD)v20 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16,
      v3,
      0i64);
    MiFlushTbList((__int64)&result);
  }
  v22 = BugCheckParameter4 & 0x1F;
  v23 = v8;
  v24 = (volatile signed __int32 *)(*(_QWORD *)(a1 + 8) + 4 * (BugCheckParameter4 >> 5));
  if( v8 + v22 > 0x20 )
  {
    if( (BugCheckParameter4 & 0x1F) != 0 )
    {
      _InterlockedAnd(v24, ~(((1 << (32 - (BugCheckParameter4 & 0x1F))) - 1) << v22));
      v23 = v8 - (32 - (unsigned int)(BugCheckParameter4 & 0x1F));
      ++v24;
    }
    if( v23 >= 0x20 )
    {
      v26 = v23 >> 5;
      v23 += -32i64 * (v23 >> 5);
      do
      {
        *v24++ = 0;
        --v26;
      }
      while( v26 );
    }
    if( !v23 )
      goto LABEL_52;
    v25 = -1 << v23;
    goto LABEL_51;
  }
  if( v8 != 32 )
  {
    v25 = ~(((1 << v8) - 1) << v22);
LABEL_51:
    _InterlockedAnd(v24, v25);
    goto LABEL_52;
  }
  *v24 = 0;
LABEL_52:
  if( (unsigned int)MiIsPteCachingOptimizationEnabled() )
    v6 = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), v8);
  else
    _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 88), v8);
  if( v27 == 1 )
  {
    MiReturnSystemPtes((_MI_SYSTEM_PTE_TYPE *)a1, BugCheckParameter4, ((_DWORD)v3 + 511) & 0xFFFFFE00, 1ui64);
  }
  else if( !(unsigned int)MiIsPteCachingOptimizationEnabled() || v8 + v6 > 0x40000 )
  {
    MiAttemptCoalesce((_MI_SYSTEM_PTE_TYPE *)a1, BugCheckParameter4, v8);
  }
}

Referenced by:

MiAddPagesToEnclave
MiAllocateEnclaveVad
MiApplyImportOptimizationToRuntimeDriver
MiBuildReservationCluster
MiCopyDataPageToImagePage
MiCopyPage
MiCopyToUserVa
MiCreatePfnBitMaps
MiCreateRetpolineBitmap
MiDeleteEnclavePages
MiDeleteKernelStack
MiDeleteSparseRange
MiExpandPartitionIds
MiExtendPagingFileMaximum
MiGetPageChain
MiInitializeEnclaveMetadataPage
MiInitializeGapFrames
MiInitializePteInfo
MiInitializeTbFlush
MiInsertInSystemSpace
MiMakePageAvoidRead
MiMapContiguousMemory
MiPrivateFixup
MiReleaseHotPatchResources
MiReleasePageHash
MiReleaseProcessReferenceToSessionDataPage
MiReleasePteCopyList
MiRelocateImageAgain
MiRelocateImagePfn
MiRemoveFromSystemSpace
MiReturnPteMappingPair
MiScrubNodeLargePageList
MiSessionCreateInternal
MiUnlockEntireDriver
MiUnmapSinglePage
MiUpdateImagePfnImportRelocations
MiValidateImagePfn
MiZeroInParallelWorker
MiZeroLargePage
MiZeroPhysicalPage
MmAllocateIndependentPagesEx
MmCopyMemory
MmCopyToCachedPage
MmCreateKernelStack
MmCreateProcessAddressSpace
MmDeleteProcessor
MmFreeIndependentPages
MmFreeIsrStack
MmFreeMappingAddress
MmFreeNonCachedMemory
MmMapLockedPagesSpecifyCache
MmMapMdl
MmReleaseDumpHibernateResources
MmUnlockPages
MmUnmapIoSpace
MmUnmapLockedPages