PfCheckDeprioritizeFile

UINT64 __stdcall PfCheckDeprioritizeFile(UINT64 ImagePathHash, UINT64 FileKey, UINT64 EndPageOffset, INT64 a4){
  unsigned int v6; 
  unsigned int v7; 
  __int64 v8; 
  __int64 v9; 
  UINT64 v10; 
  __int64 v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  __int64 v15; 
  __int64 v16; 
  UINT64 v17; 

  v6 = ImagePathHash;
  v7 = 0;
  if( !FileKey || !(unsigned int)PfLockSharedTryAcquire(&stru_140C500C8) )
    return v7;
  v8 = qword_140C500A8;
  if( FileKey != *(_QWORD *)(qword_140C500A8 + 8) )
  {
    v9 = -1i64 << (dword_140C5009C & 0x1F);
    v10 = FileKey & v9;
    if( dword_140C5009C < 0x20u )
      goto LABEL_31;
    v17 = FileKey & v9;
    v8 = qword_140C500A0
       + 8i64
       * ((37
         * (BYTE6(v17)
          + 37
          * (BYTE5(v17)
           + 37
           * (BYTE4(v17)
            + 37 * (BYTE3(v17) + 37 * (BYTE2(v17) + 37 * (BYTE1(v17) + 37 * ((unsigned __int8)v10 + 11623883)))))))
         + HIBYTE(v17)) & (unsigned int)((dword_140C5009C >> 5) - 1));
    while( 1 )
    {
      v8 = *(_QWORD *)v8;
      if( (v8 & 1) != 0 )
        break;
      if( v10 == (v9 & *(_QWORD *)(v8 + 8)) )
        goto LABEL_8;
    }
    v8 = 0i64;
LABEL_8:
    if( !v8 )
    {
LABEL_31:
      if( _InterlockedCompareExchange64(&stru_140C500C8._bf_0, 0i64, 17i64) != 17 )
        ExfReleasePushLockShared(&stru_140C500C8);
      KeAbPostRelease(&stru_140C500C8);
      KeLeaveCriticalRegion();
      return v7;
    }
    qword_140C500A8 = v8;
  }
  v11 = *(_QWORD *)(v8 + 16);
  if( _InterlockedCompareExchange64(&stru_140C500C8._bf_0, 0i64, 17i64) != 17 )
    ExfReleasePushLockShared(&stru_140C500C8);
  KeAbPostRelease(&stru_140C500C8);
  KeLeaveCriticalRegion();
  if( qword_140C500E8 == v11 )
    goto LABEL_20;
  if( (unsigned int)PfLockSharedTryAcquire(&stru_140C500F0) )
  {
    if( !(_DWORD)qword_140C500DC )
      goto LABEL_16;
    v12 = 0i64;
    v13 = (37
         * (BYTE6(v11)
          + 37
          * (BYTE5(v11)
           + 37
           * (BYTE4(v11)
            + 37 * (BYTE3(v11) + 37 * (BYTE2(v11) + 37 * (BYTE1(v11) + 37 * ((unsigned __int8)v11 + 11623883)))))))
         + HIBYTE(v11)) & (unsigned int)(qword_140C500DC - 1);
    if( !*(_QWORD *)((v13 << dword_140C500D8) + qword_140C500D0) )
      goto LABEL_16;
    v15 = *(_QWORD *)((v13 << dword_140C500D8) + qword_140C500D0);
    do
    {
      v16 = v15;
      if( v15 == v11 )
        break;
      if( !v12 )
      {
        v12 = 2654435761i64 * v11 + 1;
        if( ((-79 * (_BYTE)v11) & 1) != 0 )
          v12 = 2654435761i64 * v11;
      }
      v13 = (unsigned int)(qword_140C500DC - 1) & (v12 + v13);
      v16 = *(_QWORD *)((v13 << dword_140C500D8) + qword_140C500D0);
      v15 = v16;
    }
    while( v16 );
    if( v16 )
    {
      qword_140C500E8 = v11;
    }
    else
    {
LABEL_16:
      v7 = 1;
      qword_140C50128 = KUSER_SHARED_DATA.TickCountQuad;
    }
    if( _InterlockedCompareExchange64(&stru_140C500F0._bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(&stru_140C500F0);
    KeAbPostRelease(&stru_140C500F0);
    KeLeaveCriticalRegion();
LABEL_20:
    PfpRpLogDeprioEvent(FileKey, v6, EndPageOffset & -(__int64)(v7 != 0));
  }
  return v7;
}

Referenced by:

CcUnmapVacb
MiDeprioritizeVad
MiUnmapVad