RtlWalkFrameChain

UINT64 __stdcall RtlWalkFrameChain(VOID **Callers, UINT64 Count, UINT64 Flags){
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v6; 
  char v7; 
  _ETHREAD *CurrentThread; 
  __int64 v9; 
  KPROFILE_SOURCE v10; 
  UINT64 v11; 
  __int64 v12; 
  UINT64 result; 
  BOOL v14; 
  __int64 HighLimit[5]; 
  UINT64 LowLimit; 
  if( (Flags & 0xFFFF00FC) != 0 )
    return 0i64;
  v4 = Flags & 3;
  if( (unsigned int)Flags >> 8 > 0xFE || (_DWORD)Count == -1 )
    return 0i64;
  v14 = (Flags & 2) == 0;
  v5 = v14 + ((unsigned int)Flags >> 8);
  v6 = v14 + Count;
  KeAreInterruptsEnabled((CHAR)Callers, (_BYTE *)Count);
  if( !v7
    || KeGetCurrentIrql() >= 2u
    || (CurrentThread = (_ETHREAD *)KeGetCurrentThread(), (*((_DWORD *)CurrentThread + 325) & 2) != 0)
    || *((VOID(__stdcall **)(PVOID))CurrentThread + 154) == KiExecuteDpc
    || !MmPhysicalMemoryBlock
    || (v9 = *(_QWORD *)(*(_QWORD *)(qword_140C4E388
                                   + 8i64 * *(unsigned __int16 *)(*((_QWORD *)CurrentThread + 23) + 1838i64))
                       + 6848i64)) == 0
    || CurrentThread == *(_ETHREAD **)(v9 + 88) )
  {
    if( (v4 & 1) != 0 )
      return 0i64;
  }
  HighLimit[0] = 0i64;
  LowLimit = 0i64;
  if( !RtlpGetStackLimits(&LowLimit, (UINT64 *)HighLimit) )
    return 0i64;
  LODWORD(v12) = KeGetCurrentStackPointer(v11, v10);
  if( v12 - LowLimit < 0xE30 )
    return 0i64;
  result = RtlpWalkFrameChain(Callers, v6, v4, v5);
  if( (_DWORD)result )
    return(unsigned int)(result - v14);
  return result;
}

Referenced by:

EtwTimLogRedirectionTrustPolicy
EtwpCovSampCaptureKernelStack
EtwpCovSampCaptureUserStack
EtwpGetStackExtendedHeaderItem
EtwpTraceStackWalk
ExpUpdateDebugInfo
KiDpcWatchdogCaptureStack
PoDiagCaptureUsermodeStack
RtlCaptureStackBackTrace
SepCreateTokenEx
SepDuplicateToken
SepFilterToken
SepGetStackTraceHash