KeGetNextKernelStackSegment

UINT8 __stdcall KeGetNextKernelStackSegment(
        _ETHREAD *Thread,
        _KERNEL_STACK_SEGMENT *StackSegment,
        UINT8 FirstEnumeration){
  unsigned __int64 InitialStack; 

  if( FirstEnumeration )
  {
    StackSegment->StackBase = (unsigned __int64)Thread->Tcb.StackBase;
    StackSegment->StackLimit = (unsigned __int64)Thread->Tcb.StackLimit;
    StackSegment->KernelStack = (unsigned __int64)Thread->Tcb.KernelStack;
    StackSegment->InitialStack = (unsigned __int64)Thread->Tcb.InitialStack;
  }
  else
  {
    InitialStack = StackSegment->InitialStack;
    if( !*(_QWORD *)(InitialStack + 16) )
      return 0;
    *StackSegment = *(_KERNEL_STACK_SEGMENT *)(InitialStack + 16);
  }
  return 1;
}

Referenced by:

KeEnumerateKernelStackSegments
KiInSwapKernelStacks
RtlpIsFrameInBoundsEx
RtlpWalkFrameChain