MiReleaseSystemCacheView

VOID __stdcall MiReleaseSystemCacheView(MMPTE *FirstPte){
  __int64 v2; 
  unsigned __int64 v3; 
  __int64 v4; 
  UINT64 *v5; 
  unsigned __int64 v6; 
  unsigned __int64 v7; 
  __int64 v8; 
  CHAR *v9; 
  void *SystemCacheReverseMap; 
  __int64 *v11; 
  __int64 v12; 
  char v13[8]; 
  __int64 v14; 
  __int64 v15; 
  struct _KLOCK_QUEUE_HANDLE LockHandle; 
  __int64 result[8]; 
  v13[0] = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  memset((INT64)result, 0i64);
  v2 = 0i64;
  v3 = 0i64;
  v15 = (_QWORD)MmGetPteBase() << 25;
  v4 = *(_QWORD *)(qword_140C4E388
                 + 8i64
                 * ((*(_DWORD *)(MiGetSystemCacheReverseMap((((_QWORD)FirstPte << 25) - v15) >> 16) + 32) >> 6) & 0x3FF));
  v14 = v4;
  KeAcquireInStackQueuedSpinLock(&qword_140C4E0E8, &LockHandle);
  if( MiDecrementSystemCacheViewCount((((_QWORD)FirstPte << 25) - v15) >> 16) )
  {
    InsertTailListPte(v4 + 1784, (UINT64 *)FirstPte);
  }
  else
  {
    v3 = (unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64;
    v5 = (UINT64 *)((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64);
    v6 = ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) + 4096;
    if( ((unsigned __int64)FirstPte & 0xFFFFFFFFFFFFF000ui64) < v6 )
    {
      do
      {
        if( v5 != (UINT64 *)FirstPte )
        {
          RemoveListEntryPte((UINT64 *)(v4 + 1784), v5);
          if( MiGetPteLink(v5[3]) == 1 )
          {
            result[v2] = (__int64)v5;
            v2 = (unsigned int)(v2 + 1);
          }
          else
          {
            v5[3] = ZeroPte;
            v4 = v14;
            v6 = v3 + 4096;
          }
        }
        v5 += 64;
      }
      while( (unsigned __int64)v5 < v6 );
    }
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( v3 )
  {
    if( (_DWORD)v2 )
    {
      v11 = result;
      v12 = (unsigned int)v2;
      do
      {
        MiWaitForSystemCacheViewFlush(*v11++);
        --v12;
      }
      while( v12 );
    }
    v7 = v3 << 25;
    v8 = (__int64)(v7 - v15) >> 16;
    v9 = MiLockWorkingSetOptimal(v4 + 7232, (UINT64)FirstPte, (BYTE *)v13);
    SystemCacheReverseMap = (void *)MiGetSystemCacheReverseMap(v8);
    MiSetSystemCacheReverseMap(v8, 0i64);
    MiUnlockPageTableInternal(v4 + 7232, (UINT64)v9);
    MiUnlockWorkingSetShared(v4 + 7232, v13[0]);
    MiReturnSystemVa(v8, (__int64)(v7 - v15 + 0x2000000000i64) >> 16, 8i64);
    ExFreePoolWithTag(SystemCacheReverseMap, 0);
  }
}

Referenced by:

MmFreeSystemCacheReserveView
MmUnmapViewInSystemCache