MiAddToReservationCluster
NTSTATUS __stdcall MiAddToReservationCluster(
_MMPAGING_FILE *PagingFile,
_RTL_BITMAP *AllocationBitmap,
UINT64 AdditionalPagesMax,
UINT64 CompareOffset,
UINT64 *MdlPage,
UINT64 *TotalDummyPages){
unsigned int v6;
_MI_PARTITION *Partition;
unsigned int v8;
__int64 v9;
UINT64 v11;
_MMPFN *v12;
unsigned int v13;
unsigned __int64 v14;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v15;
unsigned __int64 Long_high;
_MI_RESAVAIL_CHARGE v17;
unsigned int *Buffer;
unsigned int *v20;
unsigned int v21;
unsigned int *v22;
bool v23;
bool i;
__int64 v25;
UINT64 v26;
_MMPTE *PointerPte;
unsigned int v29;
v29 = AdditionalPagesMax;
v6 = 0;
Partition = PagingFile->Partition;
PointerPte = (_MMPTE *)Partition;
v8 = CompareOffset;
v9 = 5i64 * (PagingFile->_bf_cc & 0xF);
v25 = v9;
if( (_DWORD)AdditionalPagesMax )
{
while( 1 )
{
v11 = *(&Partition->PageLists.ModifiedPageListByReservation[0].Flink + v9);
v26 = v11;
if( v11 == 0xFFFFFFFFFi64 )
break;
v12 = &MmGetPfnDb()[v11];
v13 = 0;
v14 = MiLockPageInline(v12);
if( v11 == PointerPte[v25 + 354].u.Long )
{
v15.Long = (unsigned __int64)v12->OriginalPte.u;
if( *(&stru_140C4DB30 + 42) && (v15.Long & 0x10) == 0 )
v15.Long &= ~*(&stru_140C4DB30 + 42);
Long_high = HIDWORD(v15.Long);
if( (_DWORD)Long_high != v8 )
{
v13 = Long_high - v8;
if( !MI_IS_PTE_IN_WS_SWAP_SET(PointerPte) || (unsigned int)Long_high < v8 || v13 > 0x1F || v13 + v6 >= v29 )
goto LABEL_16;
}
if( _bittest64((const signed __int64 *)AllocationBitmap->Buffer, Long_high) )
goto LABEL_16;
if( v13 )
{
if( v8 >= AllocationBitmap->SizeOfBitMap )
goto LABEL_16;
if( v13 > 1 )
{
if( AllocationBitmap->SizeOfBitMap - v8 < v13 )
goto LABEL_16;
Buffer = AllocationBitmap->Buffer;
v20 = &Buffer[(unsigned __int64)v8 >> 5];
v21 = *v20;
v22 = &Buffer[(unsigned __int64)(v13 + v8 - 1) >> 5];
if( v20 != v22 )
{
for( i = (v21 & (-1 << v8)) == 0; i; i = *v20 == 0 )
{
if( ++v20 == v22 )
{
v23 = ((0xFFFFFFFF >> ~(v13 + v8 - 1)) & *v20) == 0;
goto LABEL_37;
}
}
LABEL_16:
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
return v6;
}
v23 = (v21 & (0xFFFFFFFF >> (32 - v13) << v8)) == 0;
LABEL_37:
if( !v23 )
goto LABEL_16;
}
else if( _bittest((const signed __int32 *)AllocationBitmap->Buffer, v8) )
{
goto LABEL_16;
}
}
v17 = MiReferencePageForModifiedWrite(v12, 0i64);
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
if( v17 == MiChargeFailed )
return v6;
if( v13 )
{
v6 += v13;
v8 += v13;
*(_DWORD *)TotalDummyPages += v13;
do
{
*MdlPage++ = *(&stru_140C4DB30 + 495);
--v13;
}
while( v13 );
}
++v6;
*MdlPage = v26;
++v8;
++MdlPage;
if( v17 == MiChargedGlobalNowLow && v6 >= 0x10 )
return v6;
}
else
{
_InterlockedAnd64(&v12->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
}
if( v6 == v29 )
return v6;
Partition = (_MI_PARTITION *)PointerPte;
v9 = v25;
}
}
return v6;
}Referenced by:
MiBuildReservationCluster