MiUnlockPageTableInternal
VOID __stdcall MiUnlockPageTableInternal(INT64 a1, UINT64 a2){
char v3;
_MMPTE *Pml4eBase;
_MMPTE *Pml4eLimit;
signed __int64 v6;
bool v7;
signed __int64 v8;
_MMPTE *NextPteToAge;
_KLOCK_QUEUE_HANDLE *SelfmapLockHandle;
_KSPIN_LOCK_QUEUE *Next;
volatile signed __int32 *PageTableLockBuffer;
signed __int32 v13;
int v14;
signed __int32 v15;
struct _KPRCB *CurrentPrcb;
UINT64 v17;
int v18;
int v19;
v3 = *(_BYTE *)(a1 + 184) & 7;
v19 = 0;
if( (_MMPTE *)a2 == MmGetPxeSelfRef() )
{
if( v3 )
{
if( v3 == 7 )
{
SelfmapLockHandle = &KeGetCurrentPrcb()->SelfmapLockHandle[1];
}
else
{
CurrentPrcb = KeGetCurrentPrcb();
if( v3 == 5 )
SelfmapLockHandle = CurrentPrcb->SelfmapLockHandle;
else
SelfmapLockHandle = &CurrentPrcb->SelfmapLockHandle[3];
}
}
else
{
SelfmapLockHandle = &KeGetCurrentPrcb()->SelfmapLockHandle[2];
}
_m_prefetchw(SelfmapLockHandle);
Next = SelfmapLockHandle->LockQueue.Next;
if( !SelfmapLockHandle->LockQueue.Next )
{
if( SelfmapLockHandle == (_KLOCK_QUEUE_HANDLE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)SelfmapLockHandle->LockQueue.Lock,
0i64,
(signed __int64)SelfmapLockHandle) )
return;
Next = KxWaitForLockChainValid(&SelfmapLockHandle->LockQueue);
}
SelfmapLockHandle->LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
return;
}
Pml4eBase = MmGetPml4eBase();
Pml4eLimit = MmGetPml4eLimit();
if( v3 )
{
if( a2 >= (unsigned __int64)Pml4eBase && a2 <= (unsigned __int64)Pml4eLimit )
{
PageTableLockBuffer = (volatile signed __int32 *)MiGetPageTableLockBuffer(a1, a2, &v19);
v13 = *PageTableLockBuffer;
v14 = ~(3 << v19);
do
{
v15 = v13;
v13 = _InterlockedCompareExchange(PageTableLockBuffer, v13 & v14, v13);
}
while( v15 != v13 );
return;
}
LABEL_4:
v6 = *(_QWORD *)a2;
do
{
v8 = _InterlockedCompareExchange64((volatile signed __int64 *)a2, v6 & 0xCFFFFFFFFFFFFFFFui64, v6);
v7 = v6 == v8;
v6 = v8;
}
while( !v7 );
return;
}
if( a2 < (unsigned __int64)Pml4eBase )
goto LABEL_4;
if( a2 > (unsigned __int64)Pml4eLimit )
goto LABEL_4;
NextPteToAge = KeGetCurrentThread()->ApcState.Process->Vm.Instance.VmWorkingSetList[15].NextPteToAge;
if( !NextPteToAge )
goto LABEL_4;
v17 = (a2 >> 3) & 0x1FF;
v18 = *((_DWORD *)&NextPteToAge->u.Long + v17);
if( (v18 & 0x3FFFFFFF) != 0 )
{
ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)NextPteToAge + v17);
}
else
{
if( v18 >= 0 )
KeBugCheckEx(0x10u, (char *)NextPteToAge + 4 * v17, (PVOID)0x100, 0i64, 0i64);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)((char *)NextPteToAge + 4 * v17));
}
}Referenced by:
MiAddPagesToEnclave
MiAllocateKernelStackPages
MiCheckCommitReleaseFromVad
MiClearNonPagedPtes
MiClearPteAccessed
MiCommitEnclavePages
MiCommitExistingVad
MiCommitHotPatchTable
MiCommitPoolMemory
MiComputePageCommitment
MiConvertAndFlushWsleVas
MiCountSharedPages
MiDecommitHardwareEnclavePages
MiDecommitPages
MiDeleteKernelStack
MiDeletePagablePteRange
MiDeleteSystemPagableVm
MiDeprioritizeVirtualAddresses
MiDirtySystemCachePte
MiEncodeProtoFill
MiEvictPageTableLock
MiFastLockLeafPageTable
MiFaultInPagedPool
MiFillHyperPtes
MiFillPoolCommitPageTable
MiFlushDirtyBitsToPfn
MiFreePhysicalPages
MiGetNextNonGapPfnPage
MiGetNextPageTablePte
MiGetWorkingSetInfoList
MiGetWsAndMakePageTablesNx
MiInitializeWorkingSetList
MiInsertViewOfPhysicalSection
MiIsCfgBitMapPageShared
MiIsPageTableDeletable
MiJumpStackTarget
MiLockCode
MiLockDriverPageRange
MiLockLowestValidPageTable
MiLockPageLeafPageTable
MiLockPageTableRange
MiLockPagedAddress
MiLockPoolCommitPageTable
MiMakeDriverPagesPrivate
MiMakeHyperRangeAccessible
MiMakeProtoLeafValid
MiMakeProtoPrivate
MiMakeSystemAddressValid
MiMakeSystemCachePteValid
MiMakeSystemCacheRangeValid
MiMakeVaRangePhysicallyContiguous
MiMapLockedPagesInUserSpaceHelper
MiMapMdlCommon
MiMapRetpolineStubs
MiMapWithLargePages
MiMarkBootKernelStack
MiMarkPteDirty
MiMoveDirtyBitsToPfns
MiOutPageSingleKernelStack
MiPrepareImagePagesForHotPatch
MiProbeAndLockPages
MiProtectAweRegion
MiProtectEnclavePages
MiProtectPrivateMemory
MiQueryAddressState
MiQueryVaPhysicalContiguity
MiReacquireWalkLocks
MiReleaseLargePteMappings
MiReleaseSystemCacheView
MiReleaseWalkLocks
MiRelockFaultState
MiRemoveMappedPtes
MiReplaceRotateWithDemandZero
MiScrubAwePage
MiScrubLargeMappedPage
MiSetGraphicsPtes
MiSetPagesModified
MiSetPagingOfDriver
MiSetProtectionOnSection
MiSetReadOnlyOnSectionView
MiSetSystemCodeProtection
MiSoftFaultMappedView
MiSplitPrivatePage
MiSwapStackPage
MiSwitchToTransition
MiTrimSharedPageFromViews
MiUnlockFaultPageTable
MiUnlockNestedPageTableWritePte
MiUnlockPageTable
MiUnlockPageTableRange
MiUnlockPoolCommitWs
MiUnlockProbePacketWorkingSet
MiUnmapMdlCommon
MiUnmapPatchTable
MiUnmapRetpolineStubs
MiUpdateImportRelocationsOnDriverPrivatePages
MiUserFault
MiWalkPageTables
MiWalkPageTablesRecursively
MiWalkVaRange
MiWorkingSetInfoCheckPageTable
MiWriteAwePtes
MiWriteEnclavePte
MiWsleFlush
MmAccessFault
MmFreeLoaderBlock
MmProtectPool
MmReplaceImportEntry
MmSetAddressRangeModifiedEx
MmUnmapViewInSystemCache
MmUpdateUserShadowStackValue