MiInsertLargePageInNodeList
UINT64 __fastcall MiInsertLargePageInNodeList(__int64 a1){
int v2;
int v3;
UINT64 v4;
int v5;
_MMPFN *v6;
_MI_PARTITION *v7;
__int64 PfnPageSizeIndex;
__int64 v9;
__int64 v10;
__int64 v11;
unsigned int v12;
__int64 v13;
UINT64 v14;
UINT64 v15;
unsigned __int64 v16;
unsigned __int64 v17;
UINT8 *v18;
INT64 *v19;
INT64 v20;
_MMPFN **v21;
__int64 v22;
__int64 v23;
UINT8 v24;
unsigned __int64 v25;
_MI_PARTITION *Partition;
unsigned __int64 NumberOfPages;
UINT64 v29;
unsigned __int64 v30;
_KLOCK_QUEUE_HANDLE LockQueue[4];
char v32;
NTSTATUS updated;
unsigned int v34;
UINT64 a6;
*(_QWORD *)&LockQueue[0].OldIrql = 0i64;
v2 = 1;
a6 = 0i64;
v3 = *(_DWORD *)(a1 + 8);
v4 = *(_QWORD *)a1;
v5 = *(_DWORD *)(a1 + 12);
if( v3 == 5 )
v3 = 1;
LockQueue[0].LockQueue = 0i64;
v32 = v5;
v6 = &MmGetPfnDb()[v4];
updated = 0;
v34 = *((unsigned __int8 *)&v6->u3 + 2) >> 6;
v7 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v6->u4._bf_0 >> 39) & 0x3FF));
Partition = v7;
PfnPageSizeIndex = (unsigned int)MiGetPfnPageSizeIndex((INT64)v6);
v6->u4._bf_0 = v9 & 0x7FFFFFFFFFFFFFFFi64;
NumberOfPages = MiLargePageSizes[PfnPageSizeIndex];
if( v3 != 1 && (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
MiArePageContentsZero((PVOID)v4);
LODWORD(v10) = MiSearchNumaNodeTable((PVOID)v4);
v11 = *(unsigned int *)(v10 + 8);
v12 = MiPageToChannel(v4);
v13 = v3;
v14 = (UINT64)&v7->Core.NodeInformation[v11];
v15 = v14 + 1072 * PfnPageSizeIndex;
v29 = v15;
v16 = v34 + 4 * (v12 + 4 * (v3 + (unsigned __int64)(v4 < 0x100000 ? 2 : 0)));
v30 = v16;
v17 = *(_QWORD *)(v15 + 8 * v16 + 560)
+ 24 * (v4 / MiLargePageSizes[PfnPageSizeIndex] % *((unsigned int *)&stru_140C4DB30 + PfnPageSizeIndex + 100));
if( (v32 & 2) == 0 )
{
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(v14 + 4328);
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, (UINT64 *)(v14 + 4328));
v15 = v29;
v16 = v30;
v13 = v3;
}
if( *(_QWORD *)(v14 + 4352) && MiAnyPagesRemovalPending(v4, (unsigned int)PfnPageSizeIndex) )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
_InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
MiConvertEntireLargePageToSmall(
(_KQUEUE *)v6,
PfnPageSizeIndex,
1u,
(_LARGE_INTEGER *)(unsigned int)v3,
0i64,
(UINT64)&a6);
if( (v32 & 4) != 0 )
{
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(v14 + 4328);
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, (UINT64 *)(v14 + 4328));
v19 = *(INT64 **)(v14 + 4288);
--*(_DWORD *)(v14 + 4284);
*(_QWORD *)(v14 + 4288) = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
}
else
{
v19 = 0i64;
}
v2 = 0;
v20 = (INT64)Partition;
}
else
{
*((_BYTE *)&v6->u3 + 2) ^= (*((_BYTE *)&v6->u3 + 2) ^ v3) & 7;
v21 = *(_MMPFN ***)(v17 + 8);
if( *v21 != (_MMPFN *)v17 )
__fastfail(3u);
v6->PteLong = (unsigned __int64)v21;
v6->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v17;
v22 = 2240i64;
*v21 = v6;
v23 = 2i64;
*(_QWORD *)(v17 + 8) = v6;
++*(_QWORD *)(v17 + 16);
++*(_QWORD *)(v15 + 8 * v16 + 48);
++*(_QWORD *)(v15 + 8 * v13);
v20 = (INT64)Partition;
if( v4 < 0x100000 )
v23 = 4i64;
++*(_QWORD *)(v15 + 8 * (v13 + v23));
if( v3 )
v22 = 2304i64;
_InterlockedExchangeAdd64((volatile signed __int64 *)((char *)Partition + v22), NumberOfPages);
updated = MiUpdateLargePageCandidates(v4, (unsigned int)PfnPageSizeIndex, 1i64);
MiIncreaseAvailablePages(Partition, NumberOfPages, v24);
a6 = NumberOfPages;
if( (v32 & 4) != 0 )
{
v19 = *(INT64 **)(v14 + 4288);
--*(_DWORD *)(v14 + 4284);
*(_QWORD *)(v14 + 4288) = 0i64;
}
else
{
v19 = 0i64;
}
if( (v32 & 2) == 0 )
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
}
if( v19 )
MiWakeLargePageWaiters(v19);
if( !v2 )
{
v25 = *(unsigned __int8 *)(a1 + 16);
if( (_BYTE)v25 == 17 )
return a6;
goto LABEL_43;
}
if( v3 == 1 )
MiWakePageZeroing(v20, v14, v18);
if( updated
&& (v32 & 1) == 0
&& (MiFlags & 0x30) != 0
&& ((_DWORD)PfnPageSizeIndex != 1 || ((unsigned __int64)KeFeatureBits & 0x2000000000i64) != 0) )
{
KeSetEvent((PRKEVENT)(v20 + 5144), 0, 0);
}
v25 = *(unsigned __int8 *)(a1 + 16);
if( (_BYTE)v25 != 17 )
{
if( *(_BYTE *)(a1 + 17) )
{
_InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return a6;
}
_InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (v32 & 2) != 0 )
return a6;
LABEL_43:
__writecr8(v25);
}
return a6;
}Referenced by:
MiChangePageAttributeLargeFreeZeroPage
MiCoalesceFreePages
MiDeleteClusterPage
MiDeleteClusterSection
MiEnableNewPfns
MiFinishLargePageFree
MiFreeLargePageChain
MiFreeLargeZeroPages
MiInsertLargePageChain
MiLargePagePromote
MiMoveLargeFreePage
MiRebuildLargePage
MiScrubNodeLargePageList
MiTimeSingleLargePageZeroWorker
MxCreateFreePfns