MiInitializeUnusablePfns
VOID __stdcall MiInitializeUnusablePfns(_MMPFN *Pfn1, UINT64 NumberOfPfns, UINT64 PageType, UINT64 a4){
char v4;
__m128i *v6;
signed __int64 v7;
UINT64 v8;
__m128i *v9;
__int64 v10;
__int64 v11;
int v12;
__int64 v13;
unsigned int v14;
__int64 v15;
_XSTATE_CONFIGURATION *v16;
unsigned int v17;
__int64 v18;
__int64 v19;
_MMPFN *v20;
__int64 v21;
unsigned __int64 v22;
unsigned __int64 i;
__m128i v24;
__m128i v25;
int v26;
unsigned __int64 v27;
__m128i v28;
__m128i v29;
__m128i v30;
__m128i v31;
__m128i v32;
__m128i v33;
INT64 v34;
INT64 v35[2];
__m128i v36;
__m128i v37;
UINT64 SpinCount;
UINT64 v39;
int v40;
__int64 v41;
UINT64 v42;
char v43;
v39 = NumberOfPfns;
*(_OWORD *)v35 = 0i64;
v4 = a4;
v36 = 0i64;
v6 = (__m128i *)Pfn1;
v37 = 0i64;
v7 = (char *)Pfn1 - (char *)MmGetPfnDb();
v8 = 48 * NumberOfPfns;
v9 = &v6[3 * NumberOfPfns];
v10 = v7 / 48;
if( (a4 & 0x1800) != 0 )
{
LODWORD(v34) = 0;
MiCreateInitialLargeLeafPfns(v7 / 48, NumberOfPfns, ((unsigned int)a4 >> 11) & 1, 1, PageType, v34);
return;
}
MiCreatePfnTemplate(1, (INT64)v35);
LOBYTE(v12) = 6;
v40 = 6;
if( v4 >= 0 )
{
if( (v4 & 0x40) == 0 )
{
if( (v4 & 2) != 0 )
{
if( (v43 & 2) == 0 )
{
v37.m128i_i16[0] = 1;
v36.m128i_i64[1] = v36.m128i_i64[1] & 0xC000000000000000ui64 | 1;
goto LABEL_13;
}
v12 = 2;
}
else
{
v12 = 5;
}
v40 = v12;
goto LABEL_13;
}
v35[1] = (INT64)MmGetPteBase();
}
else
{
v37.m128i_i64[1] = v37.m128i_i64[1] & 0x8FFFFFFFFFFFFFFFui64 | 0x3000000000000000i64;
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 66, NumberOfPfns);
}
LABEL_13:
v37.m128i_i8[2] = v12 | v37.m128i_i8[2] & 0xF8;
v37.m128i_i64[1] ^= (v37.m128i_i64[1] ^ (v11 << 39)) & 0x1FF8000000000i64;
if( (v4 & 0xC0) != 0 )
{
v36.m128i_i64[1] = v36.m128i_i64[1] & 0xC000000000000000ui64 | 1;
v36.m128i_i64[0] = MiSwizzleInvalidPte(128i64);
v37.m128i_i64[1] = v13 & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
MiSetPageTablePfnBuddy((INT64)v35, (INT64)KeGetCurrentThread()->ApcState.Process, 1i64);
v36.m128i_i64[1] |= 0x4000000000000000ui64;
v37.m128i_i16[0] = 2;
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 569, NumberOfPfns);
}
if( (v4 & 2) != 0 )
{
v14 = *(unsigned __int16 *)(v41 + 32);
v15 = MiSwizzleInvalidPte(16 * ((v41 << 12) | *(_WORD *)(v41 + 32) & 0x3E | 0x40));
v16 = (_XSTATE_CONFIGURATION *)v42;
v36.m128i_i64[0] = v15;
v17 = (v14 >> 1) & 0x1F;
v37.m128i_i64[1] = v18 | 0x8000000000000000ui64;
LODWORD(v19) = MiGetContainingPageTable(v42);
v20 = &MmGetPfnDb()[v19];
v37.m128i_i64[1] = v21 ^ (v19 ^ v21) & 0xFFFFFFFFFi64;
if( v40 == 6 )
LODWORD(v22) = MiMakeValidPte(v16, v10, v17);
else
LODWORD(v22) = MiMakeTransitionPte(v10, v17);
for( i = v22; v6 != v9; i ^= (i ^ (i + 4096)) & 0xFFFFFFFFF000i64 )
{
v24 = v36;
v35[1] = (INT64)v16;
*v6 = *(__m128i *)v35;
v25 = v37;
v6[1] = v24;
v6[2] = v25;
LOBYTE(v26) = MiPteInShadowRange((UINT64)v16);
if( (i & 1) != 0 )
{
v27 = i;
if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 )
v27 = i | 0x8000000000000000ui64;
v16->EnabledFeatures = v27;
}
else
{
v16->EnabledFeatures = i;
}
v16 = (_XSTATE_CONFIGURATION *)((char *)v16 + 8);
v6 += 3;
}
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v20->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v20->u2._bf_0 < 0 );
}
v20->u2._bf_0 ^= (v20->u2._bf_0 ^ (v20->u2._bf_0 + v39)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v20->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
else if( v8 <= 0x1000 )
{
if( v6 != v9 )
{
v31 = _mm_loadu_si128(&v37);
v32 = _mm_loadu_si128(&v36);
v33 = _mm_loadu_si128((const __m128i *)v35);
do
{
*v6 = v33;
v6[1] = v32;
v6[2] = v31;
v6 += 3;
}
while( v6 != v9 );
}
}
else
{
if( v6 != v9 )
{
v28 = _mm_loadu_si128(&v37);
v29 = _mm_loadu_si128(&v36);
v30 = _mm_loadu_si128((const __m128i *)v35);
do
{
_mm_stream_si128(v6, v30);
_mm_stream_si128(v6 + 1, v29);
_mm_stream_si128(v6 + 2, v28);
v6 += 3;
}
while( v6 != v9 );
}
_mm_sfence();
}
}Referenced by:
MiDoGangAssignment
MiInitializeDynamicPfns
MiSwitchToPfns