MiReleaseSystemCacheView

VOID __stdcall MiReleaseSystemCacheView(_MMPTE *FirstPte){
  __int64 v2; 
  unsigned __int64 v3; 
  __int64 v4; 
  __int64 v5; 
  _MMPTE *v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  unsigned __int64 Long; 
  int v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  CHAR *v13; 
  void *v14; 
  void *v15; 
  UINT64 v16; 
  _MI_TB_FLUSH_LIST *v17; 
  __int64 *v18; 
  __int64 v19; 
  UINT64 WsIrql; 
  __int64 v21; 
  __int64 v22; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 v24[8]; 

  LOBYTE(WsIrql) = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset(v24, 0i64, sizeof(v24));
  v2 = 0i64;
  v3 = 0i64;
  v22 = (_QWORD)MmGetPteBase() << 25;
  LODWORD(v4) = MiGetSystemCacheReverseMap((((_QWORD)FirstPte << 25) - v22) >> 16);
  v5 = *(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * ((*(_DWORD *)(v4 + 32) >> 6) & 0x3FF));
  v21 = v5;
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 183, &LockHandle);
  if( MiDecrementSystemCacheViewCount((((_QWORD)FirstPte << 25) - v22) >> 16) )
  {
    InsertTailListPte(v5 + 1784, &FirstPte->u.Long);
  }
  else
  {
    v3 = (unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64;
    v6 = (_MMPTE *)((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64);
    v7 = ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) + 4096;
    if( ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) < v7 )
    {
      do
      {
        if( v6 != FirstPte )
        {
          RemoveListEntryPte((UINT64 *)(v5 + 1784), &v6->u.Long);
          LODWORD(v8) = MiGetPteLink(v6[3].u.Long);
          if( v8 == 1 )
          {
            v24[v2] = (__int64)v6;
            v2 = (unsigned int)(v2 + 1);
          }
          else
          {
            Long = ZeroPte.u.Long;
            LOBYTE(v10) = MiPteInShadowRange((UINT64)&v6[3]);
            if( v10 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
              Long = ZeroPte.u.Long | 0x8000000000000000ui64;
            v6[3].u.Long = Long;
            v5 = v21;
            v7 = v3 + 4096;
          }
        }
        v6 += 64;
      }
      while( (unsigned __int64)v6 < v7 );
    }
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( v3 )
  {
    if( (_DWORD)v2 )
    {
      v18 = v24;
      v19 = (unsigned int)v2;
      do
      {
        MiWaitForSystemCacheViewFlush((_MI_FREE_SYSTEM_CACHE *)*v18++);
        --v19;
      }
      while( v19 );
    }
    v11 = v3 << 25;
    v12 = (__int64)(v11 - v22) >> 16;
    v13 = MiLockWorkingSetOptimal(v5 + 7232, (UINT64)FirstPte, &WsIrql);
    LODWORD(v14) = MiGetSystemCacheReverseMap(v12);
    v15 = v14;
    MiSetSystemCacheReverseMap(v12, 0i64);
    MiUnlockPageTableInternal(v5 + 7232, (UINT64)v13);
    LOBYTE(v16) = WsIrql;
    MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)(v5 + 7232), v16);
    MiReturnSystemVa((VOID *)v12, (VOID *)((__int64)(v11 - v22 + 0x2000000000i64) >> 16), MiVaSystemCache, v17);
    ExFreePoolWithTag(v15, 0);
  }
}

Referenced by:

MmFreeSystemCacheReserveView
MmUnmapViewInSystemCache