MiRemovePageAnyColor
INT64 __fastcall MiRemovePageAnyColor(INT64 rcx0, UINT64 a2, UINT64 a3){
_MI_PARTITION *v3;
__int16 v4;
__int64 v5;
_BOOL8 v6;
unsigned __int64 v7;
_QWORD *v8;
unsigned int v9;
unsigned __int64 v10;
int v11;
unsigned __int64 v12;
int v13;
unsigned int v14;
unsigned __int64 v15;
_DWORD *v16;
int v17;
unsigned int v18;
INT64 result;
unsigned int v20;
int v21;
unsigned int v22;
char v23;
__int64 v24;
INT16 a5;
_MMLISTS PageType;
BOOL v28;
a5 = a3;
v3 = (_MI_PARTITION *)rcx0;
v4 = a3;
LODWORD(v5) = a2;
v6 = (a3 & 2) == 0;
v7 = *(_QWORD *)(rcx0 + 16) + 4544 * ((unsigned __int64)(unsigned int)a2 >> byte_140C4DBCC);
if( (unsigned int)MmNumberOfChannels > 1 )
v8 = (_QWORD *)(v7
+ 8
* (v6
+ 2i64 * (unsigned __int8)(MiChannelMaximumPowerOf2Mask & ((unsigned int)v5 >> byte_140C4DBCD))
+ 527));
else
v8 = (_QWORD *)(v7 + 4128 + 8 * v6);
if( !*v8 )
return 0i64;
v9 = dword_140C4DC38;
v10 = 0i64;
v11 = v5;
v12 = v7 + 16 * (v6 + 252);
v24 = *((_QWORD *)v3 + v6 + 272);
v13 = 0;
v14 = dword_140C4DC38 + 1;
while( 1 )
{
while( 1 )
{
v15 = (unsigned int)v5 & v9;
v16 = (_DWORD *)(*(_QWORD *)(v12 + 8) + 4 * (v15 >> 5));
if( (_DWORD *)v10 != v16 )
{
v10 = *(_QWORD *)(v12 + 8) + 4 * ((unsigned __int64)((unsigned int)v5 & v9) >> 5);
v13 = *v16 & (-1 << (v15 & 0x1F));
if( (v4 & 0x4000) != 0 )
{
v21 = 0;
v22 = (unsigned __int8)v11 & (unsigned __int8)v9 & 0xF;
do
{
v23 = v22 & 0x1F;
v22 += 16;
v21 |= 1 << v23;
}
while( v22 < 0x20 && v22 <= v9 );
v13 &= ~v21;
v3 = (_MI_PARTITION *)rcx0;
}
else if( ((v15 ^ v14) & 0xFFFFFFFFFFFFFFE0ui64) == 0 )
{
v13 &= (1 << (v14 & 0x1F)) - 1;
}
}
v17 = v5 & v9 & 0xFFFFFFE0;
if( v13 )
break;
v20 = v17 + 32;
if( v20 >= v14 )
{
v10 = 0i64;
if( !v11 || v14 != v9 + 1 )
return 0i64;
v14 = v11 & v9;
LODWORD(v5) = v11 & ~v9;
}
else
{
LODWORD(v5) = v20 + (~v9 & v5);
}
}
_BitScanForward(&v18, v13);
PageType = v6;
v28 = v6;
v5 = v18 + v17 + (~v9 & (unsigned int)v5);
v13 &= ~(1 << v18);
result = MiSlistGetFreePage(v3, (_MMLISTS)&PageType, (unsigned int)v5);
if( result )
return result;
result = (INT64)MiGetPerfectColorHeadPage(rcx0, (_QWORD *)(v24 + 40 * v5), (unsigned int)v5, v6, a5);
if( result == 1 )
break;
if( result )
return result;
v3 = (_MI_PARTITION *)rcx0;
v4 = a5;
}
return 1i64;
}Referenced by:
MiGetFreeOrZeroPageAnyColor