MiReleasePtes
VOID __stdcall MiReleasePtes(
_MI_SYSTEM_PTE_TYPE *SystemPteInfo,
_MMPTE *PointerPte,
UINT64 NumberOfPtes,
_KTBFLUSH_TYPE a4){
UINT64 v4;
signed __int64 v7;
unsigned __int64 BugCheckParameter4;
unsigned __int64 v9;
int v10;
unsigned __int64 *Buffer;
unsigned __int64 v12;
unsigned __int64 *v13;
unsigned __int64 *v14;
bool v15;
unsigned __int64 *v16;
UINT64 v17;
_MMPTE *v18;
UINT64 v19;
UINT64 v20;
_MMPTE *v21;
char v22;
unsigned __int64 v23;
unsigned __int64 v24;
volatile signed __int32 *v25;
int v26;
unsigned __int64 v27;
int v28;
UINT64 v29;
_MI_TB_FLUSH_LIST TbFlushList[48];
v4 = (unsigned int)NumberOfPtes;
v7 = 0i64;
v29 = 0i64;
memset(TbFlushList, 0i64, 0xB8u);
if( SystemPteInfo == (_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432) && (dword_140CFA17C & 2) != 0 )
MiCheckPteRelease(PointerPte, v4);
BugCheckParameter4 = PointerPte - SystemPteInfo->BasePte;
if( (SystemPteInfo->Flags & 4) != 0 )
BugCheckParameter4 >>= 4;
v9 = v4 >> 4;
if( (SystemPteInfo->Flags & 4) == 0 )
v9 = v4;
if( (unsigned int)v4 >= 0x200 && SystemPteInfo == (_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432) )
{
v10 = 1;
v28 = 1;
goto LABEL_26;
}
v10 = 0;
v28 = 0;
if( BugCheckParameter4 >= SystemPteInfo->Bitmap.SizeOfBitMap )
goto LABEL_61;
if( v9 > 1 )
{
if( SystemPteInfo->Bitmap.SizeOfBitMap - BugCheckParameter4 < v9 )
goto LABEL_61;
Buffer = SystemPteInfo->Bitmap.Buffer;
v12 = Buffer[BugCheckParameter4 >> 6];
v13 = &Buffer[BugCheckParameter4 >> 6];
v14 = &Buffer[(BugCheckParameter4 + v9 - 1) >> 6];
if( v13 == v14 )
{
v15 = ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v9) << BugCheckParameter4) & v12) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v9) << BugCheckParameter4;
}
else
{
if( ((-1i64 << BugCheckParameter4) & v12) != -1i64 << BugCheckParameter4 )
goto LABEL_61;
v16 = v13 + 1;
if( v16 != v14 )
{
while( *v16 == -1i64 )
{
if( ++v16 == v14 )
goto LABEL_23;
}
goto LABEL_61;
}
LABEL_23:
v15 = ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)BugCheckParameter4 + (unsigned __int8)v9 - 1)) & *v16) == 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)BugCheckParameter4 + (unsigned __int8)v9 - 1);
}
if( v15 )
{
v10 = 0;
goto LABEL_26;
}
LABEL_61:
KeBugCheckEx(
0xDAu,
(PVOID)0x302,
(PVOID)((__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
(PVOID)v4,
(PVOID)BugCheckParameter4);
}
if( v9 != 1 || !_bittest64((const signed __int64 *)SystemPteInfo->Bitmap.Buffer, BugCheckParameter4) )
goto LABEL_61;
LABEL_26:
if( (_DWORD)v4 )
{
v17 = v4;
do
{
PointerPte->u.Long = ZeroPte.u.Long;
++PointerPte;
--v17;
}
while( v17 );
}
v18 = &PointerPte[-v4];
if( v10 )
goto LABEL_52;
if( (SystemPteInfo->Flags & 1) != 0 && MiInsertCachedPte(SystemPteInfo, v18, (unsigned int)v4) == 1 )
return;
MiInitializeTbFlushStamps(&v29);
v19 = v29;
if( (_DWORD)v4 )
{
v20 = v4;
do
{
v18->u.Long = v19;
++v18;
--v20;
}
while( v20 );
}
v21 = &v18[-v4];
if( *(&stru_140C4DB30 + 42) && (v19 & 0x10) == 0 )
v19 &= ~*(&stru_140C4DB30 + 42);
if( (v19 & 0xFFFFFFFF00000000ui64) == 0 )
{
v22 = ~(unsigned __int8)SystemPteInfo->Flags;
LOWORD(TbFlushList[1]) = 0;
*(_QWORD *)&TbFlushList[4] = 0i64;
TbFlushList[0] = v22 & 2;
TbFlushList[2] = 20;
*(_QWORD *)&TbFlushList[6] = 0i64;
MiInsertTbFlushEntry(
TbFlushList,
(VOID *)((__int64)(((_QWORD)v21 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
v4,
0i64);
MiFlushTbList(TbFlushList);
}
v23 = BugCheckParameter4 & 0x1F;
v24 = v9;
v25 = (volatile signed __int32 *)SystemPteInfo->Bitmap.Buffer + (BugCheckParameter4 >> 5);
if( v9 + v23 > 0x20 )
{
if( (BugCheckParameter4 & 0x1F) != 0 )
{
_InterlockedAnd(v25, ~(((1 << (32 - (BugCheckParameter4 & 0x1F))) - 1) << v23));
v24 = v9 - (32 - (unsigned int)(BugCheckParameter4 & 0x1F));
++v25;
}
if( v24 >= 0x20 )
{
v27 = v24 >> 5;
v24 += -32i64 * (v24 >> 5);
do
{
*v25++ = 0;
--v27;
}
while( v27 );
}
if( !v24 )
goto LABEL_52;
v26 = -1 << v24;
goto LABEL_51;
}
if( v9 != 32 )
{
v26 = ~(((1 << v9) - 1) << v23);
LABEL_51:
_InterlockedAnd(v25, v26);
goto LABEL_52;
}
*v25 = 0;
LABEL_52:
if( MiIsPteCachingOptimizationEnabled() )
v7 = _InterlockedExchangeAdd64((volatile signed __int64 *)&SystemPteInfo->TotalFreeSystemPtes, v9);
else
_InterlockedExchangeAdd64((volatile signed __int64 *)&SystemPteInfo->TotalFreeSystemPtes, v9);
if( v28 == 1 )
{
MiReturnSystemPtes(SystemPteInfo, BugCheckParameter4, ((_DWORD)v4 + 511) & 0xFFFFFE00, 1ui64);
}
else if( !MiIsPteCachingOptimizationEnabled() || v9 + v7 > 0x40000 )
{
MiAttemptCoalesce(SystemPteInfo, BugCheckParameter4, v9);
}
}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