MmSecureVirtualMemoryEx
__int64 __fastcall MmSecureVirtualMemoryEx(unsigned __int64 a1, __int64 a2, int a3, int a4){
unsigned __int64 v8;
INT64 v9;
_MMVAD_SHORT *v10;
unsigned int v11;
unsigned int v12;
UINT64 v13;
NTSTATUS v14;
_MI_VAD_EVENT_BLOCK **SecureHandle;
INT64 v17;
if( (a4 & 0xFFFFFFF0) == 0 )
{
v8 = a1 + a2;
if( a1 + a2 > a1
&& v8 <= 0x7FFFFFFF0000i64
&& ((unsigned int)(a3 - 1) <= 1 || a3 == 4 || a3 == -2147483647)
&& a3 >= 0 )
{
v9 = MiObtainReferencedVadEx(a1 & 0xFFFFFFFFFFFFF000ui64, 0, &v17);
v10 = (_MMVAD_SHORT *)v9;
if( v9 )
{
if( (v8 - 1) >> 12 > (*(unsigned int *)(v9 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v9 + 33) << 32))
|| (v11 = *(_DWORD *)(v9 + 48), (*(_BYTE *)(v9 + 48) & 0x70) == 48)
|| (v11 & 0x100000) != 0 && ((v12 = (v11 >> 18) & 3, (v11 & 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(SecureHandle) = a4;
v14 = MiSecureVad(v10, (PVOID)a1, a2, v13, SecureHandle);
MiUnlockAndDereferenceVad(v10);
if( v14 >= 0 )
return qword_140C4DB90 ^ *((_QWORD *)KeGetCurrentThread() + 23);
}
}
}
}
return 0i64;
}Referenced by:
AslpFileLargeMapCreate
MmSecureVirtualMemory
PspAllocateThread
VmSecureBackingMemory