MiRewriteTrimPteAsDemandZero
CHAR __stdcall MiRewriteTrimPteAsDemandZero(INT64 a1, INT64 a2){
__int64 v2;
_UNICODE_STRING *v5;
UINT8 v6;
wchar_t *v7;
UINT64 v8;
__int16 v9;
INT64 v10;
UINT64 v11;
unsigned __int64 v12;
int v13;
int v14;
_ETHREAD *CurrentThread;
bool v16;
__int64 v17;
_MMPFN *v18;
UINT64 *v19;
int v20;
UINT64 v22;
v2 = *(_QWORD *)(a2 + 16);
if( (v2 & 2) != 0 )
{
v10 = *(_QWORD *)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * ((*(_QWORD *)(a2 + 40) >> 39) & 0x3FFi64))
+ 8i64 * ((unsigned __int16)v2 >> 12)
+ 6944);
if( *(&stru_140C4DB30 + 42) && (v2 & 0x10) == 0 )
v2 &= ~*(&stru_140C4DB30 + 42);
LODWORD(v11) = MiTransferSoftwarePte(*(_QWORD *)(a2 + 16), v10, HIDWORD(v2));
v8 = v11;
}
else
{
v22 = *(_QWORD *)(a2 + 16);
MiSetNonResidentPteHeat(&v22, 0i64);
v8 = v22;
if( (v9 & 0x400) == 0 )
{
v8 = v22 & 0xFFFFFFFFFFFFFFF9ui64;
v22 &= 0xFFFFFFFFFFFFFFF9ui64;
}
}
v12 = *(_QWORD *)(a2 + 8) | 0x8000000000000000ui64;
LOBYTE(v13) = MI_PFN_IS_PROTO((_UNICODE_STRING *)a2, v5, v6, v7);
if( !v13 )
{
v14 = 0;
LOBYTE(CurrentThread) = MiPteInShadowRange(v12);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v14 = 1;
if( !*(&stru_140C4DB30 + 537) )
{
v16 = (v8 & 1) == 0;
goto LABEL_15;
}
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (CurrentThread->Tcb.ApcState.Process->Flags3 & 0x1000) != 0 )
{
v16 = (v8 & 1) == 0;
LABEL_15:
if( !v16 )
v8 |= 0x8000000000000000ui64;
}
}
}
*(_QWORD *)v12 = v8;
if( v14 )
LOBYTE(CurrentThread) = MiWritePteShadow();
if( (*(_BYTE *)(a1 + 184) & 7) == 0 )
LOBYTE(CurrentThread) = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 - 392), 0xFFFFFFFFFFFFFFFFui64);
return(char)CurrentThread;
}
v17 = *(_QWORD *)(a2 + 40) & 0xFFFFFFFFFi64;
v18 = &MmGetPfnDb()[v17];
v19 = (UINT64 *)((char *)MiMapPageInHyperSpaceWorker(v17, 0i64, 0x80000000ui64) + 8 * ((v12 >> 3) & 0x1FF));
LOBYTE(v20) = MiPteInShadowRange((UINT64)v19);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
v8 |= 0x8000000000000000ui64;
*v19 = v8;
MiUnmapPageInHyperSpaceWorker(v19, 0x11u, 0x80000000ui64);
MiLockNestedPageAtDpcInline(v18);
MiDecrementShareCount(v18);
LOBYTE(CurrentThread) = -1;
_InterlockedAnd64(&v18->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return(char)CurrentThread;
}Referenced by:
MiWsleFree