PfCheckDeprioritizeFile
UINT64 __stdcall PfCheckDeprioritizeFile(UINT64 ImagePathHash, UINT64 FileKey, UINT64 EndPageOffset){
unsigned int v5;
unsigned int v6;
__int64 v7;
__int64 v8;
UINT64 v9;
__int64 v10;
__int64 v11;
unsigned __int64 v12;
__int64 v14;
__int64 v15;
UINT64 v16;
v5 = ImagePathHash;
v6 = 0;
if( !FileKey || !(unsigned int)PfLockSharedTryAcquire((UINT64)&qword_140C500C8) )
return v6;
v7 = qword_140C500A8;
if( FileKey != *(_QWORD *)(qword_140C500A8 + 8) )
{
v8 = -1i64 << (dword_140C5009C & 0x1F);
v9 = FileKey & v8;
if( (unsigned int)dword_140C5009C < 0x20 )
goto LABEL_31;
v16 = FileKey & v8;
v7 = qword_140C500A0
+ 8i64
* ((37
* (BYTE6(v16)
+ 37
* (BYTE5(v16)
+ 37
* (BYTE4(v16)
+ 37 * (BYTE3(v16) + 37 * (BYTE2(v16) + 37 * (BYTE1(v16) + 37 * ((unsigned __int8)v9 + 11623883)))))))
+ HIBYTE(v16)) & (((unsigned int)dword_140C5009C >> 5) - 1));
while( 1 )
{
v7 = *(_QWORD *)v7;
if( (v7 & 1) != 0 )
break;
if( v9 == (v8 & *(_QWORD *)(v7 + 8)) )
goto LABEL_8;
}
v7 = 0i64;
LABEL_8:
if( !v7 )
{
LABEL_31:
if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C500C8, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&qword_140C500C8);
KeAbPostRelease(&qword_140C500C8);
KeLeaveCriticalRegion();
return v6;
}
qword_140C500A8 = v7;
}
v10 = *(_QWORD *)(v7 + 16);
if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C500C8, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&qword_140C500C8);
KeAbPostRelease(&qword_140C500C8);
KeLeaveCriticalRegion();
if( qword_140C500E8 == v10 )
goto LABEL_20;
if( (unsigned int)PfLockSharedTryAcquire((UINT64)&qword_140C500F0) )
{
if( !(_DWORD)qword_140C500DC )
goto LABEL_16;
v11 = 0i64;
v12 = (37
* (BYTE6(v10)
+ 37
* (BYTE5(v10)
+ 37
* (BYTE4(v10)
+ 37 * (BYTE3(v10) + 37 * (BYTE2(v10) + 37 * (BYTE1(v10) + 37 * ((unsigned __int8)v10 + 11623883)))))))
+ HIBYTE(v10)) & (unsigned int)(qword_140C500DC - 1);
if( !*(_QWORD *)((v12 << dword_140C500D8) + qword_140C500D0) )
goto LABEL_16;
v14 = *(_QWORD *)((v12 << dword_140C500D8) + qword_140C500D0);
do
{
v15 = v14;
if( v14 == v10 )
break;
if( !v11 )
{
v11 = 2654435761i64 * v10 + 1;
if( ((-79 * (_BYTE)v10) & 1) != 0 )
v11 = 2654435761i64 * v10;
}
v12 = (unsigned int)(qword_140C500DC - 1) & (v11 + v12);
v15 = *(_QWORD *)((v12 << dword_140C500D8) + qword_140C500D0);
v14 = v15;
}
while( v15 );
if( v15 )
{
qword_140C500E8 = v10;
}
else
{
LABEL_16:
v6 = 1;
qword_140C50128 = KUSER_SHARED_DATA.TickCountQuad;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C500F0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&qword_140C500F0);
KeAbPostRelease(&qword_140C500F0);
KeLeaveCriticalRegion();
LABEL_20:
PfpRpLogDeprioEvent(FileKey, v5, EndPageOffset & -(__int64)(v6 != 0));
}
return v6;
}Referenced by:
CcUnmapVacb
MiDeprioritizeVad
MiUnmapVad