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