MiUnlinkNodeLargePageHelper
NTSTATUS __stdcall MiUnlinkNodeLargePageHelper(
_MI_NODE_INFORMATION *NodeInformation,
_MMPFN *Pfn1,
UINT64 LargePageIndex,
UINT64 Channel,
UINT64 Channela){
UINT64 *v5;
int v8;
__int64 v9;
_MI_PARTITION *v10;
UINT64 v11;
NTSTATUS v12;
UINT8 v13;
__int64 bf_0;
_LIST_ENTRY *Blink;
char v17;
unsigned __int64 v18;
__int64 v19;
__int64 v20;
__int64 v21;
__int64 v22;
unsigned __int64 v23;
unsigned __int64 v24;
__int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
volatile signed __int32 *v28;
unsigned int v29;
unsigned __int64 v30;
UINT64 v31;
INT64 v32;
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;} v33;
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;} v34;
UINT64 *RebuildActivated;
UINT64 Long;
unsigned int v37;
v37 = Channel;
v8 = LargePageIndex;
v9 = (unsigned int)LargePageIndex;
v10 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
v11 = MiLargePageSizes[(unsigned int)LargePageIndex];
v12 = MiDecreaseAvailablePages(v10, v11, 0xFFFFFFFFFFFFFFFFui64, 0i64);
if( (Channela & 8) == 0 && !v12 )
{
MiIncreaseAvailablePages(v10, v11, v13);
return 0;
}
bf_0 = Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
if( *(_MMPFN **)(Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 + 8) != Pfn1
|| (Blink = Pfn1->ListEntry.Blink, (_MMPFN *)Blink->Flink != Pfn1) )
{
__fastfail(3u);
}
Blink->Flink = (_LIST_ENTRY *)bf_0;
*(_QWORD *)(bf_0 + 8) = Blink;
v17 = *((_BYTE *)&Pfn1->u3 + 2);
RebuildActivated = v5;
if( (v17 & 8) != 0 )
{
MiPageListCollision(Pfn1);
MiSetOriginalPtePfnFromFreeList(&Pfn1->OriginalPte.u.Long);
v17 = *((_BYTE *)&Pfn1->u3 + 2);
}
v18 = Pfn1 - MmGetPfnDb();
v19 = NodeInformation - v10->Core.NodeInformation;
v20 = v17 & 7;
--NodeInformation->FreeLargePages[v9].LargePageFreeCount[v20];
v21 = 2i64;
if( v18 < 0x100000 )
v21 = 4i64;
--NodeInformation->FreeLargePages[v9].LargePageFreeCount[v20 + v21];
v22 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)MmGetPfnDb()[v18].u4._bf_0 >> 39) & 0x3FF));
if( *(_BYTE *)(v22 + 4830) )
{
if( v8 == 2 )
{
--*(_BYTE *)(*(_QWORD *)(v22 + 5104) + (v18 >> 9));
}
else if( v8 == 1 )
{
--*(_WORD *)(*(_QWORD *)(v22 + 5128) + 2 * (v18 >> 18));
}
}
v23 = ((unsigned __int64)*((unsigned __int8 *)&Pfn1->u3 + 2) >> 6)
+ 134 * v9
+ 4 * (v37 + 4 * (v20 + (v18 < 0x100000 ? 2 : 0)));
v24 = v18 / MiLargePageSizes[v9] % *((unsigned int *)&stru_140C4DB30 + v9 + 100);
--NodeInformation->FreeLargePages[0].LargePageEntries[0][0][0][v23][v24].EntryCount;
v25 = 2240i64;
--NodeInformation->FreeLargePages[0].LargePagesCount[0][0][0][v23];
if( (v17 & 7) != 0 )
v25 = 2304i64;
_InterlockedExchangeAdd64((volatile signed __int64 *)((char *)v10 + v25), -(__int64)v11);
if( *(&stru_140C4DB30 + 567) == 1 )
{
v26 = v18 & 0x1F;
v27 = v11;
v28 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 4 * (v18 >> 5));
if( v26 + v11 > 0x20 )
{
if( (v18 & 0x1F) != 0 )
{
_InterlockedOr(v28, ((1 << (32 - (v18 & 0x1F))) - 1) << v26);
v27 = v11 - (32 - (unsigned int)(v18 & 0x1F));
++v28;
}
if( v27 >= 0x20 )
{
v30 = v27 >> 5;
v27 += -32i64 * (v27 >> 5);
do
{
*v28++ = -1;
--v30;
}
while( v30 );
}
if( !v27 )
goto LABEL_30;
v29 = (1 << v27) - 1;
}
else
{
if( v11 == 32 )
{
*v28 = -1;
goto LABEL_30;
}
v29 = ((1 << v11) - 1) << v26;
}
_InterlockedOr(v28, v29);
}
LABEL_30:
if( !(_DWORD)v20 )
{
if( v10->PageLists.FreeListDiscard == 1 )
{
LODWORD(v20) = 1;
}
else if( (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
{
MiArePageContentsZero((PVOID)v18);
}
}
MiSetPfnPageState((INT64)Pfn1, 5);
v32 = ZeroPte.u.Hard._bf_0;
Long = ZeroPte.u.Long;
if( (_DWORD)v20 == 1 )
{
MiSetOriginalPtePfnFromFreeList(&Long);
v32 = Long;
}
v33.Long = (unsigned __int64)Pfn1->OriginalPte.u;
if( *(&stru_140C4DB30 + 42) && (v33.Long & 0x10) == 0 )
v33.Long &= ~*(&stru_140C4DB30 + 42);
Pfn1->OriginalPte.u.Long = v32;
if( HIDWORD(v33.Long) == 4294967293 )
{
LODWORD(v34.Long) = MiUpdatePageFileHighInPte(v32, 4294967293i64);
Pfn1->OriginalPte.u = (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;})v34.Long;
}
if( v11 == 16
&& 16
* (NodeInformation->FreeLargePages[2].LargePageFreeCount[0]
+ NodeInformation->FreeLargePages[2].LargePageFreeCount[1]
+ 32
* (NodeInformation->FreeLargePages[1].LargePageFreeCount[0]
+ NodeInformation->FreeLargePages[1].LargePageFreeCount[1]
+ ((NodeInformation->FreeLargePages[0].LargePageFreeCount[0]
+ NodeInformation->FreeLargePages[0].LargePageFreeCount[1]) << 9))) <= 0x200
&& (MiFlags & 0x30) != 0 )
{
MiWakeLargePageRebuild(v10, (unsigned int)v19, 0i64, v31, RebuildActivated);
}
return 1;
}Referenced by:
MiChangePageAttributeLargeFreeZeroPage
MiLargePagePromote
MiTryUnlinkNodeLargePage
MiUnlinkNodeLargePages