EtwpPreserveLogger

INT64 __fastcall EtwpPreserveLogger(INT64 a1){
  __int64 v1; 
  __int64 v4; 
  _QWORD *v5; 
  VOID *PoolWithTag; 
  __int64 v7; 
  int v8; 
  CHAR *TraceBuffer; 
  char *v10; 
  __int128 v11; 
  __int64 v12; 
  __int64 v13; 
  PVOID *v14; 
  __int64 v15; 
  __int128 Src; 
  PVOID P; 
  PVOID *v18; 
  v1 = *(_QWORD *)(a1 + 1072);
  P = 0i64;
  if( *(_BYTE *)(v1 + 33) )
    return 0i64;
  v4 = *(unsigned int *)(a1 + 4);
  v5 = 0i64;
  Src = *(_OWORD *)(v1 + 16);
  if( ((v4 * (unsigned int)(*(_DWORD *)(a1 + 248) + 1)) & 0xFFFFFFFFFFFFF000ui64) > 0xFFFFFFFF000i64 )
    return 3221225659i64;
  PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)(unsigned __int16)Src + 18, 0x4B777445ui64);
  v7 = (__int64)PoolWithTag;
  if( PoolWithTag )
  {
    memset((INT64)PoolWithTag, 0i64);
    *(_DWORD *)(v7 + 8) = *(_DWORD *)(a1 + 4);
    *(_DWORD *)(v7 + 12) = 16;
    memmove((UINT8 *)(v7 + 16), *((UINT8 **)&Src + 1), (unsigned int)(unsigned __int16)Src + 2);
    TraceBuffer = EtwpAllocateTraceBuffer(a1, (unsigned int)v4);
    v10 = TraceBuffer;
    if( !TraceBuffer )
    {
      v8 = -1073741801;
LABEL_23:
      ExFreePoolWithTag((PVOID)v7, 0);
      return(unsigned int)v8;
    }
    EtwpInitializeBufferHeader((__int16 *)a1, TraceBuffer);
    EtwpResetBufferHeader((__int64)v10, 4);
    v11 = *(_OWORD *)(a1 + 168);
    *(_OWORD *)(a1 + 168) = Src;
    EtwpAddLogHeader(a1, (__int64)v10);
    *(_OWORD *)(a1 + 168) = v11;
    v8 = EtwpBuildMdlForTraceBuffer(a1, v10, (struct _MDL **)&P);
    if( v8 >= 0 )
    {
      ++*(_DWORD *)(v7 + 4);
      v12 = *(_QWORD *)(a1 + 96);
      v5 = P;
      v13 = v12 - 56;
      if( v12 == a1 + 96 )
        v13 = 0i64;
      if( v13 )
      {
        v18 = (PVOID *)P;
        while( 1 )
        {
          v8 = EtwpBuildMdlForTraceBuffer(a1, (char *)v13, (struct _MDL **)&P);
          if( v8 < 0 )
            break;
          v14 = v18;
          v18 = (PVOID *)P;
          *v14 = P;
          ++*(_DWORD *)(v7 + 4);
          v15 = *(_QWORD *)(v13 + 56);
          v13 = v15 - 56;
          if( v15 == a1 + 96 )
            v13 = 0i64;
          if( !v13 )
            goto LABEL_18;
        }
      }
      else
      {
LABEL_18:
        v8 = EtwpPreserveMdlList(v5, v7, (unsigned int)(unsigned __int16)Src + 18, v1);
        if( v8 >= 0 )
        {
          *(_QWORD *)(v1 + 8) = v10;
          *(_BYTE *)(v1 + 33) = 1;
          goto LABEL_21;
        }
      }
    }
    EtwpFreeTraceBuffer(a1, v10);
LABEL_21:
    if( v5 )
      ExFreePoolWithTag(v5, 0);
    goto LABEL_23;
  }
  return(unsigned int)-1073741670;
}

Referenced by:

EtwpKsrCallback
EtwpSetSoftRestartInformation