RtlWalkFrameChain

NTSTATUS __fastcall RtlWalkFrameChain(INT64 a1, INT64 a2, UINT64 a3){
  unsigned int v4; 
  unsigned int v5; 
  unsigned int v6; 
  char v7; 
  _ETHREAD *CurrentThread; 
  __int64 v9; 
  _KPROFILE_SOURCE v10; 
  UINT64 v11; 
  __int64 v12; 
  NTSTATUS result; 
  int v14; 
  __int64 HighLimit[5]; 
  UINT64 LowLimit; 

  if( (a3 & 0xFFFF00FC) != 0 )
    return 0;
  v4 = a3 & 3;
  if( (unsigned int)a3 >> 8 > 0xFE || (_DWORD)a2 == -1 )
    return 0;
  v14 = (a3 & 2) == 0;
  v5 = v14 + ((unsigned int)a3 >> 8);
  v6 = v14 + a2;
  KeAreInterruptsEnabled(a1, (_BYTE *)a2);
  if( !v7
    || KeGetCurrentIrql() >= 2u
    || (CurrentThread = (_ETHREAD *)KeGetCurrentThread(), (CurrentThread->SameThreadPassiveFlags & 2) != 0)
    || CurrentThread->Win32StartAddress == KiExecuteDpc
    || !MmPhysicalMemoryBlock
    || (v9 = *(_QWORD *)(*(_QWORD *)(*(&stru_140C4DB30 + 267)
                                   + 8i64 * CurrentThread->Tcb.ApcState.Process->Vm.Instance.PartitionId)
                       + 6848i64)) == 0
    || CurrentThread == *(_ETHREAD **)(v9 + 88) )
  {
    if( (v4 & 1) != 0 )
      return 0;
  }
  HighLimit[0] = 0i64;
  LowLimit = 0i64;
  if( !RtlpGetStackLimits(&LowLimit, (UINT64 *)HighLimit) )
    return 0;
  LODWORD(v12) = KeGetCurrentStackPointer(v11, v10);
  if( v12 - LowLimit < 0xE30 )
    return 0;
  result = RtlpWalkFrameChain((VOID **)a1, v6, v4, v5);
  if( result )
    result -= v14;
  return result;
}

Referenced by:

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