PfSnTraceTimerRoutine

VOID __fastcall PfSnTraceTimerRoutine(KDPC *Dpc, VOID *DeferredContext, VOID *SystemArgument1, VOID *SystemArgument2){
  int v5; 
  int v6; 
  unsigned __int64 *v7; 
  bool v8; 
  unsigned __int64 *a3; 
  a3 = 0i64;
  if( *((_DWORD *)DeferredContext + 100) )
    goto LABEL_12;
  v5 = *((_DWORD *)DeferredContext + 83);
  if( v5 > *((_DWORD *)DeferredContext + 85) )
    v5 = *((_DWORD *)DeferredContext + 85);
  v6 = *((_DWORD *)DeferredContext + 81);
  if( v6 > v5 )
    v6 = v5;
  *((_DWORD *)DeferredContext + (*((_DWORD *)DeferredContext + 82))++ + 71) = v5 - v6;
  *((_DWORD *)DeferredContext + 81) = v5;
  if( (int)PfSnTraceGetLogEntry((INT64)DeferredContext, 1ui64, &a3) < 0 )
  {
    v8 = _InterlockedCompareExchange((volatile signed __int32 *)DeferredContext + 100, 10, 0) == 0;
  }
  else
  {
    v7 = a3;
    *a3 &= 7ui64;
    v7[1] = 0i64;
    *v7 = *v7 & 0xFFFFFFFFFFFFFFF8ui64 | 4;
    if( *((_DWORD *)DeferredContext + 82) < dword_140C4FFF4 )
    {
      KxAcquireSpinLock((UINT64 *)DeferredContext + 34);
      if( !*((_DWORD *)DeferredContext + 100) && ExAcquireRundownProtection((PEX_RUNDOWN_REF)DeferredContext + 45) )
        KiSetTimerEx(
          (_KTIMER *)((char *)DeferredContext + 136),
          *(_LARGE_INTEGER *)((char *)DeferredContext + 200),
          0i64,
          0,
          (_KDPC *)((char *)DeferredContext + 208));
      KxReleaseSpinLock((UINT64 *)DeferredContext + 34);
      goto LABEL_12;
    }
    v8 = _InterlockedCompareExchange((volatile signed __int32 *)DeferredContext + 100, 4, 0) == 0;
  }
  if( v8 )
    ExQueueWorkItem((WORK_QUEUE_ITEM *)((char *)DeferredContext + 368), DelayedWorkQueue);
LABEL_12:
  ExReleaseRundownProtection((PEX_RUNDOWN_REF)DeferredContext + 45);
}

Referenced by:

No references.