MiInitializeUnusablePfns
CHAR __fastcall MiInitializeUnusablePfns(__m128i *rcx0, INT64 rdx0, UINT16 a3, UINT64 a4, INT64 a5, UINT64 a1, CHAR a7){
char v7;
__m128i *v9;
signed __int64 v10;
unsigned __int64 v11;
__m128i *v12;
__int64 v13;
CHAR result;
__int64 v15;
int v16;
__int64 v17;
unsigned int v18;
INT64 v19;
_QWORD *v20;
unsigned int v21;
__int64 v22;
UINT64 ContainingPageTable;
UINT64 v24;
char *v25;
__int64 v26;
UINT64 ValidPte;
unsigned __int64 i;
__m128i v29;
__m128i v30;
BOOL v31;
unsigned __int64 v32;
__m128i v33;
__m128i v34;
__m128i v35;
__m128i v36;
__m128i v37;
__m128i v38;
INT64 v39;
INT64 a2[2];
__m128i v41;
__m128i v42;
UINT64 SpinCount;
INT64 v44;
int v45;
v44 = rdx0;
*(_OWORD *)a2 = 0i64;
v7 = a4;
v41 = 0i64;
v9 = rcx0;
v42 = 0i64;
v10 = (char *)rcx0 - (char *)MmGetPfnDb();
v11 = 48 * rdx0;
v12 = &v9[3 * rdx0];
v13 = v10 / 48;
if( (a4 & 0x1800) != 0 )
{
LODWORD(v39) = 0;
return MiCreateInitialLargeLeafPfns(v10 / 48, rdx0, ((unsigned int)a4 >> 11) & 1, 1, a3, v39);
}
MiCreatePfnTemplate(1, (INT64)a2);
LOBYTE(v16) = 6;
v45 = 6;
if( v7 >= 0 )
{
if( (v7 & 0x40) == 0 )
{
if( (v7 & 2) != 0 )
{
if( (a7 & 2) == 0 )
{
v42.m128i_i16[0] = 1;
v41.m128i_i64[1] = v41.m128i_i64[1] & 0xC000000000000000ui64 | 1;
goto LABEL_13;
}
v16 = 2;
}
else
{
v16 = 5;
}
v45 = v16;
goto LABEL_13;
}
a2[1] = (INT64)MmGetPteBase();
}
else
{
v42.m128i_i64[1] = v42.m128i_i64[1] & 0x8FFFFFFFFFFFFFFFui64 | 0x3000000000000000i64;
_InterlockedExchangeAdd64(&qword_140C4DD40, rdx0);
}
LABEL_13:
v42.m128i_i8[2] = v16 | v42.m128i_i8[2] & 0xF8;
result = 0;
v42.m128i_i64[1] ^= (v42.m128i_i64[1] ^ (v15 << 39)) & 0x1FF8000000000i64;
if( (v7 & 0xC0) != 0 )
{
v41.m128i_i64[1] = v41.m128i_i64[1] & 0xC000000000000000ui64 | 1;
v41.m128i_i64[0] = MiSwizzleInvalidPte(128i64);
v42.m128i_i64[1] = v17 & 0xFFFFFFF000000000ui64 | 0xFFFFFFFFDi64;
MiSetPageTablePfnBuddy((INT64)a2, *((_QWORD *)KeGetCurrentThread() + 23), 1i64);
v41.m128i_i64[1] |= 0x4000000000000000ui64;
v42.m128i_i16[0] = 2;
result = _InterlockedExchangeAdd64(&qword_140C4ECF8, rdx0);
}
if( (v7 & 2) != 0 )
{
v18 = *(unsigned __int16 *)(a5 + 32);
v19 = MiSwizzleInvalidPte(16 * ((a5 << 12) | *(_WORD *)(a5 + 32) & 0x3E | 0x40));
v20 = (_QWORD *)a1;
v41.m128i_i64[0] = v19;
v21 = (v18 >> 1) & 0x1F;
v42.m128i_i64[1] = v22 | 0x8000000000000000ui64;
ContainingPageTable = MiGetContainingPageTable(a1);
v25 = (char *)MmGetPfnDb() + 48 * ContainingPageTable;
v42.m128i_i64[1] = v26 ^ (ContainingPageTable ^ v26) & 0xFFFFFFFFFi64;
if( v45 == 6 )
ValidPte = MiMakeValidPte((UINT64)v20, v13, v21);
else
ValidPte = MiMakeTransitionPte(v13, v21, v24);
for( i = ValidPte; v9 != v12; i ^= (i ^ (i + 4096)) & 0xFFFFFFFFF000i64 )
{
v29 = v41;
a2[1] = (INT64)v20;
*v9 = *(__m128i *)a2;
v30 = v42;
v9[1] = v29;
v9[2] = v30;
v31 = MiPteInShadowRange((UINT64)v20);
if( (i & 1) != 0 )
{
v32 = i;
if( v31 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 )
v32 = i | 0x8000000000000000ui64;
*v20 = v32;
}
else
{
*v20 = i;
}
++v20;
v9 += 3;
}
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v25 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v25 + 3) < 0 );
}
result = -1;
*((_QWORD *)v25 + 3) ^= (*((_QWORD *)v25 + 3) ^ (*((_QWORD *)v25 + 3) + v44)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64((volatile signed __int64 *)v25 + 3, 0x7FFFFFFFFFFFFFFFui64);
}
else if( v11 <= 0x1000 )
{
if( v9 != v12 )
{
v36 = _mm_loadu_si128(&v42);
v37 = _mm_loadu_si128(&v41);
v38 = _mm_loadu_si128((const __m128i *)a2);
do
{
*v9 = v38;
v9[1] = v37;
v9[2] = v36;
v9 += 3;
}
while( v9 != v12 );
}
}
else
{
if( v9 != v12 )
{
v33 = _mm_loadu_si128(&v42);
v34 = _mm_loadu_si128(&v41);
v35 = _mm_loadu_si128((const __m128i *)a2);
do
{
_mm_stream_si128(v9, v35);
_mm_stream_si128(v9 + 1, v34);
_mm_stream_si128(v9 + 2, v33);
v9 += 3;
}
while( v9 != v12 );
}
_mm_sfence();
}
return result;
}Referenced by:
MiDoGangAssignment
MiInitializeDynamicPfns
MiSwitchToPfns