MiUnmapLockedPagesInUserSpace
VOID __stdcall MiUnmapLockedPagesInUserSpace(VOID *BaseAddress, _MDL *MemoryDescriptorList){
_EPROCESS *Process;
__int64 v5;
_MMVAD *v6;
__int64 v7;
VOID *v8;
_QWORD *OldestSecure;
VOID *v10;
_MI_DELETE_VA_INFO *DeleteInfo;
UINT8 WsIrql[16];
__int128 v13;
__int128 v14;
INT64 v15;
Process = KeGetCurrentThread()->ApcState.Process;
LODWORD(v5) = MiObtainReferencedVadEx((UINT64)BaseAddress, 1, &v15);
v6 = (_MMVAD *)v5;
if( v5 )
{
v7 = *(unsigned int *)(v5 + 24);
v8 = (VOID *)((v7 | ((unsigned __int64)*(unsigned __int8 *)(v5 + 32) << 32)) << 12);
if( (*(_DWORD *)(v5 + 48) & 0x70) != 16
|| (VOID *)((unsigned __int64)BaseAddress & 0xFFFFFFFFFFFFF000ui64) != v8
|| MemoryDescriptorList != (_MDL *)((*(unsigned int *)(v5 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v5 + 33) << 32))
- (v7 | ((unsigned __int64)*(unsigned __int8 *)(v5 + 32) << 32))
+ 1) )
{
goto LABEL_9;
}
OldestSecure = MiLocateOldestSecure(v5);
if( !OldestSecure )
KeBugCheckEx(0x1Au, (PVOID)0x1402, BaseAddress, v6, 0i64);
MiRemoveSecureEntry(v6, OldestSecure);
if( (v6->Core.u.LongFlags & 8) != 0 && (Process->Flags & 0x20) == 0 )
{
LOBYTE(DeleteInfo) = 0;
if( MiCheckSecuredVad(
&v6->Core,
v8,
((v6->Core.EndingVpn | ((unsigned __int64)v6->Core.EndingVpnHigh << 32))
- (v6->Core.StartingVpn | ((unsigned __int64)v6->Core.StartingVpnHigh << 32))
+ 1) << 12,
0x55ui64) < 0 )
{
v10 = (VOID *)(((v6->Core.EndingVpn | ((unsigned __int64)v6->Core.EndingVpnHigh << 32)) << 12) | 0xFFF);
*(_OWORD *)WsIrql = 0i64;
v13 = 0i64;
v14 = 0i64;
MiDeleteVirtualAddresses(v8, v10, 0x40ui64, (UINT8)WsIrql, DeleteInfo);
LABEL_9:
MiUnlockAndDereferenceVad(&v6->Core);
return;
}
}
MiDeleteVad(v6, 0i64);
}
}Referenced by:
MmUnlockPages
MmUnmapLockedPages