MiUnmapLockedPagesInUserSpace
VOID __fastcall MiUnmapLockedPagesInUserSpace(VOID *BaseAddress, MDL *MemoryDescriptorList){
__int64 v4;
INT64 v5;
ULONG_PTR v6;
__int64 v7;
unsigned __int64 v8;
_MI_VAD_EVENT_BLOCK *OldestSecure;
unsigned __int64 v10;
__int128 v11[3];
INT64 v12;
v4 = *((_QWORD *)KeGetCurrentThread() + 23);
v5 = MiObtainReferencedVadEx((UINT64)BaseAddress, 1, &v12);
v6 = v5;
if( v5 )
{
v7 = *(unsigned int *)(v5 + 24);
v8 = (v7 | ((unsigned __int64)*(unsigned __int8 *)(v5 + 32) << 32)) << 12;
if( (*(_DWORD *)(v5 + 48) & 0x70) != 16
|| ((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 = (_MI_VAD_EVENT_BLOCK *)MiLocateOldestSecure(v5);
if( !OldestSecure )
KeBugCheckEx(0x1Au, 0x1402ui64, (ULONG_PTR)BaseAddress, v6, 0i64);
MiRemoveSecureEntry((_MMVAD *)v6, OldestSecure);
if( (*(_DWORD *)(v6 + 48) & 8) != 0
&& (*(_DWORD *)(v4 + 1124) & 0x20) == 0
&& (int)MiCheckSecuredVad(
v6,
v8,
((*(unsigned int *)(v6 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v6 + 33) << 32))
- (*(unsigned int *)(v6 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v6 + 32) << 32))
+ 1) << 12,
0x55u,
0) < 0 )
{
v10 = ((*(unsigned int *)(v6 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v6 + 33) << 32)) << 12) | 0xFFF;
memset(v11, 0, sizeof(v11));
MiDeleteVirtualAddresses(v8, v10, 64, v11);
LABEL_9:
MiUnlockAndDereferenceVad((PVOID)v6);
return;
}
MiDeleteVad((_MMVAD *)v6, 0i64);
}
}Referenced by:
MmUnlockPages
MmUnmapLockedPages