EtwpPreserveLogger

NTSTATUS __stdcall EtwpPreserveLogger(_WMI_LOGGER_CONTEXT *LoggerContext){
  struct _ETW_SOFT_RESTART_CONTEXT *SoftRestartContext; 
  __int64 BufferSize; 
  VOID **PoolWithTag; 
  VOID **v6; 
  NTSTATUS v7; 
  _WMI_BUFFER_HEADER *TraceBuffer; 
  _WMI_BUFFER_HEADER *v9; 
  _UNICODE_STRING LogFileName; 
  _LIST_ENTRY *Flink; 
  char *p_Blink; 
  _WMI_LOGGER_CONTEXT *v13; 
  _UNICODE_STRING Src; 

  SoftRestartContext = LoggerContext->SoftRestartContext;
  if( *((_BYTE *)SoftRestartContext + 33) )
    return 0;
  BufferSize = LoggerContext->BufferSize;
  Src = (_UNICODE_STRING)*((_OWORD *)SoftRestartContext + 1);
  if( ((BufferSize * (unsigned int)(LoggerContext->NumberOfBuffers + 1)) & 0xFFFFFFFFFFFFF000ui64) > 0xFFFFFFFF000i64 )
    return -1073741637;
  PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)Src.Length + 18, 1266119749i64);
  v6 = PoolWithTag;
  if( PoolWithTag )
  {
    memset(PoolWithTag, 0i64, Src.Length + 18);
    *((_DWORD *)v6 + 2) = LoggerContext->BufferSize;
    *((_DWORD *)v6 + 3) = 16;
    memmove(v6 + 2, Src.Buffer, Src.Length + 2);
    TraceBuffer = (_WMI_BUFFER_HEADER *)EtwpAllocateTraceBuffer((INT64)LoggerContext, (unsigned int)BufferSize);
    v9 = TraceBuffer;
    if( !TraceBuffer )
    {
      v7 = -1073741801;
LABEL_20:
      ExFreePoolWithTag(v6, 0);
      return v7;
    }
    EtwpInitializeBufferHeader(LoggerContext, TraceBuffer);
    EtwpResetBufferHeader(v9, 4u);
    LogFileName = LoggerContext->LogFileName;
    LoggerContext->LogFileName = Src;
    EtwpAddLogHeader(LoggerContext, v9);
    LoggerContext->LogFileName = LogFileName;
    v7 = EtwpBuildMdlForTraceBuffer((_WMI_BUFFER_HEADER *)LoggerContext, (_MDL **)v9);
    if( v7 >= 0 )
    {
      ++*((_DWORD *)v6 + 1);
      Flink = LoggerContext->GlobalList.Flink;
      p_Blink = (char *)&Flink[-4].Blink;
      if( Flink == &LoggerContext->GlobalList )
        p_Blink = 0i64;
      if( p_Blink )
      {
        while( 1 )
        {
          v7 = EtwpBuildMdlForTraceBuffer((_WMI_BUFFER_HEADER *)LoggerContext, (_MDL **)p_Blink);
          if( v7 < 0 )
            break;
          MEMORY[0] = 0i64;
          ++*((_DWORD *)v6 + 1);
          v13 = (_WMI_LOGGER_CONTEXT *)*((_QWORD *)p_Blink + 7);
          p_Blink = (char *)&v13[-1].CallbackContext;
          if( v13 == (_WMI_LOGGER_CONTEXT *)&LoggerContext->GlobalList )
            p_Blink = 0i64;
          if( !p_Blink )
            goto LABEL_17;
        }
      }
      else
      {
LABEL_17:
        v7 = EtwpPreserveMdlList(0i64, (__int64)v6, (unsigned int)Src.Length + 18, (__int64)SoftRestartContext);
        if( v7 >= 0 )
        {
          *((_QWORD *)SoftRestartContext + 1) = v9;
          *((_BYTE *)SoftRestartContext + 33) = 1;
          goto LABEL_20;
        }
      }
    }
    EtwpFreeTraceBuffer((INT64)LoggerContext, (CHAR *)v9);
    goto LABEL_20;
  }
  return -1073741670;
}

Referenced by:

EtwpKsrCallback
EtwpSetSoftRestartInformation