MiExtendPagingFileMaximum
VOID __stdcall MiExtendPagingFileMaximum(
_MMPAGING_FILE *PagingFile,
_MI_PAGING_FILE_SPACE_BITMAPS *NewBitmap,
UINT64 *PageHash){
_RTL_BITMAP *p_AllocationBitmap;
unsigned __int8 v7;
_MI_PAGING_FILE_SPACE_BITMAPS *Bitmaps;
unsigned __int64 v9;
_MMPTE *PteBase;
unsigned int SizeOfBitMap;
_MMPTE *v12;
size_t v13;
UINT64 v14;
unsigned int v15;
__int128 v16;
_MI_PAGING_FILE_SPACE_BITMAPS *v17;
_KTBFLUSH_TYPE v18;
_MMPTE *v19;
unsigned int v20;
unsigned __int64 v21;
UINT64 v22;
UINT64 v23;
UINT64 v24;
_MMPFN *v25;
unsigned __int64 v26;
unsigned __int64 v27;
UINT64 v28;
UINT64 v29;
__int64 v30;
char *v31;
INT64 *SpinLock;
_MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps;
unsigned int v34;
UINT64 v35;
UINT64 NumberOfPtes;
UINT64 v37;
_MMPTE *PointerPte;
v37 = (UINT64)PageHash;
p_AllocationBitmap = &NewBitmap->AllocationBitmap;
RtlSetAllBits(&NewBitmap->AllocationBitmap);
RtlSetAllBits(&NewBitmap->ReservationBitmap);
SpinLock = (INT64 *)&PagingFile->SpinLock;
v7 = ExAcquireSpinLockExclusive((INT64 *)&PagingFile->SpinLock);
Bitmaps = PagingFile->Bitmaps;
v9 = v7;
PteBase = MmGetPteBase();
SizeOfBitMap = Bitmaps->AllocationBitmap.SizeOfBitMap;
v34 = SizeOfBitMap;
if( PageHash )
{
v12 = (_MMPTE *)((char *)PteBase + (((unsigned __int64)PagingFile->PageHash >> 9) & 0x7FFFFFFFF8i64));
PointerPte = v12;
v31 = (char *)PteBase + (((unsigned __int64)PageHash >> 9) & 0x7FFFFFFFF8i64);
NumberOfPtes = ((4 * (unsigned __int64)SizeOfBitMap) >> 12) + (((4i64 * SizeOfBitMap) & 0xFFF) != 0);
memmove(v31, v12, 8 * NumberOfPtes);
memset(v12, 0i64, 8 * NumberOfPtes);
SizeOfBitMap = v34;
}
else
{
PointerPte = 0i64;
v31 = 0i64;
NumberOfPtes = 0i64;
}
v13 = 8 * ((SizeOfBitMap >> 6) + ((SizeOfBitMap & 0x3F) != 0));
memmove(NewBitmap->AllocationBitmap.Buffer, Bitmaps->AllocationBitmap.Buffer, v13);
memmove(NewBitmap->ReservationBitmap.Buffer, Bitmaps->ReservationBitmap.Buffer, v13);
v14 = Bitmaps->AllocationBitmap.SizeOfBitMap;
v15 = 8 * v13 - v14;
if( v15 )
{
RtlSetBits(p_AllocationBitmap, v14, v15);
RtlSetBits(&NewBitmap->ReservationBitmap, Bitmaps->ReservationBitmap.SizeOfBitMap, v15);
}
PagingFile->MaximumSize = p_AllocationBitmap->SizeOfBitMap;
v16 = *(_OWORD *)&Bitmaps->AllocationBitmap.Buffer;
*(_QWORD *)&ReferencedBitmaps.AllocationBitmap.SizeOfBitMap = *(_QWORD *)&Bitmaps->AllocationBitmap.SizeOfBitMap;
ReferencedBitmaps.Anchor = Bitmaps;
ReferencedBitmaps.ReservationBitmap.Buffer = Bitmaps->ReservationBitmap.Buffer;
*(_OWORD *)&ReferencedBitmaps.AllocationBitmap.Buffer = v16;
v17 = MiDerefPageFileSpaceBitmaps(PagingFile, &ReferencedBitmaps, 1ui64);
PagingFile->Bitmaps = NewBitmap;
PagingFile->PageHash = (unsigned int *)v37;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&PagingFile->SpinLock);
__writecr8(v9);
if( v17 )
ExFreePoolWithTag(v17, 0);
v19 = PointerPte;
if( PointerPte )
{
v20 = NumberOfPtes;
if( NumberOfPtes )
{
v21 = (unsigned __int64)v31;
v22 = NumberOfPtes;
v35 = NumberOfPtes;
do
{
LODWORD(v23) = MI_READ_PTE_LOCK_FREE(v21);
v37 = v23;
v24 = v23;
if( (v23 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v37);
v25 = &MmGetPfnDb()[(v24 >> 12) & 0xFFFFFFFFFi64];
if( (v25->PteLong | 0x8000000000000000ui64) != v21 )
{
v26 = MiLockPageInline(v25);
v27 = (unsigned __int8)ExAcquireSpinLockExclusive(SpinLock);
LODWORD(v28) = MI_READ_PTE_LOCK_FREE(v21);
v37 = v28;
if( (v28 & 1) != 0
&& v25 == &MmGetPfnDb()[(v28 >> 12) & 0xFFFFFFFFFi64]
&& (v25->PteLong | 0x8000000000000000ui64) != v21 )
{
LODWORD(v29) = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v21 >> 9) & 0x7FFFFFFFF8i64));
v37 = v29;
v30 = (v25->u4._bf_0 ^ (v29 >> 12)) & 0xFFFFFFFFFi64;
v25->PteLong = v21;
v25->u4._bf_0 ^= v30;
}
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
__writecr8(v27);
_InterlockedAnd64(&v25->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v26);
v22 = v35;
}
}
v21 += 8i64;
v35 = --v22;
}
while( v22 );
v20 = NumberOfPtes;
v19 = PointerPte;
}
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), v19, v20, v18);
}
}Referenced by:
MiCreatePagingFile