MiRemoveLockedPageChargeAndDecRef

INT64 __fastcall MiRemoveLockedPageChargeAndDecRef(_MMPFN *Pfn1){
  WCHAR *v1; 
  UINT64 v2; 
  bool v4; 
  __int16 v5; 
  unsigned __int64 PteBase; 
  __int64 v7; 
  __int64 v8; 
  __int64 v9; 
  int v10; 
  unsigned __int64 v11; 
  char v12; 
  int v13; 
  INT64 v14; 
  unsigned __int64 v15; 
  int v16; 
  __int64 v17; 
  __int64 v18; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v20; 
  signed __int32 v21; 
  v2 = *((unsigned __int16 *)Pfn1 + 16);
  if( !(_WORD)v2 )
    MiBadRefCount(Pfn1, v2);
  v4 = (_WORD)v2 == 1;
  v5 = v2 - 1;
  *((_WORD *)Pfn1 + 16) = v5;
  if( v4 && MiIsPfnFileOnly((INT64)Pfn1) )
    goto LABEL_42;
  v7 = *((_QWORD *)Pfn1 + 5);
  if( (v7 & 0x1000000000i64) == 0 && (v7 & 0x2000000000000i64) == 0 )
  {
    v8 = *((_QWORD *)Pfn1 + 3);
    v9 = v8 & 0x3FFFFFFFFFFFFFFFi64;
    if( !v5 )
    {
      v10 = 1;
LABEL_15:
      PteBase = (unsigned __int64)MmGetPteBase();
      v11 = *((_QWORD *)Pfn1 + 1) | 0x8000000000000000ui64;
      if( v11 > PteBase + 0x3FFFFFFF78i64 || v11 < PteBase )
      {
        v12 = *((_BYTE *)Pfn1 + 35);
        if( (v12 & 0x20) != 0 )
        {
          *((_BYTE *)Pfn1 + 35) = v12 & 0xDF;
          goto LABEL_41;
        }
      }
      LOBYTE(v13) = MI_PFN_IS_PROTO((UNICODE_STRING *)Pfn1, (UNICODE_STRING *)0x8000000000000000i64, PteBase, v1);
      if( v13 && (*((_DWORD *)Pfn1 + 4) & 0x400i64) != 0 )
      {
        v16 = 1;
      }
      else if( (unsigned int)MiIsPfnCommitNotCharged(v14) )
      {
        v16 = 1;
      }
      else if( v10 == 1 && (v8 & 0x4000000000000000i64) != 0 )
      {
        v16 = 1;
      }
      v17 = (v15 >> 39) & 0x3FF;
      v18 = *(_QWORD *)(qword_140C4E388 + 8 * v17);
      if( v16 == 1 )
        MiReturnCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v17), 1ui64);
      PteBase = 1i64;
      if( (ULONG_PTR *)v18 == &MiSystemPartition )
      {
        CurrentPrcb = KeGetCurrentPrcb();
        v20 = *((int *)CurrentPrcb + 8391);
        if( (_DWORD)v20 != -1 )
        {
          if( (unsigned __int64)(v20 + 1) <= 0x100 )
          {
            while( 1 )
            {
              v21 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v20 + 1, v20);
              v4 = (_DWORD)v20 == v21;
              LODWORD(v20) = v21;
              if( v4 )
                break;
              if( v21 == -1 || (unsigned __int64)(v21 + 1i64) > 0x100 )
                goto LABEL_35;
            }
LABEL_41:
            if( v10 )
            {
LABEL_42:
              MiPfnReferenceCountIsZero(Pfn1, (Pfn1 - MmGetPfnDb()) / 48, (UINT8 *)PteBase);
              return 1i64;
            }
            return 0i64;
          }
LABEL_35:
          if( (int)v20 > 192
            && (_DWORD)v20 != -1
            && (_DWORD)v20 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v20) )
          {
            PteBase = (int)v20 - 192 + 1i64;
          }
          if( !PteBase )
            goto LABEL_41;
        }
      }
      PteBase = _InterlockedExchangeAdd64((volatile signed __int64 *)(v18 + 7168), PteBase);
      goto LABEL_41;
    }
    if( v5 == 1 )
    {
      if( v9 )
      {
LABEL_13:
        v10 = 0;
        goto LABEL_15;
      }
    }
    else if( v5 != 2 || !v9 )
    {
      return 0i64;
    }
    if( (*((_BYTE *)Pfn1 + 34) & 8) == 0 )
      return 0i64;
    goto LABEL_13;
  }
  return 0i64;
}

Referenced by:

MiCopyDataPageToImagePage
MiCopyFileOnlyGlobalSubsectionPage
MiDeletePerSessionProtos
MiDoubleUnlockMdlPage
MiFinalizeImageHeaderPage
MiFinishHardFault
MiFinishLastForkPageTable
MiFinishMdlForMappedFileFault
MiHandleCollidedFault
MiIdealClusterPage
MiInitializeImageProtos
MiJumpStackTarget
MiLockDownWorkingSet
MiLockProtoPage
MiMakeDriverPagesPrivate
MiMigratePfn
MiMirrorPerformBrownWrites
MiPrivateFixup
MiProbeLockFrame
MiResolveDemandZeroFault
MiResolveProtoPteFault
MiReturnPfnReferenceCount
MiSwapStackPage
MiUnlockCodePage
MiUnlockNestedProtoPoolPage
MiUnlockPagedAddress
MiUpdateImportRelocationsOnDriverPrivatePages
MiWaitForCollidedFaultComplete
MmCopyToCachedPage