EtwTraceRaw

NTSTATUS __stdcall EtwTraceRaw(UINT64 TraceHandle, VOID *Data, UINT64 DataSize, INT8 RequestorMode){
  __int64 v5; 
  int ReserveTraceBufferStatus; 
  unsigned int v7; 
  _ETW_SILODRIVERSTATE *EtwSiloState; 
  _WMI_LOGGER_CONTEXT *v9; 
  _WMI_LOGGER_CONTEXT *v10; 
  VOID *v11; 
  UINT64 v13; 
  _LARGE_INTEGER TimeStamp; 
  _WMI_LOGGER_CONTEXT *v15; 
  _ETW_BUFFER_HANDLE BufferHandle[4]; 
  __int64 v17; 
  _ETW_LOGGER_HANDLE LoggerHandle; 
  VOID *Src; 
  INT8 v20; 

  v20 = RequestorMode;
  Src = Data;
  v5 = (unsigned int)DataSize;
  *(_OWORD *)BufferHandle = 0i64;
  v17 = 0i64;
  LoggerHandle.DereferenceAndLeave = 0;
  ReserveTraceBufferStatus = 0;
  TimeStamp.QuadPart = 0i64;
  v7 = (unsigned __int16)TraceHandle;
  if( RequestorMode )
    EtwSiloState = PsGetCurrentServerSiloGlobals((_KSPIN_LOCK *)TraceHandle)->EtwSiloState;
  else
    EtwSiloState = (_ETW_SILODRIVERSTATE *)EtwpHostSiloState;
  if( v7 < EtwSiloState->MaxLoggers )
  {
    v9 = EtwpOpenLogger(v7, EtwSiloState, RequestorMode, &LoggerHandle);
    v10 = v9;
    v15 = v9;
    if( v9 )
    {
      if( (v9->LoggerMode & 0x80u) != 0 )
      {
        ReserveTraceBufferStatus = -1073741790;
LABEL_31:
        EtwpCloseLogger(v7, EtwSiloState, LoggerHandle);
        return ReserveTraceBufferStatus;
      }
      if( RequestorMode )
      {
        ReserveTraceBufferStatus = EtwpCheckLoggerControlAccess(0x200ui64, v9);
        if( ReserveTraceBufferStatus < 0 )
          goto LABEL_31;
        if( (_DWORD)v5 )
        {
          if( ((unsigned __int8)Src & 3) != 0 )
            ExRaiseDatatypeMisalignment();
          if( (unsigned __int64)Src + v5 > 0x7FFFFFFF0000i64 || (char *)Src + v5 < Src )
            MEMORY[0x7FFFFFFF0000] = 0;
        }
      }
      else if( (v9->LoggerMode & 0x1000000) != 0 )
      {
        ReserveTraceBufferStatus = -1073741637;
        goto LABEL_31;
      }
      LODWORD(v13) = 0;
      v11 = EtwpReserveTraceBuffer(v10, (unsigned int)v5, BufferHandle, &TimeStamp, v13);
      if( v11 )
      {
        memmove(v11, Src, v5);
        if( (v10->LoggerMode & 0x80000) != 0
          && (!(_BYTE)KdDebuggerNotPresent && !KdPitchDebugger || KdEventLoggingPresent) )
        {
          EtwpSendTraceEvent(v10, BufferHandle);
        }
        if( v10->CallbackContext )
          EtwpInvokeEventCallback((INT64)v10, (INT64)BufferHandle, 0i64);
        EtwpReleaseTraceBuffer(BufferHandle);
      }
      else
      {
        ReserveTraceBufferStatus = EtwpGetReserveTraceBufferStatus(v10, (unsigned int)v5);
      }
      goto LABEL_31;
    }
  }
  return -1073741816;
}

Referenced by:

NtTraceEvent