PfGenerateTrace

NTSTATUS __stdcall PfGenerateTrace(PFP_LOGGING_WORKER_CONTEXT *TraceGenContext, UINT64 FlushOnly){
  _ETHREAD *CurrentThread; 
  int v3; 
  NTSTATUS v5; 
  _ADAPTER_OBJECT *v6; 
  VOID *Object[2]; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v3 = FlushOnly;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C4DB30 + 954, 0i64);
  v5 = 0;
  if( *(_QWORD *)TraceGenContext )
  {
    if( !v3 )
      _InterlockedIncrement(TraceGenContext + 20);
    KeResetEvent((_KEVENT *)(TraceGenContext + 14));
    KeSetEvent((PRKEVENT)(TraceGenContext + 8), 0, 0);
    v6 = *(_ADAPTER_OBJECT **)TraceGenContext;
    ObfReferenceObject(*(PVOID *)TraceGenContext);
    if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 954, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 954);
    KeAbPostRelease((char *)&stru_140C4DB30 + 7632);
    KeLeaveCriticalRegion();
    Object[0] = TraceGenContext + 14;
    Object[1] = v6;
    KeWaitForMultipleObjects(2ui64, Object, WaitAny, Executive, 0, 0, 0i64, 0i64);
    HalPutDmaAdapter(v6);
    if( !v3 )
      _InterlockedAdd(TraceGenContext + 20, 0xFFFFFFFF);
  }
  else
  {
    v5 = -1073741177;
    if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 954, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 954);
    KeAbPostRelease((char *)&stru_140C4DB30 + 7632);
    KeLeaveCriticalRegion();
  }
  return v5;
}

Referenced by:

PfPowerActionNotify
PfSetSuperfetchInformation
PfpLogEventRequest
PfpLogScenarioEvent