MiGetPerfectColorHeadPage
_MMPFN *__fastcall MiGetPerfectColorHeadPage(INT64 a1, _QWORD *a2, INT64 a3, INT64 a4, INT16 a5){
UINT64 v5;
int v6;
int v9;
volatile signed __int32 *v10;
unsigned __int8 CurrentIrql;
volatile signed __int32 *v12;
signed __int8 v13;
IO_WORKITEM_ROUTINE *v14;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT64 SpinCount;
UINT64 v18;
INT64 v19;
LODWORD(v19) = a4;
LODWORD(v18) = a3;
v5 = a2[2];
v6 = a4;
memset(&LockHandle, 0, sizeof(LockHandle));
if( v5 != 0xFFFFFFFFFi64 )
{
v9 = a5 & 1;
while( 1 )
{
v10 = (volatile signed __int32 *)((char *)MmGetPfnDb() + 48 * v5);
if( v9 )
{
v12 = v10 + 6;
if( _interlockedbittestandset64(v10 + 6, 0x3Fui64) )
return 0i64;
CurrentIrql = 17;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v12 = v10 + 6;
v13 = _interlockedbittestandset64(v10 + 6, 0x3Fui64);
if( (a5 & 0x4000) != 0 )
{
LODWORD(SpinCount) = 0;
if( v13 )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)v12 < 0 );
}
while( _interlockedbittestandset64(v12, 0x3Fui64) );
v6 = v19;
}
}
else if( v13 )
{
goto LABEL_24;
}
}
if( (*((_BYTE *)v10 + 34) & 7) != v6 )
break;
LockHandle.LockQueue.Next = 0i64;
v14 = (IO_WORKITEM_ROUTINE *)(a2 + 4);
LockHandle.LockQueue.Lock = a2 + 4;
if( (a5 & 0x4000) != 0 )
{
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, v14, (WORK_QUEUE_TYPE)a3, (PVOID)a4);
}
else if( !(unsigned int)KxTryToAcquireQueuedSpinLock(&LockHandle.LockQueue, (UINT64 *)v14) )
{
_InterlockedAnd64((volatile signed __int64 *)v12, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql != 17 )
{
LABEL_24:
__writecr8(CurrentIrql);
return 0i64;
}
return 0i64;
}
if( v5 == a2[2] )
{
if( MiUnlinkFreeOrZeroedPage(v5, (_MMPFNLIST *)a2, (UINT8 *)(unsigned int)a5) )
{
_InterlockedAnd64((volatile signed __int64 *)v12, 0x7FFFFFFFFFFFFFFFui64);
if( !v9 && a2[2] != 0xFFFFFFFFFi64 )
MiReplenishPageSlist(a1, (unsigned int)v19, (unsigned int)v18);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
if( CurrentIrql != 17 )
__writecr8(CurrentIrql);
return(_MMPFN *)v10;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
MiReturnFreeZeroPage((INT64)v10);
_InterlockedAnd64((volatile signed __int64 *)v12, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql != 17 )
__writecr8(CurrentIrql);
return(_MMPFN *)1;
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_InterlockedAnd64((volatile signed __int64 *)v12, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql != 17 )
goto LABEL_21;
LABEL_22:
v5 = a2[2];
if( v5 == 0xFFFFFFFFFi64 )
return 0i64;
v6 = v19;
}
_InterlockedAnd64((volatile signed __int64 *)v12, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql == 17 )
goto LABEL_22;
LABEL_21:
__writecr8(CurrentIrql);
goto LABEL_22;
}
return 0i64;
}Referenced by:
MiGetPage
MiRemovePageAnyColor