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