MiMoveBadPageCrossPartition
NTSTATUS __stdcall MiMoveBadPageCrossPartition(INT64 a1, INT64 a2, UINT64 *a3){
__int64 v5;
__int64 v6;
__int64 v7;
__int64 v8;
UINT64 v9;
unsigned __int64 v10;
_MI_PARTITION *v11;
struct _KPRCB *CurrentPrcb;
__int64 CachedResidentAvailable;
bool v14;
_KLOCK_QUEUE_HANDLE LockQueue[2];
*(_QWORD *)&LockQueue[0].OldIrql = 0i64;
LODWORD(v5) = MiSearchNumaNodeTable((PVOID)((a1 - (__int64)MmGetPfnDb()) / 48));
v6 = *(_QWORD *)(a2 + 16);
v7 = *(unsigned int *)(v5 + 8);
LockQueue[0].LockQueue.Next = 0i64;
v8 = 4544 * v7;
LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(4544 * v7 + v6 + 4328);
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, LockQueue[0].LockQueue.Lock);
--*(_QWORD *)(v8 + v6 + 4352);
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
v9 = a3[2];
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = (unsigned __int64 *volatile)(v8 + v9 + 4328);
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, LockQueue[0].LockQueue.Lock);
v10 = 1i64;
++*(_QWORD *)(v8 + v9 + 4352);
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
MiAcquireNonPagedResources((_MI_PARTITION *)a3, 1ui64);
MiReturnCommit((_MI_PARTITION *)a2, 1ui64);
v11 = &Irp;
if( (_MI_PARTITION *)a2 != &Irp )
goto LABEL_12;
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = (int)CurrentPrcb->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable == -1 )
goto LABEL_12;
if( (unsigned __int64)(CachedResidentAvailable + 1) > 0x100 )
{
LABEL_7:
if( (int)CachedResidentAvailable > 192 && (_DWORD)CachedResidentAvailable != -1 )
{
LODWORD(v11) = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
192,
CachedResidentAvailable);
if( (_DWORD)CachedResidentAvailable == (_DWORD)v11 )
{
LODWORD(v11) = CachedResidentAvailable - 192;
v10 = (int)CachedResidentAvailable - 192 + 1i64;
}
}
if( !v10 )
return(int)v11;
LABEL_12:
_InterlockedExchangeAdd64((volatile signed __int64 *)(a2 + 7168), v10);
return(int)v11;
}
while( 1 )
{
LODWORD(v11) = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable + 1,
CachedResidentAvailable);
v14 = (_DWORD)CachedResidentAvailable == (_DWORD)v11;
CachedResidentAvailable = (int)v11;
if( v14 )
return(int)v11;
if( (_DWORD)v11 != -1 )
{
LODWORD(v11) = (_DWORD)v11 + 1;
if( (unsigned __int64)(CachedResidentAvailable + 1) <= 0x100 )
continue;
}
goto LABEL_7;
}
}Referenced by:
MiActOnPartitionNodePages
MiMoveLargeFreePage
MiTransferPartitionPageRun