MmSecureVirtualMemoryEx
__int64 __fastcall MmSecureVirtualMemoryEx(unsigned __int64 a1, __int64 a2, int a3, int a4){
unsigned __int64 v8;
_MMVAD_SHORT *v9;
_MMVAD_SHORT *v10;
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;} v11;
unsigned int v12;
INT64 v13;
NTSTATUS v14;
INT64 a5;
__int64 a6[5];
INT64 v18;
a6[0] = 0i64;
if( (a4 & 0xFFFFFFF0) == 0 )
{
v8 = a1 + a2;
if( a1 + a2 > a1
&& v8 <= 0x7FFFFFFF0000i64
&& ((unsigned int)(a3 - 1) <= 1 || a3 == 4 || a3 == -2147483647)
&& a3 >= 0 )
{
LODWORD(v9) = MiObtainReferencedVadEx(a1 & 0xFFFFFFFFFFFFF000ui64, 0, &v18);
v10 = v9;
if( v9 )
{
if( (v8 - 1) >> 12 > (v9->EndingVpn | ((unsigned __int64)v9->EndingVpnHigh << 32))
|| (v11.LongFlags = (unsigned int)v9->u, (v9->u.LongFlags & 0x70) == 48)
|| (v11.LongFlags & 0x100000) != 0
&& ((v12 = (v11.LongFlags >> 18) & 3, (v11.LongFlags & 0x400000) != 0) || v12 >= 2)
&& v12 >= 2 )
{
MiUnlockAndDereferenceVad(v10);
}
else
{
v13 = (unsigned int)a3;
LODWORD(v13) = a3 | 0x80000000;
if( (a4 & 2) == 0 )
v13 = (unsigned int)a3;
LODWORD(a5) = a4;
v14 = MiSecureVad((_MI_PARTITION *)v10, a1, a2, v13, a5, (INT64)a6);
MiUnlockAndDereferenceVad(v10);
if( v14 >= 0 )
return *(&stru_140C4DB30 + 12) ^ (__int64)KeGetCurrentThread()->ApcState.Process ^ a6[0];
}
}
}
}
return 0i64;
}Referenced by:
AslpFileLargeMapCreate
MmSecureVirtualMemory
PspAllocateThread
VmSecureBackingMemory