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