EtwpFinalizeHeader

NTSTATUS __fastcall EtwpFinalizeHeader(__int64 a1, char a2){
  _QWORD *v2; 
  char v4; 
  NTSTATUS result; 
  unsigned int Length; 
  unsigned int v7; 
  _LARGE_INTEGER *Buffer; 
  void *v9; 
  NTSTATUS v10; 
  union _LARGE_INTEGER v11; 
  int v12; 
  unsigned int HighPart; 
  unsigned int LowPart; 
  NTSTATUS v15; 
  int v16; 
  unsigned int v17; 
  unsigned __int64 v18; 
  VOID *v19; 
  INT64 FsInformationClass; 
  union _LARGE_INTEGER ByteOffset; 
  int v23; 
  int v24; 
  struct _IO_STATUS_BLOCK IoStatusBlock; 
  unsigned __int64 FileInformation; 
  IO_STATUS_BLOCK v27; 
  __int128 FsInformation; 
  __int64 v29; 
  v29 = 0i64;
  v2 = (_QWORD *)(a1 + 112);
  FsInformation = 0i64;
  IoStatusBlock = 0i64;
  if( (_QWORD *)*v2 != v2
    || *(_QWORD *)(a1 + 1024) != a1 + 1024
    || *(_DWORD *)(a1 + 136)
    || (v4 = 0, *(_QWORD *)(a1 + 1288)) )
  {
    v4 = 1;
  }
  result = ZwQueryVolumeInformationFile(
             *(HANDLE *)(a1 + 816),
             &IoStatusBlock,
             &FsInformation,
             0x18u,
             FileFsSizeInformation);
  if( result >= 0 )
  {
    v23 = HIDWORD(v29);
    Length = ~(HIDWORD(v29) - 1) & (HIDWORD(v29) + 383);
    v24 = ~(HIDWORD(v29) - 1);
    v7 = Length;
    if( v4 )
      v7 = *(_DWORD *)(a1 + 4);
    Buffer = (_LARGE_INTEGER *)ExAllocatePoolWithTag(PagedPool, (v7 + 4095i64) & 0xFFFFFFFFFFFFF000ui64, 0x50777445ui64);
    if( !Buffer )
      return -1073741801;
    v9 = *(void **)(a1 + 816);
    ByteOffset.QuadPart = 0i64;
    v10 = ZwReadFile(v9, 0i64, 0i64, 0i64, &IoStatusBlock, Buffer, Length, &ByteOffset, 0i64);
    if( v10 < 0 )
      goto LABEL_21;
    v11.QuadPart = Length;
    ByteOffset.QuadPart = Length;
    if( !a2 )
    {
      Buffer[17].HighPart = *(_DWORD *)(a1 + 264);
      Buffer[14].HighPart = EtwpQueryUsedProcessorCount(a1);
      Buffer[19].LowPart += *(_DWORD *)(a1 + 256);
      KeQuerySystemTimePrecise(Buffer + 15);
      if( EtwpIsWow64Logger(a1) )
        Buffer[46].HighPart += v12;
      else
        Buffer[47].HighPart += v12;
      Buffer[14].LowPart = (unsigned __int16)NtBuildNumber;
      v11 = ByteOffset;
    }
    HighPart = Buffer->HighPart;
    if( HighPart > v11.LowPart )
    {
      if( !v4 )
      {
LABEL_16:
        ByteOffset.QuadPart = 0i64;
        LowPart = Buffer[6].LowPart;
        if( LowPart >= v7 )
          LowPart = v7;
        v15 = ZwWriteFile(
                *(HANDLE *)(a1 + 816),
                0i64,
                0i64,
                0i64,
                &IoStatusBlock,
                Buffer,
                v24 & (LowPart + v23 - 1),
                &ByteOffset,
                0i64);
        v10 = v15;
        if( !a2 && v15 >= 0 )
        {
          v16 = *(_DWORD *)(a1 + 12);
          if( (v16 & 0x20) != 0 )
          {
            v18 = *(unsigned int *)(a1 + 4) * (unsigned __int64)*(unsigned int *)(a1 + 264);
            v27 = 0i64;
            if( v18 < *(unsigned int *)(a1 + 308)
                     * ((-(__int64)((v16 & 0x2000) != 0) & 0xFFFFFFFFFFF00400ui64) + 0x100000) )
            {
              v19 = *(VOID **)(a1 + 816);
              FileInformation = v18;
              v10 = ZwSetInformationFile(v19, &v27, &FileInformation, 8ui64, FileEndOfFileInformation);
            }
          }
        }
LABEL_21:
        ExFreePoolWithTag(Buffer, 0);
        return v10;
      }
      v17 = Buffer->HighPart;
      if( HighPart >= v7 )
        v17 = v7;
      v10 = ZwReadFile(
              *(HANDLE *)(a1 + 816),
              0i64,
              0i64,
              0i64,
              &IoStatusBlock,
              (char *)Buffer + v11.QuadPart,
              v24 & (v17 - v11.LowPart + v23 - 1),
              &ByteOffset,
              0i64);
      if( v10 < 0 )
        goto LABEL_21;
    }
    if( v4 && HighPart < v7 && HighPart >= 0x178 )
    {
      Buffer[6].LowPart = HighPart;
      if( *(_QWORD *)(a1 + 1288) )
        EtwpAddLastDroppedEvent(a1, (__int64)Buffer, v7);
      if( (_QWORD *)*v2 != v2 || *(_DWORD *)(a1 + 136) )
      {
        LODWORD(FsInformationClass) = 3;
        EtwpAddDebugInfoEvents(a1, (INT64)Buffer, v7, (INT64 *)&Buffer[11], FsInformationClass);
      }
      if( *(_QWORD *)(a1 + 1024) != a1 + 1024 )
        EtwpAddBinaryInfoEvents((_WMI_LOGGER_CONTEXT *)a1, (_WMI_BUFFER_HEADER *)Buffer, v7);
    }
    goto LABEL_16;
  }
  return result;
}

Referenced by:

EtwpBufferingModeFlush
EtwpCreateLogFile
EtwpLogger