MiUnmapLargePages
VOID __stdcall MiUnmapLargePages(VOID *BaseAddress, UINT64 NumberOfBytes, _MI_SYSTEM_VA_TYPE VaType){
_MI_SYSTEM_VA_TYPE v3;
UINT64 v4;
char *v6;
unsigned __int64 *v7;
char *i;
__int64 v9;
unsigned __int64 Long;
int v11;
v3 = MiVaSystemPtesLarge;
v4 = NumberOfBytes;
if( VaType != MiVaSystemPtes )
v3 = VaType;
if( (NumberOfBytes & 0x1FFFFF) != 0 )
{
v6 = (char *)MmGetPteBase() + (((unsigned __int64)BaseAddress >> 9) & 0x7FFFFFFFF8i64);
v7 = (unsigned __int64 *)&v6[4096 * (NumberOfBytes >> 21)];
for( i = &v6[8 * ((((unsigned __int16)BaseAddress & 0xFFF) + NumberOfBytes + 4095) >> 12)];
v7 < (unsigned __int64 *)i;
++v7 )
{
LODWORD(v9) = MI_READ_PTE_LOCK_FREE((INT64)v7);
if( !v9 )
break;
Long = ZeroPte.u.Long;
LOBYTE(v11) = MiPteInShadowRange((UINT64)v7);
if( v11 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*v7 = Long;
}
v4 = (v4 + 0x1FFFFF) & 0xFFFFFFFFFFE00000ui64;
}
MiReturnSystemVa(BaseAddress, (char *)BaseAddress + v4, v3, 0i64);
}Referenced by:
MiInsertInSystemSpace
MiRemoveFromSystemSpace
MiUnmapLargeDriver
MmUnmapIoSpace