MiUnmapMdlCommon
VOID __stdcall MiUnmapMdlCommon(UINT64 a1, INT64 a2, INT64 a3, INT64 a4, UINT64 a5){
_MMPTE *PteBase;
unsigned __int64 v9;
unsigned __int64 v10;
INT64 *v11;
unsigned __int64 v12;
unsigned int v13;
_QWORD *v14;
_MMPFN *v15;
UINT64 v16;
char v17;
char v18;
_MMPTE *v19;
UINT64 v20;
UINT64 v21;
UINT64 v22;
UINT8 v23;
__int64 v24;
UINT64 v25;
unsigned __int64 Long;
int v27;
UINT64 v28;
UINT64 v29;
PVOID BugCheckParameter3;
_MMPFN *Pfn1;
_QWORD *v32;
unsigned __int64 v33;
PVOID BugCheckParameter4;
PVOID BugCheckParameter2;
_MI_TB_FLUSH_LIST TbFlushList[48];
LODWORD(BugCheckParameter3) = a3;
BugCheckParameter2 = (PVOID)a1;
BugCheckParameter4 = (PVOID)a5;
memset(TbFlushList, 0i64, 0xB8u);
*(_QWORD *)&TbFlushList[6] = 0i64;
v32 = (_QWORD *)(a4 + 48);
TbFlushList[2] = 20;
PteBase = MmGetPteBase();
v9 = (unsigned __int64)PteBase + ((a1 >> 9) & 0x7FFFFFFFF8i64);
v10 = v9 + 8 * a5;
v33 = v10;
v11 = (INT64 *)((char *)PteBase + ((v9 >> 9) & 0x7FFFFFFFF8i64));
if( (MI_READ_PTE_LOCK_FREE((INT64)v11) & 0x80u) == 0 )
{
v15 = 0i64;
Pfn1 = 0i64;
}
else
{
v12 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&stru_140C4DB30 + 442);
v13 = 0;
Pfn1 = (_MMPFN *)*(&stru_140C4DB30 + 444);
v14 = (_QWORD *)*(&stru_140C4DB30 + 444);
if( a5 >> 9 != 1 )
{
do
{
v14 = (_QWORD *)*v14;
++v13;
}
while( v13 < (a5 >> 9) - 1 );
}
*(&stru_140C4DB30 + 444) = *v14;
*v14 = 0i64;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&stru_140C4DB30 + 442);
__writecr8(v12);
v15 = Pfn1;
v10 = v33;
}
v16 = 0i64;
if( a2 )
{
MiLockWorkingSetShared();
v18 = v17;
}
else
{
v18 = 17;
}
if( v9 < v10 )
{
while( 1 )
{
if( v18 != 17 )
{
if( !v16 )
goto LABEL_14;
if( (v9 & 0xFFF) == 0 )
break;
}
v19 = MmGetPteBase();
LABEL_16:
if( v15 )
{
LODWORD(v20) = MI_READ_PTE_LOCK_FREE((INT64)v11);
v29 = v20;
v21 = v20;
if( (v20 & 0x80u) == 0i64 || (MiPteInShadowRange((UINT64)&v29), *v32 != ((v21 >> 12) & 0xFFFFFFFFFi64)) )
KeBugCheckEx(
0xDAu,
(PVOID)0x10E,
BugCheckParameter2,
(PVOID)(unsigned int)BugCheckParameter3,
BugCheckParameter4);
Pfn1 = (_MMPFN *)Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
MiInsertLargeTbFlushEntry(TbFlushList, 1ui64, (INT64)v11);
LODWORD(v22) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v9, v15 - MmGetPfnDb(), 2952790022i64);
v29 = v22;
v23 = MiLockPageInline(v15);
v15->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
v15->PteLong = (unsigned __int64)v11;
_InterlockedAnd64(&v15->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v23);
MiWriteValidPteNewPage(v11++, v29, 0i64);
v24 = 4096i64;
}
else
{
LODWORD(v25) = MI_READ_PTE_LOCK_FREE(v9);
v29 = v25;
if( (v25 & 1) == 0 )
KeBugCheckEx(
0xDAu,
(PVOID)0x10B,
BugCheckParameter2,
(PVOID)(unsigned int)BugCheckParameter3,
BugCheckParameter4);
MiInsertTbFlushEntry(TbFlushList, (VOID *)((__int64)((v9 << 25) - ((_QWORD)v19 << 25)) >> 16), 1ui64, 0i64);
Long = ZeroPte.u.Long;
LOBYTE(v27) = MiPteInShadowRange(v9);
if( v27 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)v9 = Long;
v24 = 8i64;
}
v32 = (_QWORD *)((char *)v32 + v24);
v9 += v24;
if( v9 >= v33 )
goto LABEL_30;
v15 = Pfn1;
}
MiUnlockPageTableInternal(a2, v16);
LABEL_14:
v19 = MmGetPteBase();
v16 = (UINT64)v19 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal(a2, v16, 0i64);
goto LABEL_16;
}
LABEL_30:
MiFlushTbList(TbFlushList);
if( v18 != 17 )
{
if( v16 )
MiUnlockPageTableInternal(a2, v16);
LOBYTE(v28) = v18;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a2, v28);
}
}Referenced by:
MmUnmapLockedRestartPages
MmUnmapReservedMapping