MiInsertLargePageChain
VOID __stdcall MiInsertLargePageChain(INT64 a1, INT64 a2, INT64 a3, INT64 a4, INT64 a5){
_BOOL8 v7;
unsigned int v8;
int v9;
unsigned int v10;
unsigned __int64 v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
INT64 v15;
PDRIVER_OBJECT v16;
char v17;
unsigned int v18;
bool v19;
INT64 *v20;
_KLOCK_QUEUE_HANDLE LockQueue;
INT64 v22;
__int128 v23;
__int64 v24;
v22 = a3;
v24 = 0i64;
v7 = (*(_DWORD *)(a2 + 16) & 0x3E0i64) != 0;
memset(&LockQueue, 0, sizeof(LockQueue));
v23 = 0i64;
LOBYTE(v8) = MiIsFreeZeroPfnCold(a2);
v10 = v8;
v11 = MiLargePageSizes[v9];
if( v9 == 2 )
{
MiConvertEntireLargePageToSmall((_KQUEUE *)a2, 2, 1u, (_LARGE_INTEGER *)v7, 0i64, 0i64);
}
else
{
v12 = MiLargePageSizes[v9 + 1];
v13 = v11 / v12;
v14 = v11 + (a2 - (__int64)MmGetPfnDb()) / 48 - v12;
v15 = 48 * (v11 - v12) + a2;
MiLockPageAtDpc(v15);
LockQueue.LockQueue.Next = 0i64;
*((_QWORD *)&v23 + 1) = v7 | 0x300000000i64;
*(_QWORD *)&v23 = v14;
LOBYTE(v24) = 2;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 4328);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 4328));
while( 1 )
{
if( (*(_BYTE *)(v15 + 34) & 7) == 6 )
{
MiSetPfnPageState(v15, 5);
MiSetFreeZeroPfnCold(v16, (PVOID)v10);
MiSetPfnPageState(v15, 6);
}
else
{
MiSetFreeZeroPfnCold((PDRIVER_OBJECT)v15, (PVOID)v10);
}
*(_BYTE *)(v15 + 39) = v17 | *(_BYTE *)(v15 + 39) & 0xFC;
if( (_DWORD)v13 == 1 )
{
if( v22 )
break;
}
v19 = *(_QWORD *)(a1 + 4352) == 0i64;
*(_QWORD *)&v23 = v14;
if( v19 )
{
HIDWORD(v23) |= 2u;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
HIDWORD(v23) &= ~2u;
}
MiInsertLargePageInNodeList((__int64)&v23);
LODWORD(v13) = v13 - 1;
if( !(_DWORD)v13 )
goto LABEL_21;
v14 -= v12;
v15 += -48i64 * v12;
v18 = HIDWORD(v23);
v19 = (BYTE12(v23) & 2) == 0;
if( (BYTE12(v23) & 2) != 0 )
{
if( _interlockedbittestandset64((volatile signed __int32 *)(v15 + 24), 0x3Fui64) )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
v18 = HIDWORD(v23) & 0xFFFFFFFD;
HIDWORD(v23) &= ~2u;
}
else
{
v18 = HIDWORD(v23);
}
v19 = (v18 & 2) == 0;
}
if( v19 )
{
HIDWORD(v23) = v18 | 2;
MiLockPageAtDpc(v15);
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 4328);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 4328));
}
}
_InterlockedAnd64((volatile signed __int64 *)(v15 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
LABEL_21:
if( (_DWORD)a5 )
{
if( (BYTE12(v23) & 2) == 0 )
{
LockQueue.LockQueue.Next = 0i64;
LockQueue.LockQueue.Lock = (unsigned __int64 *volatile)(a1 + 4328);
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, (UINT64 *)(a1 + 4328));
}
v20 = *(INT64 **)(a1 + 4288);
*(_QWORD *)(a1 + 4288) = 0i64;
--*(_DWORD *)(a1 + 4284);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
if( v20 )
MiWakeLargePageWaiters(v20);
}
else if( (BYTE12(v23) & 2) != 0 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
}
}Referenced by:
MiInsertDemotedPages