MiTimeSingleLargePageZeroWorker
NTSTATUS __stdcall MiTimeSingleLargePageZeroWorker(INT64 a1, UINT64 a2){
__int64 v2;
unsigned int v3;
signed __int32 v4;
unsigned int v5;
unsigned int v7;
unsigned __int8 CurrentIrql;
_MMPFN *v9;
_MMPFN *v10;
_MMPFN *v11;
__int64 v12;
int v13;
int v14;
unsigned __int64 v15;
_XSTATE_CONFIGURATION *v16;
unsigned __int64 v17;
unsigned __int64 v18;
int v19;
unsigned __int64 Long;
__int64 v21;
__int64 v22;
unsigned __int64 v23;
unsigned int i;
__int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 v31;
unsigned __int64 v32;
__int64 *v33;
signed __int32 v34[8];
INT64 v35;
INT64 v36;
INT64 v37;
INT64 v38;
int v39;
char SpinCount[20];
__int64 v41;
_MI_COLOR_BASE ColorBase[4];
VOID *PageBase;
__int64 v44;
INT64 v45;
unsigned __int64 v46;
INT64 v47[2];
INT64 v48[16];
__int64 v49[16];
v45 = a1;
v41 = 0i64;
v2 = a1;
v3 = a2;
*(_OWORD *)v47 = 0i64;
*(_OWORD *)&SpinCount[4] = 0i64;
*(_OWORD *)ColorBase = 0i64;
MiInitializeColorTable(v47, a2);
MiInitializePageColorBase(0i64, v3 + 1, ColorBase);
v4 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
v5 = ColorBase[2] & v4 | ColorBase[3];
memset(v48, 0i64, sizeof(v48));
if( !MiCreateUltraThreadContext((INT64)v48, v5, 2i64) )
return 0;
memset(v49, 0i64, sizeof(v49));
v7 = 0;
while( 1 )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v46 = __rdtsc();
_InterlockedOr(v34, 0);
LODWORD(v38) = 2;
LODWORD(v36) = 1;
LODWORD(v35) = 4;
LODWORD(v9) = MiUnlinkNodeLargePages(v2, 1ui64, 1i64, v3, v35, v36, (INT64)v47, v38, 0i64);
v10 = v9;
if( v9 )
{
v12 = v9 - MmGetPfnDb();
v44 = v12;
MiMakeProtectionPfnCompatible((_BYTE *)4, v9);
v14 = v13;
MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)&v48[4], 1i64);
PageBase = (VOID *)v15;
v16 = (_XSTATE_CONFIGURATION *)((char *)MmGetPdeBase() + ((v15 >> 18) & 0x3FFFFFF8));
LODWORD(v17) = MiMakeValidPte(v16, v12, v14 | 0xA4000000);
v18 = v17;
LOBYTE(v19) = MiPteInShadowRange((UINT64)v16);
v39 = v19;
if( v19 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v18 & 1) != 0 )
v18 |= 0x8000000000000000ui64;
v16->EnabledFeatures = v18;
KeZeroPages(PageBase, 0x200000ui64);
Long = ZeroPte.u.Long;
if( v39 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
v16->EnabledFeatures = Long;
*(_DWORD *)SpinCount = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v10->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx((UINT64 *)SpinCount);
while( v10->u2._bf_0 < 0 );
}
v41 = 2i64;
*(_QWORD *)&SpinCount[4] = v44;
*(_QWORD *)&SpinCount[12] = 0i64;
MiInsertLargePageInNodeList((__int64)&SpinCount[4]);
v2 = v45;
}
else
{
__writecr8(CurrentIrql);
LODWORD(v37) = 1;
LODWORD(v36) = 2;
LODWORD(v35) = 0;
LODWORD(v11) = MiGetLargePagesDemoteAsNeeded(v2, v3, 0x200ui64, 0x200ui64, v35, v36, v37);
v10 = v11;
if( v11 )
{
MiFreeLargePageChain(v11);
--v7;
goto LABEL_28;
}
}
_InterlockedOr(v34, 0);
v21 = __rdtsc() - v46;
__writecr8(CurrentIrql);
if( !v10 )
break;
v49[v7] = v21;
if( v7 >= 2 )
{
v22 = v7 - 2;
v23 = 0i64;
for( i = v22; i <= v7; v23 += v49[v25] )
v25 = i++;
v26 = v23 / 3;
v27 = v23 / 3 / 0xA;
v28 = v23 / 3 - v27;
v29 = v27 + v26;
if( (unsigned int)v22 > v7 )
goto LABEL_31;
do
{
v30 = v49[v22];
if( v30 < v28 )
break;
if( v30 > v29 )
break;
v22 = (unsigned int)(v22 + 1);
}
while( (unsigned int)v22 <= v7 );
if( (unsigned int)v22 > v7 )
goto LABEL_31;
}
LABEL_28:
if( ++v7 >= 0x10 )
{
LODWORD(v26) = 0;
goto LABEL_32;
}
}
memset(v49, 0i64, sizeof(v49));
v26 = 0i64;
LABEL_31:
if( v26 )
goto LABEL_37;
LABEL_32:
v31 = 0i64;
v32 = 0i64;
v33 = v49;
do
{
if( !*v33 )
break;
v31 += *v33;
v32 = (unsigned int)(v32 + 1);
++v33;
}
while( (unsigned int)v32 < 0x10 );
if( (_DWORD)v32 )
v26 = v31 / v32;
LABEL_37:
MiDeleteUltraThreadContext((INT64)v48);
return v26;
}Referenced by:
MiTimeSingleLargePageZero