MiTryUnlinkNodeLargePage
_MMLISTS __stdcall MiTryUnlinkNodeLargePage(UINT64 BaseLargePage, UINT64 LargePageIndex){
int v2;
int v3;
_DWORD *v4;
int v6;
__int64 v8;
__int64 v9;
_MMPFN *v10;
UINT8 v11;
__int64 v12;
__int64 v13;
__int64 v14;
_MMLISTS v15;
_MI_NODE_INFORMATION *v16;
NTSTATUS PfnPageSizeIndex;
_BOOL8 v18;
unsigned __int8 v19;
CHAR v20;
UINT64 Channel;
unsigned int PfnChannel;
__int64 v24;
_KLOCK_QUEUE_HANDLE LockQueue;
_MI_LARGE_PAGE_LISTS_CHANGING *LargeListWaiters;
__int64 v27;
__int64 v28[3];
UINT64 SpinCount;
UINT64 LargePageIndexa;
_DWORD *v32;
LODWORD(LargePageIndexa) = v2;
v4 = v32;
memset(&LockQueue, 0, sizeof(LockQueue));
v6 = v3;
LODWORD(v8) = MiSearchNumaNodeTable((PVOID)LargePageIndex);
v9 = *(unsigned int *)(v8 + 8);
v10 = &MmGetPfnDb()[LargePageIndex];
PfnChannel = MiGetPfnChannel((INT64)v10);
v11 = MiLockPageInline(v10);
v12 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v10->u4._bf_0 >> 39) & 0x3FF));
if( v12 != BaseLargePage )
{
LABEL_15:
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
*v4 = 1;
return 0;
}
v13 = 4544 * v9;
v24 = 4544 * v9;
while( 1 )
{
v14 = *(_QWORD *)(v12 + 16);
v15 = FreePageList;
LockQueue.LockQueue.Next = 0i64;
v16 = (_MI_NODE_INFORMATION *)(v13 + v14);
LockQueue.LockQueue.Lock = &v16->LargePageLock;
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, &v16->LargePageLock);
PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)v10);
if( PfnPageSizeIndex != (_DWORD)LargePageIndexa )
{
LODWORD(v18) = 1;
goto LABEL_7;
}
v19 = *(_BYTE *)(&v10->u3 + 1) & 7;
if( v19 <= 1u )
break;
v18 = v19 != 5;
LABEL_7:
v15 = ZeroedPageList;
*v4 = v18;
if( !v16->LargeListMoveInProgress )
goto LABEL_22;
if( (v6 & 0x10) != 0 )
{
v27 = 393479i64;
v28[1] = (__int64)v28;
v28[0] = (__int64)v28;
LargeListWaiters = v16->LargeListWaiters;
v16->LargeListWaiters = (_MI_LARGE_PAGE_LISTS_CHANGING *)&LargeListWaiters;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
KeWaitForGate((_KGATE *)&v27, WrVirtualMemory, v20);
}
else
{
LODWORD(SpinCount) = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
if( v11 != 2 )
{
*v4 = 0;
return 0;
}
LODWORD(SpinCount) = 0;
while( v16->LargeListMoveInProgress )
KeYieldProcessorEx(&SpinCount);
}
v11 = MiLockPageInline(v10);
v12 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v10->u4._bf_0 >> 39) & 0x3FF));
v13 = v24;
if( v12 != BaseLargePage )
goto LABEL_15;
}
LODWORD(Channel) = v6;
if( MiUnlinkNodeLargePageHelper(v16, v10, (unsigned int)LargePageIndexa, PfnChannel, Channel) )
{
if( (v6 & 0x20) != 0 )
++*(_DWORD *)(v24 + *(_QWORD *)(BaseLargePage + 16) + 4284);
}
else
{
*v4 = 0;
v15 = ZeroedPageList;
}
LABEL_22:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
if( v15 && (v6 & 0x20) != 0 )
v11 = 2;
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
return v15;
}Referenced by:
MiDemoteLargeFreePage
MiLargeFreePageToMdl
MiMoveLargeFreePage