MiCheckUserVirtualAddress
_MMPTE *__stdcall MiCheckUserVirtualAddress(VOID *VirtualAddress, UINT64 *ProtectCode, _MMVAD *Vad, UINT64 Flags){
unsigned __int64 v7;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v8;
unsigned __int64 v9;
_MMPTE *v10;
_MMPTE *v11;
char v12;
unsigned int v13;
_MMEXTEND_INFO *ExtendedInfo;
_MMPTE *result;
unsigned int v16;
int v17;
unsigned int v18;
__int64 ********LockedVadEvent;
if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 1) == 0 )
{
v7 = (unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64;
if( ((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64) == 2147352576 )
{
result = (_MMPTE *)*(&stru_140C4DB30 + 9);
*(_DWORD *)ProtectCode = 1;
return result;
}
if( v7 == *(&stru_140C4DB30 + 11) && v7 )
{
result = (_MMPTE *)*(&stru_140C4DB30 + 10);
*(_DWORD *)ProtectCode = 1;
return result;
}
}
if( (Vad->Core.u.LongFlags & 0x70) == 32 && (Vad->u2.LongFlags2 & 0x10000000) != 0 )
{
LockedVadEvent = MiLocateLockedVadEvent((__int64)Vad, 32);
if( LockedVadEvent && LockedVadEvent[1] != (__int64 *******)KeGetCurrentThread() )
goto LABEL_25;
}
v8.LongFlags = (unsigned int)Vad->Core.u;
if( (v8.LongFlags & 4) != 0 )
goto LABEL_25;
if( (v8.LongFlags & 0x100000) != 0 )
{
v16 = Vad->Core.u.LongFlags & 0x70;
if( v16 != 16 && v16 != 48 )
{
LOBYTE(v17) = MiIsVadLargePrivate((INT64)Vad);
if( !v17 && (Vad->Core.u1.LongFlags1 & 0x80000000) != 0 )
{
v18 = (Vad->Core.u.LongFlags >> 7) & 0x1F;
LABEL_24:
result = 0i64;
*(_DWORD *)ProtectCode = v18;
return result;
}
}
LABEL_25:
v18 = 24;
goto LABEL_24;
}
if( (Vad->u2.LongFlags2 & 0x1000000) != 0 && (Vad->Core.u.LongFlags & 0x70) != 80 )
goto LABEL_25;
v9 = (unsigned __int64)VirtualAddress >> 12;
MiGetProtoPteAddress();
v11 = v10;
if( v10 )
{
v12 = Vad->Core.u.LongFlags & 0x70;
v13 = (Vad->Core.u.LongFlags >> 7) & 0x1F;
*(_DWORD *)ProtectCode = v13;
if( v12 == 32 )
{
if( v13 == 7 )
v13 = 256;
*(_DWORD *)ProtectCode = v13;
}
}
else
{
*(_DWORD *)ProtectCode = 24;
}
ExtendedInfo = Vad->u4.ExtendedInfo;
if( (__int64)ExtendedInfo < 0
&& v9 - (Vad->Core.StartingVpn | ((unsigned __int64)Vad->Core.StartingVpnHigh << 32)) > (ExtendedInfo->CommittedSize
- 1) >> 12 )
{
*(_DWORD *)ProtectCode = 24;
}
return v11;
}Referenced by:
MiActOnPte
MiCheckVirtualAddress
MiInPagePageTable
MiResolveDemandZeroFault
MiUserFault