MmCreateKernelStack
VOID *__stdcall MmCreateKernelStack(UINT64 StackFlags, UINT16 PreferredNode, _ETHREAD *StackOwner){
__int64 v3;
unsigned int v4;
_MI_PARTITION *v5;
_EPROCESS *Process;
unsigned __int64 v7;
unsigned int v8;
unsigned int v9;
__int64 i;
__int64 v11;
__int16 v12;
PSLIST_ENTRY v13;
_SLIST_ENTRY *Next;
unsigned __int64 v15;
_SLIST_ENTRY *v16;
_MMPTE *PteBase;
UINT64 *v18;
__int64 v19;
unsigned __int64 v20;
_MMPFN *PfnDb;
UINT64 v22;
INT64 v23;
struct _KPRCB *CurrentPrcb;
__int64 v26;
void *v27;
__int64 v28;
void *v29;
UINT64 v30;
_MMPTE *v31;
_MMPTE *v32;
_MMPTE *v33;
_KTBFLUSH_TYPE v34;
unsigned __int64 v35;
__int64 v36;
struct _KPRCB *v37;
__int64 CachedResidentAvailable;
bool v39;
signed __int32 v40;
UINT64 StackFlagsa;
unsigned __int8 CurrentIrql;
int v43;
UINT64 NumberOfPages;
UINT64 v45;
UINT16 PreferredNodea[4];
unsigned int v47;
UINT64 SpinCount;
v47 = StackFlags;
v3 = PreferredNode;
v45 = 0i64;
v4 = StackFlags;
v5 = &Irp;
if( (StackFlags & 0x10) != 0 )
{
v7 = -32i64;
*(_QWORD *)PreferredNodea = -32i64;
if( StackOwner )
v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * StackOwner->Tcb.Process->Vm.Instance.PartitionId);
}
else if( StackOwner )
{
Process = StackOwner->Tcb.Process;
v7 = (unsigned __int64)StackOwner;
*(_QWORD *)PreferredNodea = StackOwner;
v5 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * Process->Vm.Instance.PartitionId);
}
else
{
v7 = -16i64;
*(_QWORD *)PreferredNodea = -16i64;
}
if( (StackFlags & 1) != 0 )
{
v8 = 18;
v36 = 18i64;
v43 = 18;
if( (StackFlags & 4) == 0 )
v36 = 6i64;
NumberOfPages = v36;
}
else
{
v8 = *(&stru_140C4DB30 + 3532);
v43 = *(&stru_140C4DB30 + 3532);
NumberOfPages = *(&stru_140C4DB30 + 3532);
if( (StackFlags & 0x10) != 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
v9 = 1;
if( CurrentPrcb->ParentNode->Affinity.Reserved[0] == (_DWORD)v3 )
{
if( CurrentPrcb->CachedStack )
{
v26 = _InterlockedExchange64((volatile __int64 *)&CurrentPrcb->CachedStack, 0i64);
if( v26 )
{
v27 = *(void **)(v26 - 16);
v28 = v26 - 4080;
v29 = (void *)((v26 - 4080) ^ *(&stru_140C4DB30 + 539));
if( v27 != v29 )
KeBugCheckEx(0x1Au, (PVOID)0x3470, (PVOID)v28, v27, v29);
return(VOID *)((__int64)(((v28 & 0xFFFFFFFFFFFFF000ui64) << 16) + 0x10000000) >> 16);
}
}
}
}
else
{
v9 = 0;
}
if( v5 == &Irp )
{
for( i = v9; ; i = 0i64 )
{
v11 = *(&stru_140C4DB30 + 22) + 176 * v3 + 32 * i;
v12 = *(_WORD *)v11;
if( *(_WORD *)v11 )
{
if( i == 1 )
{
CurrentIrql = 17;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
}
v13 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)v11);
if( v13 )
{
if( v12 == 1 && !*(_DWORD *)(v11 + 28) )
*(_DWORD *)(v11 + 28) = 1;
Next = v13[-1].Next;
v15 = (unsigned __int64)&v13[-255];
v16 = (_SLIST_ENTRY *)((unsigned __int64)&v13[-255] ^ *(&stru_140C4DB30 + 539));
if( Next != v16 )
KeBugCheckEx(0x1Au, (PVOID)0x3470, (PVOID)v15, Next, v16);
PteBase = MmGetPteBase();
v18 = (unsigned __int64 *)((char *)&PteBase->u.Long + ((v15 >> 9) & 0x7FFFFFFFF8i64));
v19 = (((_QWORD)v18 << 25) - ((_QWORD)PteBase << 25) + 0x10000000i64) >> 16;
*(_QWORD *)PreferredNodea = v19;
if( v9 != 1 )
{
v20 = (unsigned __int64)&v18[-*(&stru_140C4DB30 + 3532) + 1];
MiPteInShadowRange((UINT64)&v45);
PfnDb = MmGetPfnDb();
do
{
v22 = *v18;
v45 = v22;
v23 = (INT64)&PfnDb[(v22 >> 12) & 0xFFFFFFFFFi64];
LODWORD(SpinCount) = 0;
if( _interlockedbittestandset64((volatile signed __int32 *)(v23 + 24), 0x3Fui64) )
{
do
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v23 + 24) < 0 );
}
while( _interlockedbittestandset64((volatile signed __int32 *)(v23 + 24), 0x3Fui64) );
PfnDb = MmGetPfnDb();
}
if( v22 == *v18 )
{
*(_QWORD *)v23 ^= (*(_QWORD *)v23 ^ (v7 >> 3)) & 0xFFFFFFFFFFEi64;
if( (*(_BYTE *)v23 & 1) == 0 )
MiMarkPfnTradable(v23, 1i64);
--v18;
PfnDb = MmGetPfnDb();
}
_InterlockedAnd64((volatile signed __int64 *)(v23 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
while( (unsigned __int64)v18 >= v20 );
v19 = *(_QWORD *)PreferredNodea;
__writecr8(CurrentIrql);
}
return(VOID *)v19;
}
if( i != 1 )
__writecr8(CurrentIrql);
}
++*(_DWORD *)(v11 + 20);
if( i != 1 )
{
v4 = v47;
v8 = v43;
break;
}
v9 = 0;
}
}
}
v30 = v8;
if( MiChargeCommit(v5, v8, (v4 >> 1) & 1) )
{
v31 = MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 3432), (unsigned int)(v43 + 1));
v32 = v31;
if( !v31 )
{
LABEL_70:
MiReturnCommit(v5, v30);
return 0i64;
}
v33 = v31;
v19 = (__int64)(((_QWORD)v31 << 25) + ((v30 + 1) << 28) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
if( (v4 & 5) == 1 )
v33 = v31 + 12;
if( MiChargeResident((ULONG_PTR *)&v5->Core.PartitionId, NumberOfPages, 0i64) )
{
LODWORD(StackFlagsa) = v3;
v35 = NumberOfPages;
if( MiAllocateKernelStackPages(
(PVOID *)v5,
(UINT64)&v33[1],
(_KTHREAD *)NumberOfPages,
PreferredNodea[0],
StackFlagsa) )
{
if( v5 == &Irp )
_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 571, v30);
return(VOID *)v19;
}
if( v5 == &Irp )
{
v37 = KeGetCurrentPrcb();
CachedResidentAvailable = (int)v37->CachedResidentAvailable;
if( (_DWORD)CachedResidentAvailable != -1 )
{
if( NumberOfPages + CachedResidentAvailable <= 0x100 )
{
do
{
v40 = _InterlockedCompareExchange(
(volatile signed __int32 *)&v37->CachedResidentAvailable,
CachedResidentAvailable + NumberOfPages,
CachedResidentAvailable);
v39 = (_DWORD)CachedResidentAvailable == v40;
LODWORD(CachedResidentAvailable) = v40;
if( v39 )
goto LABEL_69;
}
while( v40 != -1 && NumberOfPages + v40 <= 0x100 );
}
if( (int)CachedResidentAvailable > 192
&& (_DWORD)CachedResidentAvailable != -1
&& (_DWORD)CachedResidentAvailable == _InterlockedCompareExchange(
(volatile signed __int32 *)&v37->CachedResidentAvailable,
192,
CachedResidentAvailable) )
{
v35 = (int)CachedResidentAvailable - 192 + NumberOfPages;
}
}
}
if( v35 )
_InterlockedExchangeAdd64((volatile signed __int64 *)&v5->Vp.ResidentAvailablePages, v35);
}
LABEL_69:
MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 3432), v32, (unsigned int)(v43 + 1), v34);
goto LABEL_70;
}
return 0i64;
}Referenced by:
KeAllocateCalloutStackEx
KeStartAllProcessors
KeUserModeCallback
KiExpandKernelStackAndCalloutOnStackSegment
KiStartDynamicProcessor