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