EtwpRealtimeRestoreState

NTSTATUS __stdcall EtwpRealtimeRestoreState(_WMI_LOGGER_CONTEXT *LoggerContext){
  NTSTATUS result; 
  void *RealtimeLogfileHandle; 
  int UsedProcessorCount; 
  unsigned __int64 RealtimeMaximumFileSize; 
  void *v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  _ETW_REF_CLOCK v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  int FileInformationClass; 
  _LARGE_INTEGER ByteOffset; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  __int128 Buffer[5]; 
  __int128 FileInformation; 
  __int64 v19; 

  v19 = 0i64;
  FileInformation = 0i64;
  IoStatusBlock = 0i64;
  memset(Buffer, 0i64, 0x48u);
  result = ZwQueryInformationFile(
             LoggerContext->RealtimeLogfileHandle,
             &IoStatusBlock,
             &FileInformation,
             0x18ui64,
             FileStandardInformation);
  if( result >= 0 )
  {
    if( !*((_QWORD *)&FileInformation + 1) )
      return 0;
    if( *((__int64 *)&FileInformation + 1) < 72 )
      return -1073741566;
    RealtimeLogfileHandle = LoggerContext->RealtimeLogfileHandle;
    ByteOffset.QuadPart = 0i64;
    result = ZwReadFile((_HANDLE)RealtimeLogfileHandle, 0, 0i64, 0i64, &IoStatusBlock, Buffer, 0x48u, &ByteOffset, 0i64);
    if( result < 0 )
      return result;
    result = IoStatusBlock.Status;
    if( IoStatusBlock.Status < 0 )
      return result;
    if( IoStatusBlock.Information != 72 )
      return -1073741807;
    if( LODWORD(Buffer[0]) != 1933995090 )
      return -1073741566;
    if( DWORD2(Buffer[0]) != 1 )
      return -1073741566;
    UsedProcessorCount = EtwpQueryUsedProcessorCount(LoggerContext);
    if( HIDWORD(Buffer[0]) != UsedProcessorCount )
      return -1073741566;
    if( !LODWORD(Buffer[2]) )
      return -1073741566;
    if( *((__int64 *)&Buffer[2] + 1) > *((__int64 *)&Buffer[3] + 1) )
      return -1073741566;
    if( *(__int64 *)&Buffer[3] > *((__int64 *)&Buffer[3] + 1) )
      return -1073741566;
    if( *(_QWORD *)&Buffer[3] == *((_QWORD *)&Buffer[2] + 1) )
      return -1073741566;
    if( *((_QWORD *)&Buffer[3] + 1) < 0x48ui64 )
      return -1073741566;
    RealtimeMaximumFileSize = LoggerContext->RealtimeMaximumFileSize;
    if( *((__int64 *)&Buffer[3] + 1) > (__int64)RealtimeMaximumFileSize
      || *(_QWORD *)&Buffer[4] > RealtimeMaximumFileSize
      || *((__int64 *)&FileInformation + 1) < *((__int64 *)&Buffer[3] + 1) )
    {
      return -1073741566;
    }
    v6 = LoggerContext->RealtimeLogfileHandle;
    LODWORD(Buffer[0]) = 0;
    result = ZwWriteFile((_HANDLE)v6, 0, 0i64, 0i64, &IoStatusBlock, Buffer, 0x48u, &ByteOffset, 0i64);
    if( result >= 0 )
    {
      v7 = *(_QWORD *)&Buffer[4];
      v8 = LoggerContext->BufferSize * LoggerContext->MaximumBuffers;
      v9 = (_ETW_REF_CLOCK)Buffer[1];
      LoggerContext->RealtimeBuffersSaved = Buffer[2];
      LoggerContext->RealtimeReadOffset.QuadPart = *((_QWORD *)&Buffer[2] + 1);
      LoggerContext->RealtimeWriteOffset.QuadPart = *(_QWORD *)&Buffer[3];
      LoggerContext->RealtimeLogfileSize.QuadPart = *((_QWORD *)&Buffer[3] + 1);
      v10 = LoggerContext->RealtimeMaximumFileSize - v7;
      LoggerContext->RealtimeLogfileUsage = v7;
      LoggerContext->RealtimeReferenceTime = v9;
      if( v10 <= v8 && LoggerContext->AcceptNewEvents >= 0 )
      {
        _InterlockedExchange(&LoggerContext->AcceptNewEvents, -1073741432);
        if( EtwEventEnabled(*(&ExBootDevicesRemovedEvent + 241), &ETW_EVENT_BACKING_FILE_FULL) )
          EtwpEventWriteTemplateBackingFile(
            v12,
            v11,
            v13,
            &LoggerContext->LoggerName.Length,
            FileInformationClass,
            LoggerContext->LoggerMode);
      }
      return 0;
    }
  }
  return result;
}

Referenced by:

EtwpRealtimeCreateLogfile