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