EtwpCreateLogFile

NTSTATUS __stdcall EtwpCreateLogFile(_WMI_LOGGER_CONTEXT *LoggerContext, UINT8 Impersonate){
  char v4; 
  char v5; 
  _UNICODE_STRING NewLogFileName; 
  char v7; 
  bool CreateDirectoryTree; 
  int updated; 
  PVOID v10; 
  UINT8 v11; 
  void *LogFileHandle; 
  bool v13; 
  _UNICODE_STRING v14; 
  _UNICODE_STRING v16; 
  UINT64 RealTime; 
  __int64 Append; 
  PVOID FileHandle; 
  _UNICODE_STRING DestinationString; 
  _UNICODE_STRING FileName; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  __int128 FileInformation[2]; 
  __int64 v24; 

  LOBYTE(Append) = 0;
  FileHandle = 0i64;
  v24 = 0i64;
  memset(FileInformation, 0, sizeof(FileInformation));
  v4 = 0;
  v5 = 0;
  IoStatusBlock = 0i64;
  DestinationString = 0i64;
  RtlInitUnicodeString(&DestinationString, 0i64);
  if( (LoggerContext->Flags & 4) != 0 )
  {
    _InterlockedAnd((volatile signed __int32 *)&LoggerContext->836, 0xFFFFFFFC);
    if( LoggerContext->LogFileName.Buffer || LoggerContext->NewLogFileName.Buffer )
    {
      if( LoggerContext->NewLogFileName.Buffer )
      {
        NewLogFileName = LoggerContext->NewLogFileName;
      }
      else
      {
        if( (LoggerContext->Flags & 2) != 0 )
        {
          ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
          EtwpExpandFileName(
            0,
            &LoggerContext->LogFileName,
            (unsigned int)LoggerContext->FileCounter,
            &LoggerContext->LoggerName);
          if( (_InterlockedExchangeAdd64(&LoggerContext->LoggerLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock(&LoggerContext->LoggerLock);
          KeAbPostRelease(&LoggerContext->LoggerLock);
        }
        NewLogFileName = LoggerContext->LogFileName;
      }
      v7 = Append;
      if( (LoggerContext->LoggerMode & 4) != 0 )
        v7 = 1;
      CreateDirectoryTree = (LoggerContext->Flags & 2) != 0;
      LOBYTE(Append) = v7;
      FileName = NewLogFileName;
      if( Impersonate == 1 )
      {
        if( LoggerContext->ClientSecurityContext.ClientToken )
        {
          updated = SeImpersonateClientEx(&LoggerContext->ClientSecurityContext, 0i64);
          v5 = 1;
          if( updated < 0 )
            goto LABEL_25;
        }
      }
      updated = EtwpDelayCreate(
                  &FileHandle,
                  &FileName,
                  (UINT8 *)&Append,
                  ~(LoggerContext->LoggerMode >> 26) & 1,
                  0,
                  CreateDirectoryTree);
      if( v5 == 1 )
        PsRevertToSelf();
      v10 = FileHandle;
      if( updated >= 0 )
      {
        LODWORD(v24) = 0x2000;
        LODWORD(RealTime) = 4;
        ZwSetInformationFile((UINT64)FileHandle, (UINT64)&IoStatusBlock, (INT8 *)FileInformation, 0x28ui64, RealTime);
        if( LoggerContext->LogFileHandle )
        {
          EtwpFinalizeHeader(LoggerContext, 0i64, v11);
          LogFileHandle = LoggerContext->LogFileHandle;
        }
        else
        {
          v4 = 1;
          LogFileHandle = 0i64;
        }
        v13 = LoggerContext->NewLogFileName.Buffer == 0i64;
        LoggerContext->LogFileHandle = v10;
        if( !v13 )
        {
          ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
          v14 = LoggerContext->NewLogFileName;
          DestinationString = LoggerContext->LogFileName;
          LoggerContext->LogFileName = v14;
          if( (_InterlockedExchangeAdd64(&LoggerContext->LoggerLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
            ExfTryToWakePushLock(&LoggerContext->LoggerLock);
          KeAbPostRelease(&LoggerContext->LoggerLock);
          RtlInitUnicodeString(&LoggerContext->NewLogFileName, 0i64);
          v10 = FileHandle;
        }
        updated = EtwpUpdateFileHeader(LoggerContext, Append);
        if( updated < 0 )
        {
          LoggerContext->LogFileHandle = LogFileHandle;
        }
        else
        {
          if( !v4 )
            EtwpSendSessionNotification(LoggerContext, 1, 0i64);
          v10 = 0i64;
          FileHandle = 0i64;
          if( !LogFileHandle )
            goto LABEL_25;
          ZwClose((_HANDLE)LogFileHandle);
        }
      }
      if( v10 )
      {
        ZwClose((_HANDLE)v10);
        if( LoggerContext->LogFileHandle )
        {
          if( DestinationString.Buffer )
          {
            ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
            v16 = DestinationString;
            LoggerContext->NewLogFileName = LoggerContext->LogFileName;
            LoggerContext->LogFileName = v16;
            if( (_InterlockedExchangeAdd64(&LoggerContext->LoggerLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
              ExfTryToWakePushLock(&LoggerContext->LoggerLock);
            KeAbPostRelease(&LoggerContext->LoggerLock);
            RtlInitUnicodeString(&DestinationString, 0i64);
          }
        }
      }
LABEL_25:
      RtlFreeAnsiString(&LoggerContext->NewLogFileName);
      RtlFreeAnsiString(&DestinationString);
      return updated;
    }
  }
  return 0;
}

Referenced by:

EtwpBufferingModeFlush
EtwpLogger
EtwpStartLogger