MiUnlinkNodeLargePageHelper
BOOL __fastcall MiUnlinkNodeLargePageHelper(
_MI_NODE_INFORMATION *NodeInformation,
_MMPFN *Pfn1,
INT64 LargePageIndex,
UINT64 Channel){
UINT64 *v4;
int v7;
__int64 v8;
__int64 v9;
UINT64 v10;
int v11;
__int64 v13;
_MMPFN **v14;
char v15;
unsigned __int64 v16;
__int64 v17;
__int64 v18;
__int64 v19;
__int64 v20;
unsigned __int64 v21;
unsigned __int64 v22;
__int64 v23;
unsigned __int64 v24;
unsigned __int64 v25;
volatile signed __int32 *v26;
unsigned int v27;
unsigned __int64 v28;
UINT64 v29;
INT64 v30;
unsigned __int64 v31;
UINT64 *RebuildActivated;
UINT64 v33;
unsigned int v34;
char v35;
v34 = Channel;
v7 = LargePageIndex;
v8 = (unsigned int)LargePageIndex;
v9 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)Pfn1 + 5) >> 39) & 0x3FFi64));
v10 = MiLargePageSizes[(unsigned int)LargePageIndex];
v11 = MiDecreaseAvailablePages((_MI_PARTITION *)v9, v10, 0xFFFFFFFFFFFFFFFFui64, 0i64);
if( (v35 & 8) == 0 && !v11 )
{
MiIncreaseAvailablePages((_MI_PARTITION *)v9, v10);
return 0;
}
v13 = *(_QWORD *)Pfn1;
if( *(_MMPFN **)(*(_QWORD *)Pfn1 + 8i64) != Pfn1 || (v14 = (_MMPFN **)*((_QWORD *)Pfn1 + 1), *v14 != Pfn1) )
__fastfail(3u);
*v14 = (_MMPFN *)v13;
*(_QWORD *)(v13 + 8) = v14;
v15 = *((_BYTE *)Pfn1 + 34);
RebuildActivated = v4;
if( (v15 & 8) != 0 )
{
MiPageListCollision((INT64)Pfn1);
MiSetOriginalPtePfnFromFreeList((UINT64 *)Pfn1 + 2);
v15 = *((_BYTE *)Pfn1 + 34);
}
v16 = (Pfn1 - MmGetPfnDb()) / 48;
v17 = ((__int64)NodeInformation - *(_QWORD *)(v9 + 16)) / 4544;
v18 = v15 & 7;
--*((_QWORD *)NodeInformation + 134 * v8 + v18);
v19 = 2i64;
if( v16 < 0x100000 )
v19 = 4i64;
--*((_QWORD *)NodeInformation + 134 * v8 + v18 + v19);
v20 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)MmGetPfnDb() + 6 * v16 + 5) >> 39) & 0x3FFi64));
if( *(_BYTE *)(v20 + 4830) )
{
if( v7 == 2 )
{
--*(_BYTE *)(*(_QWORD *)(v20 + 5104) + (v16 >> 9));
}
else if( v7 == 1 )
{
--*(_WORD *)(*(_QWORD *)(v20 + 5128) + 2 * (v16 >> 18));
}
}
v21 = ((unsigned __int64)*((unsigned __int8 *)Pfn1 + 34) >> 6)
+ 134 * v8
+ 4 * (v34 + 4 * (v18 + (v16 < 0x100000 ? 2 : 0)));
v22 = 3 * (v16 / MiLargePageSizes[v8] % (unsigned int)dword_140C4DCC0[v8]);
--*(_QWORD *)(*((_QWORD *)NodeInformation + v21 + 70) + 8 * v22 + 16);
v23 = 2240i64;
--*((_QWORD *)NodeInformation + v21 + 6);
if( (v15 & 7) != 0 )
v23 = 2304i64;
_InterlockedExchangeAdd64((volatile signed __int64 *)(v23 + v9), -(__int64)v10);
if( dword_140C4E40C == 1 )
{
v24 = v16 & 0x1F;
v25 = v10;
v26 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v16 >> 5));
if( v24 + v10 > 0x20 )
{
if( (v16 & 0x1F) != 0 )
{
_InterlockedOr(v26, ((1 << (32 - (v16 & 0x1F))) - 1) << v24);
v25 = v10 - (32 - (unsigned int)(v16 & 0x1F));
++v26;
}
if( v25 >= 0x20 )
{
v28 = v25 >> 5;
v25 += -32i64 * (v25 >> 5);
do
{
*v26++ = -1;
--v28;
}
while( v28 );
}
if( !v25 )
goto LABEL_30;
v27 = (1 << v25) - 1;
}
else
{
if( v10 == 32 )
{
*v26 = -1;
goto LABEL_30;
}
v27 = ((1 << v10) - 1) << v24;
}
_InterlockedOr(v26, v27);
}
LABEL_30:
if( !(_DWORD)v18 )
{
if( *(_BYTE *)(v9 + 4829) == 1 )
{
LODWORD(v18) = 1;
}
else if( (MiFlags & 0x80u) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
{
MiArePageContentsZero((PVOID)v16);
}
}
MiSetPfnPageState((INT64)Pfn1, 5);
v30 = ZeroPte;
v33 = ZeroPte;
if( (_DWORD)v18 == 1 )
{
MiSetOriginalPtePfnFromFreeList(&v33);
v30 = v33;
}
v31 = *((_QWORD *)Pfn1 + 2);
if( qword_140C4DC80 && (v31 & 0x10) == 0 )
v31 &= ~qword_140C4DC80;
*((_QWORD *)Pfn1 + 2) = v30;
if( HIDWORD(v31) == 4294967293 )
*((_QWORD *)Pfn1 + 2) = MiUpdatePageFileHighInPte(v30, 4294967293i64);
if( v10 == 16
&& (unsigned __int64)(16
* (*((_QWORD *)NodeInformation + 268)
+ *((_QWORD *)NodeInformation + 269)
+ 32i64
* (*((_QWORD *)NodeInformation + 134)
+ *((_QWORD *)NodeInformation + 135)
+ ((*(_QWORD *)NodeInformation + *((_QWORD *)NodeInformation + 1)) << 9)))) <= 0x200
&& (MiFlags & 0x30) != 0 )
{
MiWakeLargePageRebuild((_MI_PARTITION *)v9, (unsigned int)v17, 0i64, v29, RebuildActivated);
}
return 1;
}Referenced by:
MiChangePageAttributeLargeFreeZeroPage
MiLargePagePromote
MiTryUnlinkNodeLargePage
MiUnlinkNodeLargePages