PfpParametersPropagate

void __fastcall PfpParametersPropagate(_DWORD *a1){
  _ETHREAD *CurrentThread; 
  unsigned int v3; 
  INT64 v4; 
  INT64 v5; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = 0;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&PfTGlobals, 0i64);
  if( (dword_140C4F908 & 1) != 0 && a1[20] != dword_140C4FB1C )
    v3 = 1;
  if( (dword_140C4F908 & 2) != 0 && a1[19] != dword_140C4FB24 )
    v3 |= 2u;
  if( (dword_140C4F908 & 3) != 0 && (a1[17] & 1) == 0 || v3 )
  {
    PfTCleanup((INT64)&PfTGlobals, v4);
    PfTInitialize();
    PfTStart((INT64)&PfTGlobals, v5, v3);
  }
  if( ((a1[17] & 2) != 0) != (dword_140C50130 & 1) )
  {
    if( (a1[17] & 2) != 0 )
    {
      _InterlockedExchange64(&qword_140C50120, 0i64);
      dword_140C50130 |= 1u;
    }
    else
    {
      PfpRpShutdown((INT64)&byte_140C50098);
    }
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&PfTGlobals, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((volatile INT64 *)&PfTGlobals);
  KeAbPostRelease(&PfTGlobals);
  KeLeaveCriticalRegion();
}

Referenced by:

PfpParametersWatcher