MiWriteValidPteNewPage
CHAR __stdcall MiWriteValidPteNewPage(INT64 *a1, INT64 a2, INT64 a3){
int v3;
INT64 v6;
INT64 CurrentThread;
INT64 v8;
bool v9;
v3 = a3;
if( (_DWORD)a3 )
v6 = *a1;
else
LODWORD(v6) = MI_READ_PTE_LOCK_FREE((INT64)a1);
CurrentThread = (a2 ^ v6) & 0x7F00000000000000i64;
v8 = CurrentThread ^ a2;
if( v3 )
{
*a1 = v8;
return CurrentThread;
}
LOBYTE(CurrentThread) = MiPteInShadowRange((UINT64)a1);
if( (_DWORD)CurrentThread )
{
LODWORD(CurrentThread) = MiPteHasShadow();
if( (_DWORD)CurrentThread )
{
v3 = 1;
if( *(&stru_140C4DB30 + 537) )
goto LABEL_5;
v9 = (v8 & 1) == 0;
}
else
{
CurrentThread = (INT64)KeGetCurrentThread();
if( (*(_DWORD *)(*(_QWORD *)(CurrentThread + 184) + 2172i64) & 0x1000) == 0 )
goto LABEL_5;
v9 = (v8 & 1) == 0;
}
if( !v9 )
{
LOBYTE(CurrentThread) = 0;
v8 |= 0x8000000000000000ui64;
}
}
LABEL_5:
*a1 = v8;
if( v3 )
LOBYTE(CurrentThread) = MiWritePteShadow();
return CurrentThread;
}Referenced by:
MiConvertPrivateToProto
MiCopyKstack
MiTradeActivePage
MiUnmapMdlCommon
MiWriteAweClusterPte
MxSwapPages