ObpStartRuntimeStackTrace

__int64 __fastcall ObpStartRuntimeStackTrace(__int64 a1){
  unsigned int inited; 
  int v3; 
  char PreviousMode; 
  int v5; 
  unsigned __int64 v6; 
  unsigned int i; 
  unsigned int j; 
  unsigned __int16 v9; 
  VOID **PoolWithTag; 
  _ETHREAD *CurrentThread; 
  wchar_t *v13; 
  wchar_t *Buffer; 
  char v15; 
  int v16; 
  _UNICODE_STRING P; 
  __int128 v18; 
  __int128 Src; 
  __int128 v20[4]; 

  memset(v20, 0i64, sizeof(v20));
  inited = 0;
  P = 0i64;
  v3 = 0;
  PreviousMode = KeGetCurrentThread()->PreviousMode;
  v15 = PreviousMode;
  v18 = *(_OWORD *)(a1 + 24);
  Src = *(_OWORD *)(a1 + 8);
  v5 = *(unsigned __int8 *)(a1 + 1);
  v16 = v5;
  if( (_WORD)v18 )
  {
    if( (*(_OWORD *)(a1 + 24) & 1) != 0
      || ((((unsigned __int64)(unsigned __int16)v18 >> 1) % 5) & 0xFFFFFFFFFFFFFFFBui64) != 0 )
    {
      return 3221225485i64;
    }
    v6 = ((unsigned __int64)(unsigned __int16)v18 + 2) / 0xA;
    if( (unsigned int)v6 > 0x10 )
      LODWORD(v6) = 16;
    if( PreviousMode )
    {
      if( (BYTE8(v18) & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)(unsigned __int16)v18 + *((_QWORD *)&v18 + 1) > 0x7FFFFFFF0000i64
        || (unsigned __int64)(unsigned __int16)v18 + *((_QWORD *)&v18 + 1) < *((_QWORD *)&v18 + 1) )
      {
        MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
    for( i = 0; i < (unsigned int)v6; ++i )
    {
      for( j = 0; j < 4; ++j )
        *((_DWORD *)v20 + i) = (*((_DWORD *)v20 + i) << 8) | *(unsigned __int16 *)(*((_QWORD *)&v18 + 1)
                                                                                 + 2i64 * (5 * i - j + 3));
    }
    v3 = 16;
    v5 = v16;
  }
  if( (_WORD)Src )
  {
    if( (Src & 1) != 0 )
      return 3221225485i64;
    if( (unsigned __int16)Src >= 0x80u )
      v9 = 126;
    else
      v9 = Src;
    P.Length = v9;
    PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v9 + 2i64, 1951556175i64);
    P.Buffer = (wchar_t *)PoolWithTag;
    if( !PoolWithTag )
      return 3221225495i64;
    P.MaximumLength = v9 + 2;
    if( v15 )
    {
      if( (BYTE8(Src) & 1) != 0 )
        ExRaiseDatatypeMisalignment();
      if( *((_QWORD *)&Src + 1) + (unsigned __int64)(unsigned __int16)Src > 0x7FFFFFFF0000i64
        || *((_QWORD *)&Src + 1) + (unsigned __int64)(unsigned __int16)Src < *((_QWORD *)&Src + 1) )
      {
        MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
    memmove(PoolWithTag, *((const VOID **)&Src + 1), v9);
    *((_WORD *)PoolWithTag + ((unsigned __int64)v9 >> 1)) = 0;
    v3 |= 0x20u;
    inited = 0;
    v5 = v16;
  }
  if( !v3 )
    return 3221225485i64;
  if( v5 )
    v3 |= 0x40u;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  ExAcquirePushLockExclusiveEx(&stru_140C25A40, 0i64);
  if( (ObpTraceFlags & 0x73) == 0 )
    inited = ObpInitStackAndObjectTables();
  if( (inited & 0x80000000) != 0 )
  {
    if( (_InterlockedExchangeAdd64(&stru_140C25A40._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&stru_140C25A40);
    KeAbPostRelease(&stru_140C25A40);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    Buffer = P.Buffer;
    if( !P.Buffer )
      return inited;
  }
  else
  {
    v13 = stru_140C259D0.Buffer;
    stru_140C259D0 = P;
    *(_OWORD *)dword_140C25940 = v20[0];
    xmmword_140C25950 = v20[1];
    xmmword_140C25960 = v20[2];
    xmmword_140C25970 = v20[3];
    ObpTraceFlags = v3 | ObpTraceFlags & 0xFFFFFF8E | 2;
    dword_140C259F8 = ObpTraceFlags;
    qword_140C259F0 = (unsigned __int64)dword_140C25940 & -(__int64)((ObpTraceFlags & 0x10) != 0);
    qword_140C259C0 = (PCUNICODE_STRING)((unsigned __int64)&stru_140C259D0 & -(__int64)((ObpTraceFlags & 0x20) != 0));
    if( (_InterlockedExchangeAdd64(&stru_140C25A40._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&stru_140C25A40);
    KeAbPostRelease(&stru_140C25A40);
    KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
    if( !v13 )
      return inited;
    Buffer = v13;
  }
  ExFreePoolWithTag(Buffer, 0x7452624Fu);
  return inited;
}

Referenced by:

ObSetRefTraceInformation