MiAllocateKernelStackPages

UINT64 __stdcall MiAllocateKernelStackPages(
        _MMPTE *PointerPte,
        UINT64 NumberOfPages,
        _ETHREAD *StackOwner,
        UINT16 PreferredNode,
        UINT64 StackFlags){
  _ETHREAD *v5; 
  unsigned __int64 v6; 
  _MMPFN *v9; 
  signed __int32 v10; 
  unsigned int v11; 
  UINT64 Page; 
  UINT64 v13; 
  char *v14; 
  UINT64 ValidPte; 
  UINT64 v16; 
  _MMPTE *PteBase; 
  unsigned __int64 v18; 
  UINT64 v19; 
  _MMPFN *v20; 
  UINT64 v21; 
  UINT64 v22; 
  _ETHREAD *CurrentThread; 
  char *v24; 
  unsigned int v25; 
  unsigned int v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  UINT64 SpinCount; 
  BOOL v30; 
  BOOL v31; 
  UINT64 v32; 
  UINT64 v33; 
  INT64 v34[2]; 
  char *v35; 
  UINT64 v36; 
  UINT8 v37; 
  unsigned __int64 v38; 
  char v39; 
  v38 = PreferredNode;
  v5 = StackOwner;
  v6 = NumberOfPages;
  *(_OWORD *)v34 = 0i64;
  if( !StackOwner )
    return 1i64;
  v9 = 0i64;
  v36 = NumberOfPages + 8i64 * (_QWORD)StackOwner;
  MiInitializePageColorBase(0i64, (unsigned int)(StackFlags + 1), (INT64)v34);
  while( 1 )
  {
    v10 = _InterlockedExchangeAdd((volatile signed __int32 *)v34[0], 1u);
    v11 = v34[1] & v10 | HIDWORD(v34[1]);
    Page = MiGetPage((_MI_PARTITION *)PointerPte, v11, 0i64);
    if( Page == -1i64 )
      break;
LABEL_7:
    v14 = (char *)MmGetPfnDb() + 48 * Page;
    *(_QWORD *)v14 = v9;
    v9 = (_MMPFN *)v14;
    v5 = (_ETHREAD *)((char *)v5 - 1);
    if( !v5 )
    {
      ValidPte = MiMakeValidPte(v6, 0i64, 2684354564i64);
      v16 = 0i64;
      v37 = MiLockWorkingSetShared((INT64)&qword_140C4F240);
      HIDWORD(SpinCount) = MiProtectionToCacheAttribute(4ui64);
      v31 = MiPteInShadowRange((UINT64)&v33);
      PteBase = MmGetPteBase();
      while( 1 )
      {
        v35 = *(char **)v14;
        ValidPte ^= (ValidPte ^ (((v14 - (char *)MmGetPfnDb()) / 48) << 12)) & 0xFFFFFFFFF000i64;
        if( !v16 )
          goto LABEL_12;
        if( (v6 & 0xFFF) == 0 )
          break;
LABEL_13:
        v18 = *(_QWORD *)v6;
        v30 = MiPteInShadowRange(v6);
        if( v18 )
          v19 = v18 & 0xFFFFFFFFFFFFFC1Fui64 | 0x80;
        else
          v19 = MiSwizzleInvalidPte(128i64);
        v32 = v19;
        MiSetNonResidentPteHeat(&v32, 0i64);
        v21 = v32;
        *(_QWORD *)v14 &= 0xFFFFFFFFFFFFC00Fui64;
        *((_QWORD *)v14 + 2) = v21 & 0xFFFFFFFFFC00FFFFui64;
        *((_WORD *)v14 + 16) = 1;
        v33 = *(_QWORD *)((char *)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64));
        v22 = (v33 >> 12) & 0xFFFFFFFFFi64;
        *((_QWORD *)v14 + 5) = v22 | *((_QWORD *)v14 + 5) & 0xFFFFFFF000000000ui64;
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        v24 = (char *)MmGetPfnDb() + 48 * v22;
        v25 = *((_DWORD *)CurrentThread + 326);
        if( (v25 & 0x100) != 0 )
          v26 = v25 >> 9;
        else
          LOBYTE(v26) = PsGetPagePriorityThread((__int64)CurrentThread);
        LODWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)v14 + 6, 0x3Fui64) )
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( *((__int64 *)v14 + 3) < 0 );
        }
        MiLockNestedPageAtDpcInline((INT64)v24);
        *((_QWORD *)v24 + 3) ^= (*((_QWORD *)v24 + 3) ^ (*((_QWORD *)v24 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
        _InterlockedAnd64((volatile signed __int64 *)v24 + 3, 0x7FFFFFFFFFFFFFFFui64);
        if( (unsigned __int8)v14[34] >> 6 != HIDWORD(SpinCount) )
          MiChangePageAttribute((INT64)v14, HIDWORD(SpinCount), 1);
        MiSetPfnTbFlushStamp((_MMPFN *)v14, 0i64, 1ui64);
        v27 = *((_QWORD *)v14 + 3);
        v14[35] ^= (v14[35] ^ v26) & 7;
        *((_QWORD *)v14 + 1) = v6;
        *((_QWORD *)v14 + 3) = v27 & 0xC000000000000000ui64 | 1;
        v14[34] = v14[34] & 0xF8 | 6;
        v14[34] |= 0x10u;
        _InterlockedAnd64((volatile signed __int64 *)v14 + 3, 0x7FFFFFFFFFFFFFFFui64);
        v28 = ValidPte;
        if( v30 && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 && (ValidPte & 1) != 0 )
          v28 = ValidPte | 0x8000000000000000ui64;
        *(_QWORD *)v6 = v28;
        MiMarkKernelStack((unsigned __int64 *)v6, v38);
        v14 = v35;
        v6 += 8i64;
        PteBase = MmGetPteBase();
        if( v6 >= v36 )
        {
          if( v16 )
            MiUnlockPageTableInternal((INT64)&qword_140C4F240, v16);
          MiUnlockWorkingSetShared((INT64)&qword_140C4F240, v37);
          return 1i64;
        }
      }
      MiUnlockPageTableInternal((INT64)&qword_140C4F240, v16);
LABEL_12:
      v16 = (UINT64)PteBase + ((v6 >> 9) & 0x7FFFFFFFF8i64);
      MiLockPageTableInternal((INT64)&qword_140C4F240, v16, 0i64);
      goto LABEL_13;
    }
  }
  while( (v39 & 2) == 0 )
  {
    MiWaitForFreePage((_MI_PARTITION *)PointerPte, v13);
    Page = MiGetPage((_MI_PARTITION *)PointerPte, v11, 0i64);
    if( Page != -1i64 )
      goto LABEL_7;
  }
  if( v9 )
  {
    do
    {
      v20 = *(_MMPFN **)v9;
      MiReleaseFreshPage(v9);
      v9 = v20;
    }
    while( v20 );
  }
  return 0i64;
}

Referenced by:

MmCreateKernelStack
MmGrowKernelStackEx