MiRemoveLockedPageCharge

NTSTATUS __stdcall MiRemoveLockedPageCharge(_MMPFN *Pfn1){
  unsigned __int16 ReferenceCount; 
  bool v2; 
  unsigned __int16 v3; 
  unsigned __int64 EntireField; 
  unsigned __int64 v6; 
  __int64 v7; 
  NTSTATUS v8; 
  _MMPTE *PteBase; 
  _UNICODE_STRING *v10; 
  char v11; 
  int v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  int v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  _MI_PARTITION *v19; 
  __int64 v20; 
  __int64 v21; 
  struct _KPRCB *CurrentPrcb; 
  __int64 CachedCommit; 
  __int64 v24; 
  unsigned __int64 v25; 
  unsigned __int64 HighCommitThreshold; 
  unsigned __int64 LowCommitThreshold; 
  struct _KPRCB *v28; 
  __int64 CachedResidentAvailable; 
  signed __int32 v30; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  ReferenceCount = Pfn1->u3.ReferenceCount;
  if( !ReferenceCount )
    MiBadRefCount(Pfn1);
  v2 = ReferenceCount == 1;
  v3 = ReferenceCount - 1;
  Pfn1->u3.ReferenceCount = v3;
  if( v2 && (Pfn1->u4._bf_0 & 0x2000000000000i64) != 0 )
    return 1;
  EntireField = Pfn1->u4.EntireField;
  if( (EntireField & 0x1000000000i64) != 0 || (EntireField & 0x2000000000000i64) != 0 )
    return 0;
  v6 = 1i64;
  v7 = Pfn1->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64;
  if( !v3 )
  {
    v8 = 1;
    goto LABEL_16;
  }
  if( v3 == 1 )
  {
    if( v7 )
    {
LABEL_14:
      v8 = 0;
LABEL_16:
      PteBase = MmGetPteBase();
      v10 = (_UNICODE_STRING *)(Pfn1->PteLong | 0x8000000000000000ui64);
      if( v10 > (_UNICODE_STRING *)&PteBase[0x7FFFFFFEFi64] || v10 < (_UNICODE_STRING *)PteBase )
      {
        v11 = *((_BYTE *)&Pfn1->u3 + 3);
        if( (v11 & 0x20) != 0 )
        {
          *((_BYTE *)&Pfn1->u3 + 3) = v11 & 0xDF;
          return v8;
        }
      }
      LOBYTE(v12) = MI_PFN_IS_PROTO((_UNICODE_STRING *)Pfn1, v10, 0, (PWCHAR)Pfn1->u2._bf_0);
      if( v12 && (*(_DWORD *)(v14 + 16) & 0x400i64) != 0 )
      {
        v15 = 1;
      }
      else if( v13 <= v17 && v13 >= v18 && (*(_BYTE *)(v14 + 35) & 0x20) != 0 )
      {
        v15 = 1;
      }
      else if( v8 == 1 && (v16 & 0x4000000000000000i64) != 0 )
      {
        v15 = 1;
      }
      v19 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF));
      if( v15 == 1 )
      {
        v20 = 1i64;
        memset(&LockHandle, 0, sizeof(LockHandle));
        if( !v19->Commit.OverCommit
          || (KeAcquireInStackQueuedSpinLock(&v19->Commit.EventLock, &LockHandle),
              LODWORD(v21) = MiRestockOverCommit((INT64)v19, 1ui64),
              v20 = v21,
              KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle),
              __writecr8(LockHandle.OldIrql),
              v20) )
        {
          if( v19 == &Irp
            && (CurrentPrcb = KeGetCurrentPrcb(),
                _m_prefetchw((const void *)&CurrentPrcb->CachedCommit),
                CachedCommit = CurrentPrcb->CachedCommit,
                (unsigned __int64)(v20 + CachedCommit) <= 0x100) )
          {
            while( 1 )
            {
              v24 = _InterlockedCompareExchange(
                      (volatile signed __int32 *)&CurrentPrcb->CachedCommit,
                      CachedCommit + v20,
                      CachedCommit);
              if( v24 == CachedCommit )
                break;
              CachedCommit = v24;
              if( (unsigned __int64)(v24 + v20) > 0x100 )
                goto LABEL_37;
            }
          }
          else
          {
LABEL_37:
            v25 = _InterlockedExchangeAdd64((volatile signed __int64 *)&v19->Vp.TotalCommittedPages, -v20);
            HighCommitThreshold = v19->Commit.HighCommitThreshold;
            if( v25 >= HighCommitThreshold && v25 - v20 < HighCommitThreshold
              || (LowCommitThreshold = v19->Commit.LowCommitThreshold, v25 - v20 < LowCommitThreshold)
              && v25 >= LowCommitThreshold )
            {
              MiSyncCommitSignals(v19, 0i64);
            }
          }
        }
      }
      if( v19 != &Irp )
        goto LABEL_53;
      v28 = KeGetCurrentPrcb();
      CachedResidentAvailable = (int)v28->CachedResidentAvailable;
      if( (_DWORD)CachedResidentAvailable == -1 )
        goto LABEL_53;
      if( (unsigned __int64)(CachedResidentAvailable + 1) <= 0x100 )
      {
        do
        {
          v30 = _InterlockedCompareExchange(
                  (volatile signed __int32 *)&v28->CachedResidentAvailable,
                  CachedResidentAvailable + 1,
                  CachedResidentAvailable);
          v2 = (_DWORD)CachedResidentAvailable == v30;
          LODWORD(CachedResidentAvailable) = v30;
          if( v2 )
            return v8;
        }
        while( v30 != -1 && (unsigned __int64)(v30 + 1i64) <= 0x100 );
      }
      if( (int)CachedResidentAvailable > 192
        && (_DWORD)CachedResidentAvailable != -1
        && (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
                                                (volatile signed __int32 *)&v28->CachedResidentAvailable,
                                                192,
                                                CachedResidentAvailable) )
      {
        v6 = (int)CachedResidentAvailable - 192 + 1i64;
      }
      if( v6 )
LABEL_53:
        _InterlockedExchangeAdd64((volatile signed __int64 *)&v19->Vp.ResidentAvailablePages, v6);
      return v8;
    }
  }
  else if( v3 != 2 || !v7 )
  {
    return 0;
  }
  if( (*(_BYTE *)(&Pfn1->u3 + 1) & 8) != 0 )
    goto LABEL_14;
  return 0;
}

Referenced by:

MiCopyDataPageToImagePage
MiFinishHardFault
MiIdealClusterPage
MiMigratePfn
MiPurgeBadFileOnlyPages
MiSwapHardFaultPage
MiUnlockProtoPoolPage
MiWalkEntireImage