MiAddToReservationCluster
__int64 __fastcall MiAddToReservationCluster(
__int64 a1,
__int64 a2,
unsigned int a3,
unsigned int a4,
_QWORD *a5,
_DWORD *a6){
unsigned int v6;
MMPTE *v7;
__int64 v9;
__int64 v11;
char *v12;
unsigned int v13;
unsigned __int64 v14;
unsigned __int8 *v15;
unsigned __int64 v16;
unsigned __int64 v17;
int v18;
__int64 v20;
int v21;
unsigned __int8 *v22;
bool v23;
bool i;
__int64 v25;
__int64 v26;
MMPTE *PointerPte;
v6 = 0;
v7 = *(MMPTE **)(a1 + 248);
PointerPte = v7;
v9 = 5i64 * (*(_WORD *)(a1 + 204) & 0xF);
v25 = v9;
if( a3 )
{
while( 1 )
{
v11 = *((_QWORD *)v7 + v9 + 354);
v26 = v11;
if( v11 == 0xFFFFFFFFFi64 )
break;
v12 = (char *)MmGetPfnDb() + 48 * v11;
v13 = 0;
v14 = (unsigned __int8)MiLockPageInline((INT64)v12);
if( v11 == *((_QWORD *)PointerPte + v25 + 354) )
{
v16 = *((_QWORD *)v12 + 2);
if( qword_140C4DC80 && (v16 & 0x10) == 0 )
v16 &= ~qword_140C4DC80;
v17 = HIDWORD(v16);
if( (_DWORD)v17 != a4 )
{
v13 = v17 - a4;
if( !(unsigned int)MI_IS_PTE_IN_WS_SWAP_SET(PointerPte)
|| (unsigned int)v17 < a4
|| v13 > 0x1F
|| v13 + v6 >= a3 )
{
goto LABEL_16;
}
}
if( _bittest64(*(const signed __int64 **)(a2 + 8), v17) )
goto LABEL_16;
if( v13 )
{
if( a4 >= *(_DWORD *)a2 )
goto LABEL_16;
if( v13 > 1 )
{
if( *(_DWORD *)a2 - a4 < v13 )
goto LABEL_16;
v20 = *(_QWORD *)(a2 + 8);
v15 = (unsigned __int8 *)(v20 + 4 * ((unsigned __int64)a4 >> 5));
v21 = *(_DWORD *)v15;
v22 = (unsigned __int8 *)(v20 + 4 * ((unsigned __int64)(v13 + a4 - 1) >> 5));
if( v15 != v22 )
{
for( i = (v21 & (-1 << a4)) == 0; i; i = *(_DWORD *)v15 == 0 )
{
v15 += 4;
if( v15 == v22 )
{
v23 = ((0xFFFFFFFF >> ~(v13 + a4 - 1)) & *(_DWORD *)v15) == 0;
goto LABEL_37;
}
}
LABEL_16:
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
return v6;
}
v23 = (v21 & (0xFFFFFFFF >> (32 - v13) << a4)) == 0;
LABEL_37:
if( !v23 )
goto LABEL_16;
}
else if( _bittest(*(const signed __int32 **)(a2 + 8), a4) )
{
goto LABEL_16;
}
}
v18 = MiReferencePageForModifiedWrite((_MMPFN *)v12, 0, v15);
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
if( !v18 )
return v6;
if( v13 )
{
v6 += v13;
a4 += v13;
*a6 += v13;
do
{
*a5++ = qword_140C4EAA8;
--v13;
}
while( v13 );
}
++v6;
*a5 = v26;
++a4;
++a5;
if( v18 == 3 && v6 >= 0x10 )
return v6;
}
else
{
_InterlockedAnd64((volatile signed __int64 *)v12 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
}
if( v6 == a3 )
return v6;
v7 = PointerPte;
v9 = v25;
}
}
return v6;
}Referenced by:
MiBuildReservationCluster