MiGetPerfectColorHeadPage
__int64 __fastcall MiGetPerfectColorHeadPage(_MI_PARTITION *a1, _MMPFNLIST *a2, int a3, _MMLISTS a4, UINT8 *Flags){
unsigned __int64 Flink;
_MMLISTS v6;
int v9;
_MMPFN *v10;
unsigned __int8 CurrentIrql;
volatile signed __int32 *p_u2;
signed __int8 v13;
unsigned __int64 *p_Lock;
UINT64 v15;
_KLOCK_QUEUE_HANDLE LockQueue;
UINT64 SpinCount;
UINT64 Color;
_MMLISTS PageType;
PageType = a4;
LODWORD(Color) = a3;
Flink = a2->Flink;
v6 = a4;
memset(&LockQueue, 0, sizeof(LockQueue));
if( Flink != 0xFFFFFFFFFi64 )
{
v9 = (unsigned __int8)Flags & 1;
while( 1 )
{
v10 = &MmGetPfnDb()[Flink];
if( v9 )
{
p_u2 = (volatile signed __int32 *)&v10->u2;
if( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
return 0i64;
CurrentIrql = 17;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
p_u2 = (volatile signed __int32 *)&v10->u2;
v13 = _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64);
if( ((unsigned __int16)Flags & 0x4000) != 0 )
{
LODWORD(SpinCount) = 0;
if( v13 )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)p_u2 < 0 );
}
while( _interlockedbittestandset64(p_u2, 0x3Fui64) );
v6 = PageType;
}
}
else if( v13 )
{
goto LABEL_24;
}
}
if( (*(_BYTE *)(&v10->u3 + 1) & 7) != v6 )
break;
LockQueue.LockQueue.Next = 0i64;
p_Lock = &a2->Lock;
LockQueue.LockQueue.Lock = &a2->Lock;
if( ((unsigned __int16)Flags & 0x4000) != 0 )
{
KxAcquireQueuedSpinLock(&LockQueue.LockQueue, p_Lock);
}
else if( !KxTryToAcquireQueuedSpinLock(&LockQueue.LockQueue, p_Lock) )
{
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql != 17 )
{
LABEL_24:
__writecr8(CurrentIrql);
return 0i64;
}
return 0i64;
}
if( Flink == a2->Flink )
{
if( MiUnlinkFreeOrZeroedPage(Flink, a2, (UINT8 *)(unsigned int)Flags) )
{
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
if( !v9 && a2->Flink != 0xFFFFFFFFFi64 )
MiReplenishPageSlist(a1, PageType, (unsigned int)Color, v15);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
if( CurrentIrql != 17 )
__writecr8(CurrentIrql);
return(__int64)v10;
}
else
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
MiReturnFreeZeroPage((INT64)v10);
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql != 17 )
__writecr8(CurrentIrql);
return 1i64;
}
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockQueue);
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql != 17 )
goto LABEL_21;
LABEL_22:
Flink = a2->Flink;
if( Flink == 0xFFFFFFFFFi64 )
return 0i64;
v6 = PageType;
}
_InterlockedAnd64((volatile signed __int64 *)p_u2, 0x7FFFFFFFFFFFFFFFui64);
if( CurrentIrql == 17 )
goto LABEL_22;
LABEL_21:
__writecr8(CurrentIrql);
goto LABEL_22;
}
return 0i64;
}Referenced by:
MiGetPage
MiRemovePageAnyColor