MiUnmapFrameBuffer
NTSTATUS __stdcall MiUnmapFrameBuffer(
ULONG_PTR PointerPte,
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
UINT64 Locked,
UINT64 *IoPageFrame){
NTSTATUS v5;
unsigned __int64 *v7;
INT64 v8;
INT64 v9;
__int64 v10;
int v11;
UINT64 v12;
__int64 v13;
__int64 v14;
unsigned __int64 v15;
char *BugCheckParameter4;
__int64 v17;
unsigned __int16 v18;
int v19;
int v20;
INT64 v22;
*IoPageFrame = -1i64;
v5 = Locked;
v7 = *(unsigned __int64 **)&PointerPte;
LODWORD(v8) = MI_READ_PTE_LOCK_FREE(*(INT64 *)&PointerPte);
v22 = v8;
v9 = v8;
MI_READ_PTE_LOCK_FREE((INT64)&v22);
v10 = MiSwizzleInvalidPte(128i64);
v15 = v10;
if( CacheAttribute == MiWriteCombined )
{
v15 = v10 | 0x300;
}
else if( CacheAttribute )
{
if( CacheAttribute == MiNotMapped )
{
if( v11 )
v15 = 0i64;
else
v15 = v9 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
}
}
else
{
v15 = v10 | 0x100;
}
BugCheckParameter4 = &MmGetPfnDb()->$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::gap0[8 * v13];
if( v11 )
{
v17 = *((_QWORD *)BugCheckParameter4 + 5);
v18 = 1;
if( (v17 & 0x1000000000i64) != 0 || (v14 & v17) == 0xFFFFFFFFDi64 )
v18 = 2;
if( *((_WORD *)BugCheckParameter4 + 16) < v18 )
KeBugCheckEx(0x1Au, (PVOID)0x41301, v7, (PVOID)v9, BugCheckParameter4);
v19 = 1;
if( *((_WORD *)BugCheckParameter4 + 16) <= v18 )
v19 = v5;
v5 = v19;
}
else
{
*IoPageFrame = v12;
}
if( CacheAttribute != MiNotMapped )
v15 = (v15 & 0xFF1F ^ (v15 & 0xFF1F | (unsigned __int16)((v9 & 0x800) != 0 ? 128 : 32))) & 0x3E0 ^ v15 & 0xFFFFFFFFFFFFFF1Fui64;
LOBYTE(v20) = MiPteInShadowRange((UINT64)v7);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v15 & 1) != 0 )
v15 |= 0x8000000000000000ui64;
*v7 = v15;
return v5;
}Referenced by:
MiDeleteVa
MiReplaceRotateWithDemandZero