MiBuildReservationCluster
UINT64 __stdcall MiBuildReservationCluster(
UINT64 *Page,
_MMPAGING_FILE *PagingFile,
UINT64 *ClusterSize,
UINT64 *ChargedPages){
INT64 v4;
__int16 v5;
__int64 v6;
__int64 v7;
UINT64 v8;
_MMPFN *PfnDb;
INT64 v10;
unsigned __int8 *v11;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
UINT64 v15;
INT64 v16;
unsigned int v17;
__int64 v18;
unsigned __int64 v19;
INT64 v20;
UNICODE_STRING *v21;
PWCHAR v22;
int v23;
_QWORD *v24;
_QWORD *v25;
__int64 v26;
__int64 v27;
INT64 v28;
__int64 v29;
unsigned __int64 v30;
__int64 v31;
INT64 updated;
unsigned __int64 v33;
INT64 v34;
int v35;
INT64 v36;
ULONG_PTR v37;
__int64 v38;
int v39;
unsigned int v40;
__int64 v41;
unsigned __int64 v42;
__int64 v43;
INT64 v44;
UINT8 *v45;
ULONG_PTR v46;
__int64 v47;
UINT64 *v48;
unsigned __int64 v49;
unsigned __int64 v50;
__int64 v51;
int v52;
_MMPAGING_FILE *v53;
_DWORD *v54;
INT64 v56;
INT64 v57;
INT64 v58;
INT64 v59;
INT64 v60;
INT64 v61;
UINT64 *Src;
INT64 v63;
INT64 a2;
int v65;
INT64 v66;
_MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps;
INT64 v68;
INT64 v69[2];
__int128 v70;
__int64 v71;
UINT64 *v72;
v72 = Page;
v4 = *((_QWORD *)PagingFile + 31);
v5 = *((_WORD *)PagingFile + 102);
Src = Page;
v60 = 0i64;
LODWORD(v61) = 0;
v71 = 0i64;
memset(&ReferencedBitmaps, 0, sizeof(ReferencedBitmaps));
*(_OWORD *)v69 = 0i64;
v70 = 0i64;
MiRefPageFileSpaceBitmaps(PagingFile, &ReferencedBitmaps);
LODWORD(v63) = 0;
v6 = v5 & 0xF;
v7 = 5 * v6;
v8 = *(_QWORD *)(v4 + 40 * v6 + 2832);
if( v8 == 0xFFFFFFFFFi64 )
{
LABEL_66:
v17 = 0;
LODWORD(v14) = 0;
LABEL_67:
v48 = Src;
goto LABEL_68;
}
PfnDb = MmGetPfnDb();
while( 1 )
{
v10 = (INT64)PfnDb + 48 * v8;
v12 = (unsigned __int8)MiLockPageInline(v10);
if( v8 == *(_QWORD *)(v4 + 8 * v7 + 2832) )
break;
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
LABEL_11:
v8 = *(_QWORD *)(v4 + 8 * v7 + 2832);
PfnDb = MmGetPfnDb();
if( v8 == 0xFFFFFFFFFi64 )
goto LABEL_66;
}
v13 = *(_QWORD *)(v10 + 16);
if( qword_140C4DC80 && (v13 & 0x10) == 0 )
v13 &= ~qword_140C4DC80;
v14 = HIDWORD(v13);
if( (unsigned int)v14 >= ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
{
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
goto LABEL_66;
}
if( _bittest64((const signed __int64 *)ReferencedBitmaps.AllocationBitmap.Buffer, v14) )
{
MiUnlinkPageFromList((_MMPFN *)v10, 0i64);
v15 = *(_QWORD *)(v10 + 16);
*(_QWORD *)(v10 + 16) = v15 & 0xFFFFFFFFFFFFFFFDui64;
MiInsertPageInList((_MMPFN *)v10, 8ui64);
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
MiReleasePageFileInfo(v4, v15, 0, v16, v56, v57, v58, v59, v60, v61, (INT64)Src, v63);
goto LABEL_11;
}
MiReferencePageForModifiedWrite((_MMPFN *)v10, 1u, v11);
v17 = 1;
*v72 = v8;
if( *(_DWORD *)ClusterSize == 1 )
{
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
goto LABEL_67;
}
v18 = *(_QWORD *)(v10 + 16);
v19 = *(_QWORD *)(v10 + 8) | 0x8000000000000000ui64;
a2 = *(_QWORD *)(v10 + 40) & 0xFFFFFFFFFi64;
v66 = (INT64)MmGetPfnDb() + 48 * a2;
MiLockNestedPageAtDpcInline(v66);
v20 = v66;
v21 = *(UNICODE_STRING **)(v66 + 24);
*(_QWORD *)(v66 + 24) = (unsigned __int64)v21 ^ (((unsigned __int64)&v21->Length + 1) ^ (unsigned __int64)v21) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)(v20 + 24), 0x7FFFFFFFFFFFFFFFui64);
_InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
LOBYTE(v23) = MI_PFN_IS_PROTO((UNICODE_STRING *)v10, v21, v20, v22);
if( v23
&& (!(unsigned int)MiGetPageFileSectionForReservation(v19, (__int64)v69, 0)
|| (LODWORD(v61) = 1, (*(_QWORD *)(v10 + 24) & 0x4000000000000000i64) != 0))
|| (v24 = (_QWORD *)MiReservePtes((INT64)&qword_140C4EC80, 1ui64), v68 = (INT64)v24, (v25 = v24) == 0i64) )
{
v48 = Src;
}
else
{
*v24 = MiMakeValidPte((UINT64)v24, a2, 536870913i64);
v26 = ((_QWORD)v25 << 25) - ((_QWORD)MmGetPteBase() << 25);
v27 = 8 * ((v19 >> 3) & 0x1FF);
v28 = v27 + (v26 >> 16);
a2 = v28;
if( (_DWORD)v61 )
v29 = 8 * ((*((_QWORD *)&v70 + 1) >> 3) & 0x1FFi64);
else
v29 = 4088i64;
v30 = v18 & 0xFFFFFFFFFC00FC1Fui64;
v31 = (v29 - v27) >> 3;
updated = v30;
v33 = v30;
v65 = *(_DWORD *)ClusterSize;
if( (unsigned int)v31 >= v65 - 1 )
LODWORD(v31) = v65 - 1;
if( qword_140C4DC80 && (v30 & 0x10) == 0 )
v33 = v30 & ~qword_140C4DC80;
v34 = HIDWORD(v33);
if( v34 + (unsigned __int64)(unsigned int)v31 >= ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
LODWORD(v31) = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap - v34 - 1;
v35 = v63;
v36 = v28;
if( (_DWORD)v31 )
{
do
{
++v34;
v63 = v36 + 8;
updated = MiUpdatePageFileHighInPte(updated, v34);
v38 = MiGetPageForWriteCluster((__int64)&ReferencedBitmaps.AllocationBitmap, v37, updated);
if( v38 == -1 )
break;
LODWORD(v31) = v31 - 1;
++v17;
*++v72 = v38;
if( v38 == qword_140C4EAA8 )
++v35;
if( HIDWORD(v60) == 3 && v17 >= 0x10 )
break;
v36 = v63;
}
while( (_DWORD)v31 );
LOWORD(v28) = a2;
}
v17 -= v60;
v39 = v35 - v60;
v40 = v65 - v17;
LODWORD(v63) = v39;
if( (_DWORD)v61 )
v41 = v27 - 8 * (((unsigned __int64)v70 >> 3) & 0x1FF);
else
v41 = v28 & 0xFFF;
v42 = v30;
v43 = v41 >> 3;
if( (unsigned int)v43 >= v40 )
v43 = v40;
if( qword_140C4DC80 && (v30 & 0x10) == 0 )
v42 = v30 & ~qword_140C4DC80;
v44 = HIDWORD(v42);
if( (unsigned int)v43 > (unsigned __int64)(v44 - 1) )
v43 = (unsigned int)(v44 - 1);
if( (_DWORD)v43 )
{
v45 = (UINT8 *)&Src[v43];
memmove(v45, (UINT8 *)Src, 8i64 * v17);
do
{
--v44;
a2 -= 8i64;
v30 = MiUpdatePageFileHighInPte(v30, v44);
v47 = MiGetPageForWriteCluster((__int64)&ReferencedBitmaps.AllocationBitmap, v46, v30);
if( v47 == -1 )
break;
v45 -= 8;
LODWORD(v43) = v43 - 1;
++v17;
*(_QWORD *)v45 = v47;
if( v47 == qword_140C4EAA8 )
++v39;
}
while( (HIDWORD(v60) != 3 || v17 < 0x10) && (_DWORD)v43 );
v48 = Src;
LODWORD(v63) = v39;
if( Src != (UINT64 *)v45 )
memmove((UINT8 *)Src, v45, 8i64 * v17);
}
else
{
v48 = Src;
}
v49 = *((_QWORD *)MmGetPfnDb() + 6 * *v48 + 2);
if( qword_140C4DC80 && (v49 & 0x10) == 0 )
v49 &= ~qword_140C4DC80;
v14 = HIDWORD(v49);
MiReleasePtes((INT64)&qword_140C4EC80, v68, 1ui64);
}
v50 = (unsigned __int8)MiLockPageInline(v66);
MiDecrementShareCount(v66);
_InterlockedAnd64((volatile signed __int64 *)(v66 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v50);
if( (_DWORD)v61 )
MiReleasePageFileSectionInfo((INT64)v69);
LABEL_68:
v51 = *(unsigned int *)ClusterSize;
if( v17 < (unsigned int)v51
&& v17
&& v17 + (unsigned __int64)(unsigned int)v14 < ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
{
if( (unsigned __int64)(unsigned int)v14 + v51 <= ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
v52 = *(_DWORD *)ClusterSize;
else
v52 = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap - v14;
v53 = PagingFile;
v17 += MiAddToReservationCluster(
(__int64)PagingFile,
(__int64)&ReferencedBitmaps.AllocationBitmap,
v52 - v17,
(unsigned int)v14 + v17,
&v48[v17],
&v63);
}
else
{
v53 = PagingFile;
}
v54 = MiDerefPageFileSpaceBitmaps((__int64)v53, &ReferencedBitmaps, 0);
if( v54 )
ExFreePoolWithTag(v54, 0);
*(_DWORD *)ClusterSize = v17;
*(_DWORD *)ChargedPages = v17 - v63;
return(unsigned int)v14;
}Referenced by:
MiGatherPagefilePages