MiRewriteTrimPteAsDemandZero
CHAR __fastcall MiRewriteTrimPteAsDemandZero(INT64 a1, _QWORD *a2){
__int64 v2;
UNICODE_STRING *v5;
UINT8 v6;
WCHAR *v7;
UINT64 v8;
__int16 v9;
INT64 v10;
unsigned __int64 v11;
int v12;
int v13;
_ETHREAD *CurrentThread;
bool v15;
__int64 v16;
volatile signed __int64 *v17;
__int64 v18;
UINT64 *v19;
UINT64 v21;
v2 = a2[2];
if( (v2 & 2) != 0 )
{
v10 = *(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8 * ((a2[5] >> 39) & 0x3FFi64))
+ 8i64 * ((unsigned __int16)v2 >> 12)
+ 6944);
if( qword_140C4DC80 && (v2 & 0x10) == 0 )
v2 &= ~qword_140C4DC80;
v8 = MiTransferSoftwarePte(a2[2], v10, HIDWORD(v2));
}
else
{
v21 = a2[2];
MiSetNonResidentPteHeat(&v21, 0i64);
v8 = v21;
if( (v9 & 0x400) == 0 )
{
v8 = v21 & 0xFFFFFFFFFFFFFFF9ui64;
v21 &= 0xFFFFFFFFFFFFFFF9ui64;
}
}
v11 = a2[1] | 0x8000000000000000ui64;
LOBYTE(v12) = MI_PFN_IS_PROTO((UNICODE_STRING *)a2, v5, v6, v7);
if( v12 )
{
v16 = a2[5] & 0xFFFFFFFFFi64;
v17 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * v16);
LODWORD(v18) = MiMapPageInHyperSpaceWorker(v16, 0i64, 0x80000000ui64);
v19 = (UINT64 *)(v18 + 8 * ((v11 >> 3) & 0x1FF));
*v19 = v8;
MiUnmapPageInHyperSpaceWorker(v19, 0x11u, 0x80000000ui64);
MiLockNestedPageAtDpcInline((INT64)v17);
MiDecrementShareCount((UINT64)v17);
LOBYTE(CurrentThread) = -1;
_InterlockedAnd64(v17 + 3, 0x7FFFFFFFFFFFFFFFui64);
return(char)CurrentThread;
}
v13 = 0;
LODWORD(CurrentThread) = MiPteInShadowRange(v11);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v13 = 1;
if( !HIBYTE(word_140C4DD48) )
{
v15 = (v8 & 1) == 0;
goto LABEL_15;
}
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 23) + 2172i64) & 0x1000) != 0 )
{
v15 = (v8 & 1) == 0;
LABEL_15:
if( !v15 )
v8 |= 0x8000000000000000ui64;
}
}
}
*(_QWORD *)v11 = v8;
if( v13 )
LOBYTE(CurrentThread) = MiWritePteShadow();
if( (*(_BYTE *)(a1 + 184) & 7) == 0 )
LOBYTE(CurrentThread) = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 - 392), 0xFFFFFFFFFFFFFFFFui64);
return(char)CurrentThread;
}Referenced by:
MiWsleFree