MiAccessCheck

NTSTATUS __stdcall MiAccessCheck(
        MMPTE *PointerPte,
        INT64 WriteOperation,
        INT8 PreviousMode,
        INT64 Protection,
        PVOID TrapInformation,
        INT8 PageLockHeld){
  int v6; 
  INT64 v9; 
  INT64 v10; 
  char v11; 
  _MMPTE *PteBase; 
  unsigned __int64 v14; 
  _MMPFN *v15; 
  v6 = Protection;
  if( PreviousMode == 1 )
  {
    PteBase = MmGetPteBase();
    if( PointerPte > (_MMPTE *)((char *)PteBase + 0x3FFFFFFF78i64) || PointerPte < PteBase )
      return -1073741819;
  }
  v9 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
  v10 = v9;
  if( (v9 & 1) != 0 )
  {
    if( WriteOperation && (v9 & 0xA00) == 0 )
      return -1073741819;
    return 0;
  }
  v11 = v6;
  if( *((char *)&MiReadWrite + (v6 & 7)) - (WriteOperation != 0) < 10 )
    return -1073741819;
  if( (v6 & 0xFFFFFFF8) != 16
    || ((unsigned __int8)TrapInformation & 1) != 0
    && *(_BYTE *)((unsigned __int64)TrapInformation & 0xFFFFFFFFFFFFFFFEui64) == 1 )
  {
    return 0;
  }
  if( !(unsigned int)MiAllowGuardFault(TrapInformation) )
    return -1073741819;
  if( (v10 & 0xC00) == 2048 )
  {
    if( PageLockHeld == 1 )
    {
      v14 = v10;
      if( qword_140C4DC80 )
      {
        if( (v10 & 0x10) != 0 )
          v14 = v10 & 0xFFFFFFFFFFFFFFEFui64;
        else
          v14 = v10 & ~qword_140C4DC80;
      }
      v15 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v14 >> 12) & 0xFFFFFFFFFi64));
    }
    else
    {
      v15 = MiLockTransitionLeafPage(PointerPte, 0i64);
      v10 = MI_READ_PTE_LOCK_FREE((INT64)PointerPte);
      if( v15 )
        *((_QWORD *)v15 + 2) = *((_QWORD *)v15 + 2) & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (v11 & 0xF));
    }
    *(_QWORD *)PointerPte = v10 & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (v11 & 0xF));
    if( !PageLockHeld )
    {
      if( v15 )
        _InterlockedAnd64((volatile signed __int64 *)v15 + 3, 0x7FFFFFFFFFFFFFFFui64);
    }
  }
  else
  {
    *(_QWORD *)PointerPte = v10 & 0xFFFFFFFFFFFFFC1Fui64 | (32i64 * (v6 & 0xF));
  }
  return -2147483647;
}

Referenced by:

MiDispatchFault