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