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