MmGrowKernelStackEx

NTSTATUS __stdcall MmGrowKernelStackEx(PVOID CurrentStack, UINT64 CommitSize){
  _ETHREAD *CurrentThread; 
  NTSTATUS v4; 
  __int64 v5; 
  unsigned __int8 CurrentIrql; 
  _MMPTE *PteBase; 
  char *v8; 
  UINT64 v9; 
  _KTHREAD *v10; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v13; 
  bool v14; 
  signed __int32 v15; 
  UINT64 StackFlags; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( *((_QWORD *)CurrentThread + 7) - (*(_QWORD *)(*((_QWORD *)CurrentThread + 5) + 8i64) & 0xFFFFFFFFFFFFFFFEui64) < 0x12000 )
    return -1073741637;
  v4 = 0;
  v5 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(*((_QWORD *)CurrentThread + 68) + 1838i64));
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  PteBase = MmGetPteBase();
  v8 = (char *)PteBase + ((*((_QWORD *)CurrentThread + 6) >> 9) & 0x7FFFFFFFF8i64);
  v9 = (UINT64)PteBase + ((((unsigned __int64)CurrentStack - CommitSize) >> 9) & 0x7FFFFFFFF8i64);
  if( v9 < (unsigned __int64)v8 )
  {
    if( v9 < (unsigned __int64)PteBase + ((*(_QWORD *)(*((_QWORD *)CurrentThread + 5) + 8i64) >> 9) & 0x7FFFFFFFF8i64) )
    {
      ++dword_140C4E8F8;
      v4 = -1073741571;
    }
    else
    {
      v10 = (_ETHREAD *)(((__int64)&v8[-v9 - 8] >> 3) + 1);
      if( (unsigned int)MiChargeResident((ULONG_PTR *)v5, (unsigned __int64)v10, 0i64) )
      {
        LODWORD(StackFlags) = MI_GET_NODE_FROM_VALID_PTE((INT64)MmGetPteBase() + ((*((_QWORD *)CurrentThread + 7) >> 9) & 0x7FFFFFFFF8i64)
                                                                               - 8);
        if( (unsigned int)MiAllocateKernelStackPages(
                             (_MMPTE *)v5,
                             v9,
                             (_KTHREAD *)v10,
                             (unsigned __int16)CurrentThread | 1u,
                             StackFlags) )
        {
          *((_QWORD *)CurrentThread + 6) = (__int64)((v9 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
        }
        else
        {
          if( (ULONG_PTR *)v5 == &MiSystemPartition )
          {
            CurrentPrcb = KeGetCurrentPrcb();
            v13 = *((int *)CurrentPrcb + 8391);
            if( (_DWORD)v13 != -1 )
            {
              if( (unsigned __int64)v10 + v13 <= 0x100 )
              {
                do
                {
                  if( (unsigned __int64)v10 >= 0x80000 )
                    break;
                  v15 = _InterlockedCompareExchange(
                          (volatile signed __int32 *)CurrentPrcb + 8391,
                          v13 + (_DWORD)v10,
                          v13);
                  v14 = (_DWORD)v13 == v15;
                  LODWORD(v13) = v15;
                  if( v14 )
                    goto LABEL_24;
                }
                while( v15 != -1 && (unsigned __int64)v10 + v15 <= 0x100 );
              }
              if( (int)v13 > 192
                && (_DWORD)v13 != -1
                && (_DWORD)v13 == _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, 192, v13) )
              {
                v10 = (_ETHREAD *)((char *)v10 + (int)v13 - 192);
              }
            }
          }
          if( v10 )
            _InterlockedExchangeAdd64((volatile signed __int64 *)(v5 + 7168), (unsigned __int64)v10);
LABEL_24:
          v4 = -1073741670;
        }
      }
      else
      {
        v4 = -1073741801;
      }
    }
  }
  __writecr8(CurrentIrql);
  return v4;
}

Referenced by:

KiExpandKernelStackAndCalloutSwitchStack
KxSwitchKernelStackCallout
MmGrowKernelStack