MiLargePageFreeToZero
VOID __stdcall MiLargePageFreeToZero(UINT64 BaseLargePage, UINT64 LargePageIndex, UINT8 a3){
char v3;
UINT64 v5;
char v6;
_MMPFN *PfnDb;
int v8;
INT64 v9;
__int64 v10;
unsigned __int64 v11;
__int64 v12;
__int64 v13;
__int64 v14;
PVOID v15;
__int64 v16;
UINT64 v17;
volatile signed __int32 *v18;
int v19;
unsigned __int64 v20;
__int64 v21;
_QWORD *v22;
__int64 v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
UINT64 v28;
unsigned __int64 v29;
volatile signed __int32 *v30;
unsigned int v31;
unsigned __int64 v32;
unsigned __int64 v33;
UINT64 v34;
INT64 *v35;
__int64 *v36;
UINT64 v37;
__int64 v38;
__int64 v39;
_BYTE LockHandle[80];
__int64 v41;
__int64 v42;
unsigned int PfnChannel;
*(_QWORD *)&LockHandle[16] = 0i64;
v5 = 48 * BaseLargePage;
v6 = v3;
PfnDb = MmGetPfnDb();
v8 = a3;
v9 = (INT64)PfnDb + v5;
v10 = (unsigned int)LargePageIndex;
v41 = (unsigned int)LargePageIndex;
v11 = MiLargePageSizes[(unsigned int)LargePageIndex];
v36 = &MiLargePageSizes[(unsigned int)LargePageIndex];
LODWORD(v12) = MiSearchNumaNodeTable((PVOID)((v9 - (__int64)PfnDb) / 48));
v13 = *(unsigned int *)(v12 + 8);
PfnChannel = MiGetPfnChannel(v9);
v38 = *(_QWORD *)(qword_140C4E388 + 8 * ((*(_QWORD *)(v9 + 40) >> 39) & 0x3FFi64));
v14 = *(_QWORD *)(v38 + 16) + 4544 * v13;
*(_QWORD *)LockHandle = 0i64;
*(_QWORD *)&LockHandle[8] = v14 + 4328;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(v14 + 4328), (WORK_QUEUE_TYPE)v38, v15);
*(_BYTE *)(v9 + 34) &= ~8u;
v16 = *(_QWORD *)(v9 + 16);
*(_QWORD *)(v16 + 24) = 0i64;
*(_BYTE *)(v16 + 69) = 1;
*(_QWORD *)(v9 + 16) = MiSwizzleInvalidPte(128i64);
if( !v6 )
{
v21 = *(_QWORD *)v9;
if( *(_QWORD *)(*(_QWORD *)v9 + 8i64) != v9 )
goto LABEL_39;
v22 = *(_QWORD **)(v9 + 8);
if( *v22 != v9 )
goto LABEL_39;
*v22 = v21;
*(_QWORD *)(v21 + 8) = v22;
if( v8 )
MiSetFreeZeroPfnCold(v9, 1i64);
if( (MiFlags & 0x80u) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
MiArePageContentsZero((PVOID)BaseLargePage);
v39 = 1072 * v10;
--*(_QWORD *)(1072 * v10 + v14 + 8);
v23 = 1072 * v10 + (BaseLargePage < 0x100000 ? 0x10 : 0) + v14;
v24 = v41;
--*(_QWORD *)(v23 + 24);
v25 = 4i64;
v42 = 134 * v41;
if( BaseLargePage < 0x100000 )
v25 = 12i64;
v26 = (unsigned __int64)*(unsigned __int8 *)(v9 + 34) >> 6;
v27 = v26 + 134 * v24 + 4 * (PfnChannel + v25);
v37 = 24 * (BaseLargePage / *v36 % (unsigned int)dword_140C4DCC0[v24]);
--*(_QWORD *)(v37 + *(_QWORD *)(v14 + 8 * v27 + 560) + 16);
--*(_QWORD *)(v14 + 8 * v27 + 48);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v38 + 2304), -(__int64)v11);
if( dword_140C4E40C == 1 )
{
v28 = BaseLargePage & 0x1F;
v29 = v11;
v30 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (BaseLargePage >> 5));
if( v28 + v11 <= 0x20 )
{
if( v11 == 32 )
{
*v30 = -1;
goto LABEL_37;
}
v31 = ((1 << v11) - 1) << v28;
goto LABEL_36;
}
if( (BaseLargePage & 0x1F) != 0 )
{
_InterlockedOr(v30, ((1 << (32 - (BaseLargePage & 0x1F))) - 1) << v28);
v29 = v11 - (32 - (unsigned int)(BaseLargePage & 0x1F));
++v30;
}
if( v29 >= 0x20 )
{
v32 = v29 >> 5;
v29 += -32i64 * (v29 >> 5);
do
{
*v30++ = -1;
--v32;
}
while( v32 );
}
if( v29 )
{
v31 = (1 << v29) - 1;
LABEL_36:
_InterlockedOr(v30, v31);
}
}
LABEL_37:
*(_BYTE *)(v9 + 34) &= 0xF8u;
v33 = v42 + v26 + 4 * (PfnChannel + (unsigned __int64)(BaseLargePage < 0x100000 ? 8 : 0));
v34 = *(_QWORD *)(v14 + 8 * v33 + 560) + v37;
v35 = *(INT64 **)(v34 + 8);
if( *v35 == v34 )
{
*(_QWORD *)v9 = v34;
*(_QWORD *)(v9 + 8) = v35;
*v35 = v9;
*(_QWORD *)(v34 + 8) = v9;
++*(_QWORD *)(v34 + 16);
++*(_QWORD *)(v14 + 8 * v33 + 48);
++*(_QWORD *)(v39 + v14);
++*(_QWORD *)(v23 + 16);
_InterlockedExchangeAdd64((volatile signed __int64 *)(v38 + 2240), v11);
goto LABEL_6;
}
LABEL_39:
__fastfail(3u);
}
if( dword_140C4E40C == 1 )
{
v17 = BaseLargePage & 0x1F;
v18 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (BaseLargePage >> 5));
if( v17 + v11 > 0x20 )
{
if( (BaseLargePage & 0x1F) != 0 )
{
v19 = BaseLargePage & 0x1F;
_InterlockedOr(v18, ((1 << (32 - v19)) - 1) << v17);
v11 -= (unsigned int)(32 - v19);
++v18;
}
if( v11 >= 0x20 )
{
v20 = v11 >> 5;
v11 += -32i64 * (v11 >> 5);
do
{
*v18++ = -1;
--v20;
}
while( v20 );
}
if( v11 )
_InterlockedOr(v18, (1 << v11) - 1);
}
else if( v11 == 32 )
{
*v18 = -1;
}
else
{
_InterlockedOr(v18, ((1 << v11) - 1) << v17);
}
}
LABEL_6:
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
}Referenced by:
MiZeroPage