KeQueryCurrentStackInformationEx

BOOL __fastcall KeQueryCurrentStackInformationEx(UINT64 a1, _DWORD *a2, CHAR **a3, UINT64 *a4){
  _DWORD *v6; 
  unsigned __int8 CurrentIrql; 
  CHAR *CurrentPrcb; 
  char v10; 
  _ETHREAD *CurrentThread; 
  char v12; 
  CHAR *v13; 
  CHAR *v14; 
  CHAR *v15; 
  UINT64 v16; 
  UINT64 v17; 
  UINT64 v19; 
  v6 = a2;
  if( !KiRecoveryInProgress && (KiBugCheckActive & 3) != 0 )
  {
    *a2 = 0;
    LODWORD(v13) = 1;
    *a4 = -1i64;
    *a3 = (CHAR *)0xFFFF800000000000i64;
    return(int)v13;
  }
  CurrentIrql = KeGetCurrentIrql();
  if( CurrentIrql >= 2u )
  {
    v13 = (CHAR *)*((_QWORD *)KeGetPcr() + 4331);
    v14 = v13 - 24576;
    if( a1 < (unsigned __int64)v13 && (unsigned __int64)v14 <= a1 )
    {
      *a2 = 6;
      *a4 = (UINT64)v13;
      LOBYTE(v13) = 1;
      *a3 = v14;
      return(int)v13;
    }
    v13 = (CHAR *)(*((_QWORD *)KeGetPcr() + 4117) + 80i64);
    v15 = v13 - 24576;
    if( a1 < (unsigned __int64)v13 && (unsigned __int64)v15 <= a1 )
    {
      *a2 = 10;
      *a4 = (UINT64)v13;
      LOBYTE(v13) = 1;
      *a3 = v15;
      return(int)v13;
    }
  }
  else
  {
    KeAreInterruptsEnabled(a1, a2);
    if( v10 )
      goto LABEL_5;
  }
  v13 = (CHAR *)(*((_QWORD *)KeGetPcr() + 4117) + 80i64);
  CurrentPrcb = v13 - 24576;
  if( a1 < (unsigned __int64)v13 && (unsigned __int64)CurrentPrcb <= a1 )
  {
    *v6 = 10;
    *a4 = (UINT64)v13;
    LOBYTE(v13) = 1;
    *a3 = CurrentPrcb;
    return(int)v13;
  }
LABEL_5:
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( *((_QWORD *)CurrentThread + 5) != *((_QWORD *)KeGetPcr() + 53) )
  {
    *v6 = 5;
    goto LABEL_37;
  }
  if( CurrentIrql < 2u )
  {
LABEL_7:
    KeAreInterruptsEnabled((CHAR)CurrentPrcb, a2);
    if( v12 && KeGetCurrentIrql() < 0xFu )
      goto LABEL_9;
    if( KiRspInIstStack(3ui64, a1) )
    {
      *v6 = 8;
    }
    else
    {
      if( !KiRspInIstStack(2ui64, v17) )
      {
LABEL_9:
        if( (*((_DWORD *)CurrentThread + 29) & 0x1000) != 0 )
        {
          *v6 = 2;
        }
        else if( *((_BYTE *)CurrentThread + 731) )
        {
          *v6 = 4;
        }
        else
        {
          *v6 = 3;
        }
        v19 = *((_QWORD *)CurrentThread + 7);
        v13 = (CHAR *)*((_QWORD *)CurrentThread + 6);
        *a4 = v19;
        *a3 = v13;
        if( (unsigned __int64)v13 > a1 || a1 >= *a4 )
        {
          LOBYTE(v13) = 0;
          return(int)v13;
        }
        goto LABEL_14;
      }
      *v6 = 9;
    }
    goto LABEL_37;
  }
  LODWORD(v13) = KeKernelStackSize;
  v16 = *((_QWORD *)KeGetPcr() + 1618) + 80i64;
  a2 = (_DWORD *)(v16 - (unsigned int)KeKernelStackSize);
  if( (unsigned __int64)a2 > a1 || a1 >= v16 )
  {
    CurrentPrcb = (CHAR *)KeGetCurrentPrcb();
    if( CurrentPrcb != (CHAR *)KiDebuggerOwner )
      goto LABEL_7;
    *v6 = 7;
LABEL_37:
    LODWORD(v13) = 0;
    *a4 = -1i64;
    *a3 = (CHAR *)0xFFFF800000000000i64;
    goto LABEL_14;
  }
  *v6 = 1;
  *a4 = v16;
  *a3 = (CHAR *)a2;
LABEL_14:
  LOBYTE(v13) = 1;
  return(int)v13;
}

Referenced by:

KeCheckStackAndTargetAddress
KeQueryCurrentStackInformation
KiExpandKernelStackAndCalloutOnStackSegment
KiExpandKernelStackAndCalloutSwitchStack
RtlpGetStackLimits
RtlpGetStackLimitsEx