MiInsertLargeVadMapping
NTSTATUS __stdcall MiInsertLargeVadMapping(UINT64 a1, UINT64 a2, INT64 a3, UINT64 *a4, INT64 a5){
int v8;
_EPROCESS *Process;
_MMPFN *v10;
ULONG_PTR v11;
__int64 v12;
unsigned __int64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
unsigned __int64 v17;
int v18;
__int64 v20[5];
v8 = a3;
Process = KeGetCurrentThread()->ApcState.Process;
v10 = MiLockProtoPoolPage((_MMPTE *)a2, 0i64);
v11 = (unsigned int)v10;
if( !v10 )
return 0;
LODWORD(v12) = MI_READ_PTE_LOCK_FREE(a2);
v20[0] = v12;
v13 = v12;
MiUnlockProtoPoolPage(v11, 0x11u);
MiPteInShadowRange((UINT64)v20);
v14 = 0xFFFFC0000i64;
if( v8 != 2 )
v14 = 0xFFFFFFE00i64;
LODWORD(v15) = MiMakeValidPte(
(_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + ((a1 >> 9) & 0x7FFFFFFFF8i64)),
(v13 >> 12) & v14,
(unsigned int)a5 | 0x84000000);
v20[0] = v15;
v16 = v15;
if( v8 != 1 && _InterlockedCompareExchange(&MiGetSharedVm(&Process->Vm.Instance)->WorkingSetLock, 0x80000000, 1) != 1 )
return 0;
v17 = v16;
LOBYTE(v18) = MiPteInShadowRange((UINT64)a4);
if( v18 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v16 & 1) != 0 )
v17 = v16 | 0x8000000000000000ui64;
*a4 = v17;
if( v8 != 1 )
MiGetSharedVm(&Process->Vm.Instance)->WorkingSetLock = 1;
return 1;
}Referenced by:
MiInPagePageTable