MiCheckUserVirtualAddress

_MMPTE *__fastcall MiCheckUserVirtualAddress(VOID *VirtualAddress, UINT64 *ProtectCode, _MMVAD *Vad, UINT64 Flags){
  unsigned __int64 v7; 
  int v8; 
  unsigned __int64 v9; 
  _MMPTE *ProtoPteAddress; 
  char v11; 
  int v12; 
  _QWORD *v13; 
  _MMPTE *result; 
  int v15; 
  int v16; 
  INT64 ***LockedVadEvent; 
  _SUBSECTION *ContainingSubsection; 
  if( (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 1) == 0 )
  {
    v7 = (unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64;
    if( ((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64) == 2147352576 )
    {
      result = (_MMPTE *)ProtoPte;
      *(_DWORD *)ProtectCode = 1;
      return result;
    }
    if( v7 == qword_140C4DB88 && v7 )
    {
      result = (_MMPTE *)qword_140C4DB80;
      *(_DWORD *)ProtectCode = 1;
      return result;
    }
  }
  if( (*((_DWORD *)Vad + 12) & 0x70) == 32 && (*((_DWORD *)Vad + 16) & 0x10000000) != 0 )
  {
    LockedVadEvent = MiLocateLockedVadEvent((INT64)Vad, 32i64);
    if( LockedVadEvent && LockedVadEvent[1] != (INT64 **)KeGetCurrentThread() )
      goto LABEL_25;
  }
  v8 = *((_DWORD *)Vad + 12);
  if( (v8 & 4) != 0 )
    goto LABEL_25;
  if( (v8 & 0x100000) != 0 )
  {
    v15 = *((_DWORD *)Vad + 12) & 0x70;
    if( v15 != 16 && v15 != 48 && !MiIsVadLargePrivate((INT64)Vad) && *((int *)Vad + 13) < 0 )
    {
      v16 = (*((_DWORD *)Vad + 12) >> 7) & 0x1F;
LABEL_24:
      result = 0i64;
      *(_DWORD *)ProtectCode = v16;
      return result;
    }
LABEL_25:
    v16 = 24;
    goto LABEL_24;
  }
  if( (*((_DWORD *)Vad + 16) & 0x1000000) != 0 && (*((_BYTE *)Vad + 48) & 0x70) != 80 )
    goto LABEL_25;
  v9 = (unsigned __int64)VirtualAddress >> 12;
  ProtoPteAddress = MiGetProtoPteAddress(Vad, v9, 4ui64, &ContainingSubsection);
  if( ProtoPteAddress )
  {
    v11 = *((_DWORD *)Vad + 12) & 0x70;
    v12 = (*((_DWORD *)Vad + 12) >> 7) & 0x1F;
    *(_DWORD *)ProtectCode = v12;
    if( v11 == 32 )
    {
      if( v12 == 7 )
        v12 = 256;
      *(_DWORD *)ProtectCode = v12;
    }
  }
  else
  {
    *(_DWORD *)ProtectCode = 24;
  }
  v13 = (_QWORD *)*((_QWORD *)Vad + 15);
  if( (__int64)v13 < 0
    && v9 - (*((unsigned int *)Vad + 6) | ((unsigned __int64)*((unsigned __int8 *)Vad + 32) << 32)) > (unsigned __int64)(*v13 - 1i64) >> 12 )
  {
    *(_DWORD *)ProtectCode = 24;
  }
  return ProtoPteAddress;
}

Referenced by:

MiActOnPte
MiCheckVirtualAddress
MiInPagePageTable
MiResolveDemandZeroFault
MiUserFault