EtwpPrepareDirtyBuffer

VOID __stdcall EtwpPrepareDirtyBuffer(PSTR DeferredContext, INT64 a2){
  int v2; 
  v2 = *((_DWORD *)DeferredContext + 3);
  if( (v2 & 0x400) != 0 )
  {
    if( (v2 & 0x4000000) != 0 )
    {
      EtwpEnqueueAvailableBuffer((INT64)DeferredContext, (UINT64 *)a2, 4ui64);
      if( !*((_DWORD *)DeferredContext + 288)
        && *((_QWORD *)DeferredContext + 156) >= 2i64 * *((_QWORD *)DeferredContext + 157) )
      {
        EtwpReenableCompression((INT64)DeferredContext);
      }
      if( *((_DWORD *)DeferredContext + 288) && !_InterlockedExchange((volatile __int32 *)DeferredContext + 280, 2) )
      {
        if( ObGetCurrentIrql() > 2u )
          KeInsertQueueDpc((PRKDPC)(DeferredContext + 1176), 0i64, 0i64);
        else
          EtwpCompressionDpc(0i64, DeferredContext, 0i64, 0i64);
      }
    }
    else
    {
      EtwpEnqueueAvailableBuffer((INT64)DeferredContext, (UINT64 *)a2, 0i64);
    }
  }
  else
  {
    *(_DWORD *)(a2 + 44) = 3;
    *(LARGE_INTEGER *)(a2 + 16) = EtwpGetLoggerTimeStamp((INT64)DeferredContext);
  }
}

Referenced by:

EtwpBufferingModeFlush
EtwpFlushActiveBuffers
EtwpSwitchBuffer