MiComputePxeWalkAction
NTSTATUS __stdcall MiComputePxeWalkAction(INT64 a1, INT64 a2, INT64 a3){
unsigned __int64 v3;
int v5;
__int16 v8;
__int16 v9;
__int64 v10;
int v11;
__int64 v12;
_LIST_ENTRY *Flink;
__int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
v3 = *(_QWORD *)a2;
v5 = a3;
if( (*(_QWORD *)a2 & 1) == 0 )
return(*(_BYTE *)a1 & 1) != 0;
v8 = *(_WORD *)a1;
if( (v9 = *(_WORD *)a1 & 0x4000) != 0 )
{
v17 = (v3 >> 12) & 0xFFFFFFFFFi64;
if( v17 == MiState[(int)a3 + 1185] || v17 == MiState[(int)a3 + 1181] || (v3 & 0x800) == 0 && (v3 & 0x42) == 0 )
return(*(_BYTE *)a1 & 1) != 0;
}
if( !(_DWORD)a3 )
return 1;
v10 = *(_QWORD *)(a1 + 64);
v11 = 1;
if( v10 && v10 == *(_QWORD *)(a1 + 16 * ((int)a3 + 5i64)) )
{
v11 = 0;
*(_QWORD *)(a1 + 64) = 0i64;
}
v12 = *(_QWORD *)(a1 + 56);
if( v12 && v12 == *(_QWORD *)(a1 + 16 * ((int)a3 + 5i64)) )
{
v11 = 0;
*(_QWORD *)(a1 + 56) = 0i64;
}
if( (v3 & 0x80u) != 0i64 )
{
return(v8 & 1) != 0;
}
else
{
if( (_MMPTE *)a2 == MmGetPxeSelfRef()
|| (v8 & 0x200) != 0
&& *(&stru_140C4DB30 + 507) != *(&stru_140C4DB30 + 508)
&& ((v3 >> 12) & 0xFFFFFFFFFi64) == MiState[(int)a3 + 1185] )
{
return 0;
}
if( (v8 & 1) == 0 )
{
if( (MmGetPfnDb()[(v3 >> 12) & 0xFFFFFFFFFi64].u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 1 )
return 1;
if( (_DWORD)a3 == 1 )
{
v14 = *(_QWORD *)(a1 + 24);
if( (*(_BYTE *)(v14 + 184) & 7) == 2 )
{
v15 = (_QWORD)MmGetPteBase() << 25;
LODWORD(v16) = MiGetSystemCacheReverseMap(((((a2 << 25) - v15) >> 16 << 25) - v15) >> 16);
if( (unsigned __int16)*(_DWORD *)(v16 + 32) >> 6 != (unsigned __int64)*(unsigned __int16 *)(v14 + 174) )
return 1;
}
}
}
if( !v11 )
return 1;
if( v5 == 1 && (v8 & 0x10) != 0 && (v8 & 1) == 0 )
{
Flink = MmGetPfnDb()[(*(_QWORD *)a2 >> 12) & 0xFFFFFFFFFi64].ListEntry.Flink;
if( (((unsigned __int64)Flink >> 4) & 0x3FF) == 0
|| (unsigned __int8)(((unsigned __int64)Flink >> 14) & 7) < *(_BYTE *)(a1 + 4) )
{
return 1;
}
}
if( v9 && v5 > 1 && v5 == ((*(unsigned __int8 *)(a1 + 2) >> 2) & 7) )
MiMakeSystemLeavesNonZero(a1, a2, (unsigned int)v5);
return 2;
}
}Referenced by:
MiWalkPageTablesRecursively