MiGetSinglePageToZero
NTSTATUS __stdcall MiGetSinglePageToZero(
_MI_PARTITION *Partition,
_MI_ZERO_THREAD_CONTEXT *ThreadContext,
UINT64 *Color){
_MMPFNLIST *v4;
int v5;
unsigned __int64 v6;
unsigned int i;
unsigned __int64 Flink;
_MMPFN *v9;
int v10;
bool v11;
NTSTATUS v12;
_MI_ZERO_THREAD_CONTEXT v14;
_MMPFNLIST *v15;
v14 = ThreadContext[65];
v4 = Partition->PageLists.FreePagesByColor[1];
v5 = 0;
v15 = v4;
LOBYTE(v6) = 17;
for( i = 0; i < 2; ++i )
{
do
{
Flink = v4[ThreadContext[65]].Flink;
if( Flink == 0xFFFFFFFFFi64 )
goto LABEL_6;
v9 = &MmGetPfnDb()[Flink];
if( !i && v9->u2._bf_0 < 0 )
{
v5 = 1;
LABEL_6:
v9 = 0i64;
}
if( !v9 )
goto LABEL_14;
v6 = MiLockPageInline(v9);
if( Flink <= 0xFFFFFFFFFi64
&& (MmGetPfnDb()[Flink].u4._bf_0 & 0x4000000000000i64) != 0
&& (*(_BYTE *)(&v9->u3 + 1) & 7) == 1
&& (v9->u4._bf_0 & 0x1000000000i64) == 0 )
{
if( (*(_BYTE *)(&v9->u3 + 1) & 8) == 0 )
{
v5 = 0;
break;
}
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v6);
v9 = 0i64;
LABEL_14:
v10 = ThreadContext[65] & ~*(&stru_140C4DB30 + 36) | *(&stru_140C4DB30 + 36) & (ThreadContext[65] + 1);
ThreadContext[65] = v10;
goto LABEL_15;
}
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v6);
v10 = ThreadContext[65];
v9 = 0i64;
LABEL_15:
v11 = v10 == v14;
v4 = v15;
}
while( !v11 );
if( !v5 )
break;
v4 = v15;
}
if( !v9 )
return 0;
if( v9->u3.ReferenceCount )
KeBugCheckEx(0x4Eu, (PVOID)0x8D, (PVOID)Flink, (PVOID)*(unsigned int *)&v9->u3.ReferenceCount, v9->ListEntry.Blink);
v12 = MiBeginPageAccessor((_RTL_BALANCED_NODE *)ThreadContext, (INT64)v9);
_InterlockedAnd64(&v9->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8((unsigned __int8)v6);
if( v12 )
return(int)v9;
else
return 0;
}Referenced by:
MiGetPagesToZero