MiUnmapFrameBuffer
INT64 __fastcall MiUnmapFrameBuffer(
_MMPTE *PoINTerPte,
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
UINT64 Locked,
UINT64 *IoPageFrame){
unsigned int v5;
ULONG_PTR v8;
INT64 v9;
int v10;
UINT64 v11;
__int64 v12;
__int64 v13;
unsigned __int64 v14;
char *BugCheckParameter4;
__int64 v16;
unsigned __int16 v17;
int v18;
INT64 v20;
*IoPageFrame = -1i64;
v5 = Locked;
v20 = MI_READ_PTE_LOCK_FREE((INT64)PoINTerPte);
v8 = v20;
MI_READ_PTE_LOCK_FREE((INT64)&v20);
v9 = MiSwizzleInvalidPte(128i64);
v14 = v9;
if( CacheAttribute == MiWriteCombined )
{
v14 = v9 | 0x300;
}
else if( CacheAttribute )
{
if( CacheAttribute == MiNotMapped )
{
if( v10 )
v14 = 0i64;
else
v14 = v8 & 0xFFFFFFFFFFFFFBFEui64 | 0x400;
}
}
else
{
v14 = v9 | 0x100;
}
BugCheckParameter4 = (char *)MmGetPfnDb() + 8 * v12;
if( v10 )
{
v16 = *((_QWORD *)BugCheckParameter4 + 5);
v17 = 1;
if( (v16 & 0x1000000000i64) != 0 || (v13 & v16) == 0xFFFFFFFFDi64 )
v17 = 2;
if( *((_WORD *)BugCheckParameter4 + 16) < v17 )
KeBugCheckEx(0x1Au, 0x41301ui64, (ULONG_PTR)PoINTerPte, v8, (ULONG_PTR)BugCheckParameter4);
v18 = 1;
if( *((_WORD *)BugCheckParameter4 + 16) <= v17 )
v18 = v5;
v5 = v18;
}
else
{
*IoPageFrame = v11;
}
if( CacheAttribute != MiNotMapped )
v14 = (v14 & 0xFF1F ^ (v14 & 0xFF1F | (unsigned __int16)((v8 & 0x800) != 0 ? 128 : 32))) & 0x3E0 ^ v14 & 0xFFFFFFFFFFFFFF1Fui64;
*(_QWORD *)PoINTerPte = v14;
return v5;
}Referenced by:
MiDeleteVa
MiReplaceRotateWithDemandZero