MmDeleteKernelStack

VOID __stdcall MmDeleteKernelStack(PVOID PointerKernelStack, UINT64 DeleteFlags){
  unsigned int v2; 
  _MMPTE *PteBase; 
  INT64 v4; 
  UINT64 v5; 
  UINT64 v6; 
  _MMPFN *PfnDb; 
  __int64 v8; 
  __int64 v9; 
  unsigned int v10; 
  UINT64 v11; 
  unsigned __int8 CurrentIrql; 
  INT64 v13; 
  unsigned __int64 v14; 
  struct _KPRCB *CurrentPrcb; 
  __int64 v16; 
  __int64 v17; 
  union _SLIST_HEADER *v18; 
  INT64 v19; 
  unsigned __int8 v20; 
  int v21; 
  int v22; 
  INT64 v23; 
  unsigned __int64 v24; 
  __int64 *v25; 
  unsigned __int64 v26; 
  _MMPFN *v27; 
  char *v28; 
  unsigned __int64 v29; 
  __int64 v30; 
  int v31; 
  UINT8 *v32; 
  int i; 
  int v34; 
  UINT64 v35; 
  unsigned __int64 v36; 
  __int64 v37; 
  UINT64 v38; 
  UINT64 v39; 
  INT64 v40; 
  __int64 v41; 
  UINT64 SpinCount; 
  unsigned int v43; 
  unsigned __int64 v44; 
  UINT64 v45; 
  v43 = DeleteFlags;
  v35 = 0i64;
  v2 = DeleteFlags;
  PteBase = MmGetPteBase();
  v4 = (INT64)PteBase + (((unsigned __int64)PointerKernelStack >> 9) & 0x7FFFFFFFF8i64) - 8;
  v40 = v4;
  v5 = *(_QWORD *)v4;
  v38 = *(_QWORD *)v4;
  v6 = v38;
  MiPteInShadowRange((UINT64)&v38);
  PfnDb = MmGetPfnDb();
  if( *(ULONG_PTR **)(qword_140C4E388
                     + 8 * ((*((_QWORD *)PfnDb + 6 * ((v6 >> 12) & 0xFFFFFFFFFi64) + 5) >> 39) & 0x3FFi64)) != &MiSystemPartition
    || (v2 & 1) != 0 )
  {
LABEL_56:
    MiDeleteKernelStack((_MMPTE *)v4, v2);
    return;
  }
  v39 = v5;
  MiPteInShadowRange((UINT64)&v39);
  LODWORD(v8) = MiSearchNumaNodeTable((PVOID)((__int64)(48 * ((v5 >> 12) & 0xFFFFFFFFFi64)) / 48));
  v9 = 0i64;
  v37 = 0i64;
  v10 = *(_DWORD *)(v8 + 8);
  LODWORD(v44) = v10;
  if( (v2 & 4) == 0 )
    goto LABEL_18;
  MiPteInShadowRange((UINT64)&v35);
  while( 1 )
  {
    v35 = MI_READ_PTE_LOCK_FREE(v4);
    v11 = (UINT64)PfnDb + 48 * ((v35 >> 12) & 0xFFFFFFFFFi64);
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(v11 + 24), 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *(__int64 *)(v11 + 24) < 0 );
    }
    v13 = MI_READ_PTE_LOCK_FREE(v4);
    if( v35 == v13 )
      break;
    _InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(CurrentIrql);
  }
  v14 = (*(_QWORD *)v11 & 0xFFFFFFFFFFEi64) != 0 ? 8 * (*(_QWORD *)v11 & 0xFFFFFFFFFFEi64 | 0xFFFFF00000000000ui64) : 0i64;
  _InterlockedAnd64((volatile signed __int64 *)(v11 + 24), 0x7FFFFFFFFFFFFFFFui64);
  v10 = v44;
  __writecr8(CurrentIrql);
  PteBase = MmGetPteBase();
  v9 = 0i64;
  v37 = 0i64;
  if( v14 != -32i64 )
  {
LABEL_18:
    v17 = 176i64 * v10;
    v41 = v17;
    while( 1 )
    {
      v18 = (PSLIST_HEADER)((char *)SListHead + 32 * v9 + v17);
      if( *(_WORD *)v18 < *((int *)v18 + 4) )
      {
        v19 = ((v4 << 25) - ((_QWORD)PteBase << 25)) >> 16;
        *(_QWORD *)(v19 + 0xFE0) = v19 ^ qword_140C4EC08;
        if( v9 == 1 )
        {
          RtlpInterlockedPushEntrySList(v18, (PSLIST_ENTRY)(v19 + 4080));
          return;
        }
        v20 = KeGetCurrentIrql();
        __writecr8(2ui64);
        v21 = 1;
        v36 = 0i64;
        v22 = -1;
        v23 = v4 - 8i64 * (unsigned __int8)byte_140C4E8FC;
        v24 = v23 + 8i64 * ((unsigned int)(unsigned __int8)byte_140C4E8FC + 1);
        v25 = (__int64 *)(v23 + 8);
        v44 = v24;
        if( (unsigned __int64)v25 >= v24 )
          goto LABEL_53;
        do
        {
          v36 = *v25;
          v26 = v36;
          if( (v36 & 1) != 0 )
          {
            v27 = MmGetPfnDb();
            v28 = (char *)v27 + 48 * ((v36 >> 12) & 0xFFFFFFFFFi64);
            LODWORD(v45) = 0;
            if( _interlockedbittestandset64((volatile signed __int32 *)v28 + 6, 0x3Fui64) )
            {
              do
              {
                do
                  KeYieldProcessorEx(&v45);
                while( *((__int64 *)v28 + 3) < 0 );
              }
              while( _interlockedbittestandset64((volatile signed __int32 *)v28 + 6, 0x3Fui64) );
              v27 = MmGetPfnDb();
            }
            if( v26 == *v25 )
            {
              v29 = (v28 - (char *)v27) / 48;
              if( v22 == -1 )
              {
                LODWORD(v30) = MiSearchNumaNodeTable((PVOID)((v28 - (char *)v27) / 48));
                v22 = *(_DWORD *)(v30 + 8);
              }
              else
              {
                v31 = dword_140C4DBC8;
                if( dword_140C4DBC4 > (unsigned int)dword_140C4DBC8
                  || (v32 = &qword_140C4DC08[16 * dword_140C4DBC4], v29 < *(_QWORD *)v32)
                  || dword_140C4DBC4 != dword_140C4DBC8 && v29 >= *((_QWORD *)v32 + 2) )
                {
                  for( i = 0; ; i = v34 + 1 )
                  {
                    while( 1 )
                    {
                      if( v31 < i )
                        KeBugCheckEx(0x1Au, 0x6201ui64, v29, 0i64, 0i64);
                      v34 = (i + v31) >> 1;
                      v32 = &qword_140C4DC08[16 * v34];
                      if( v29 >= *(_QWORD *)v32 )
                        break;
                      if( !v34 )
                        KeBugCheckEx(0x1Au, 0x6200ui64, v29, (ULONG_PTR)v32, 0i64);
                      v31 = v34 - 1;
                    }
                    if( v34 == dword_140C4DBC8 || v29 < *((_QWORD *)v32 + 2) )
                      break;
                  }
                  dword_140C4DBC4 = (i + v31) >> 1;
                }
                if( v22 != *((_DWORD *)v32 + 2) )
                  v21 = 0;
              }
              *(_QWORD *)v28 &= 0xFFFFF00000000001ui64;
              ++v25;
            }
            _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
          }
          else
          {
            ++v25;
          }
        }
        while( (unsigned __int64)v25 < v44 );
        if( v21 == 1 )
        {
LABEL_53:
          RtlpInterlockedPushEntrySList(v18, (PSLIST_ENTRY)(v19 + 4080));
          __writecr8(v20);
          return;
        }
        __writecr8(v20);
        v9 = v37;
        v4 = v40;
      }
      if( v9 != 1 )
        break;
      v17 = v41;
      v9 = 0i64;
      PteBase = MmGetPteBase();
      v37 = 0i64;
    }
    v2 = v43;
    goto LABEL_56;
  }
  CurrentPrcb = KeGetCurrentPrcb();
  if( *(unsigned __int16 *)(*((_QWORD *)CurrentPrcb + 24) + 146i64) != (_DWORD)v44
    || *((_QWORD *)CurrentPrcb + 4065)
    || (v16 = ((v4 << 25) - ((_QWORD)PteBase << 25)) >> 16,
        *(_QWORD *)(v16 + 4064) = v16 ^ qword_140C4EC08,
        _InterlockedCompareExchange64((volatile signed __int64 *)CurrentPrcb + 4065, v16 + 4080, 0i64)) )
  {
    v9 = 1i64;
    v37 = 1i64;
    goto LABEL_18;
  }
}

Referenced by:

KeAllocateCalloutStackEx
KeFreeCalloutStack
KeStartAllProcessors
KeUserModeCallback
KiExpandKernelStackAndCalloutOnStackSegment
KiStartDynamicProcessor
PspDeleteKernelStack
PspInsertThread