EtwpTraceStackWalk

void __fastcall EtwpTraceStackWalk(__int64 a1, unsigned int a2, __int64 a3, _QWORD *a4){
  int v6; 
  int v7; 
  KPROFILE_SOURCE v8; 
  UINT64 v9; 
  PSLIST_ENTRY StackLookasideListEntry; 
  __int64 v11; 
  void *v12; 
  unsigned int v13; 
  int v14; 
  unsigned int v15; 
  UINT64 v16; 
  unsigned int v17; 
  unsigned int v18; 
  PVOID *v19; 
  unsigned int v20; 
  unsigned int v21; 
  unsigned int v22; 
  unsigned int v23; 
  bool v24; 
  UINT64 v25; 
  UINT64 v26; 
  PVOID *StackTrace; 
  UINT64 FrameCount; 
  char v29; 
  _KERNEL_STACK_LIMITS Type; 
  UINT64 LowLimit; 
  UINT64 HighLimit; 
  __int64 v33; 
  _QWORD *v34; 
  __int128 v35; 
  __int64 v36; 
  EVENT_DATA_DESCRIPTOR EventData; 
  PSLIST_ENTRY v38; 
  unsigned int v39; 
  int v40; 
  v33 = a3;
  Type = BugcheckStackLimits;
  LowLimit = 0i64;
  HighLimit = 0i64;
  v34 = a4;
  v36 = 0i64;
  v35 = 0i64;
  if( !KeQueryCurrentStackInformation(&Type, &LowLimit, &HighLimit) )
    return;
  if( (unsigned int)Type <= MachineCheckStackLimits )
  {
    v6 = 929;
    if( _bittest(&v6, Type) )
      return;
  }
  v7 = 256;
  StackLookasideListEntry = EtwpGetStackLookasideListEntry();
  if( !StackLookasideListEntry )
  {
    LODWORD(v11) = KeGetCurrentStackPointer(v9, v8);
    if( v11 - LowLimit <= 0x1438 )
      return;
    v12 = alloca(1536i64);
    StackLookasideListEntry = (PSLIST_ENTRY)&v29;
    v7 = 192;
  }
  v13 = 0;
  v14 = 0;
  if( (*(_DWORD *)(a1 + 832) & 0x40000000) == 0 )
    goto LABEL_10;
  if( (a2 & 0x800) != 0 )
  {
    v13 = 1;
    StackLookasideListEntry->Next = (_SLIST_ENTRY *)PsNtosImageBase;
    a2 &= ~0x800u;
LABEL_10:
    if( (a2 & 0x800) != 0 )
    {
      v15 = (a2 >> 20) & 0xF;
      v16 = (v15 << 8) | 2;
      if( (a2 & 0x2000000) == 0 )
        v16 = ((a2 >> 20) & 0xF) << 8;
      v17 = RtlWalkFrameChain((VOID **)&StackLookasideListEntry->Next, v15 + v7, v16);
      if( v17 > v15 )
        v13 = v17 - v15;
      else
        v13 = 0;
    }
  }
  if( (a2 & 0x1000) != 0 )
  {
    v18 = v7 - v13;
    v19 = (PVOID *)(&StackLookasideListEntry->Next + v13);
    if( *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2240i64) )
    {
      v14 = PsPicoWalkUserStack(v19, v18);
    }
    else
    {
      v20 = HIWORD(a2) & 0xF;
      v21 = RtlWalkFrameChain(v19, v18 + v20, (v20 << 8) | 1);
      if( v21 > v20 )
        v14 = v21 - v20;
      else
        v14 = 0;
    }
  }
  v22 = v13 + v14;
  if( v22 )
  {
    v23 = a2 & 0xFFFFE600 | 2;
    *(_QWORD *)&EventData.Size = 16i64;
    v24 = (*(_DWORD *)(a1 + 832) & 0x1000000) == 0;
    DWORD2(v35) = *(_DWORD *)(v33 + 1144);
    HIDWORD(v35) = *(_DWORD *)(v33 + 1152);
    *(_QWORD *)&v35 = *v34;
    EventData.Ptr = (unsigned __int64)&v35;
    if( v24
      || v22 < 4
      || (LODWORD(FrameCount) = v22,
          !EtwpTraceStackKey(
             a1,
             v23,
             6182 - (v13 != 0),
             &EventData,
             (PVOID *)&StackLookasideListEntry->Next,
             FrameCount)) )
    {
      v25 = *(unsigned int *)a1;
      v26 = *(_QWORD *)(a1 + 1080);
      v39 = 8 * v22;
      LODWORD(FrameCount) = v23;
      LOWORD(StackTrace) = 6176;
      v38 = StackLookasideListEntry;
      v40 = 0;
      EtwpLogKernelEvent(&EventData, v26, v25, 2u, (UINT64)StackTrace, FrameCount);
    }
  }
  if( v7 == 256 )
    RtlpInterlockedPushEntrySList((PSLIST_HEADER)&EtwpStackLookAsideList, StackLookasideListEntry - 1);
}

Referenced by:

EtwpStackTraceDispatcher
EtwpStackWalkApc