MiInPageSingleKernelStack
VOID __stdcall MiInPageSingleKernelStack(ULONG_PTR Thread, _KERNEL_STACK_SEGMENT *StackInfo){
__int64 v3;
_MMPTE *PteBase;
unsigned __int64 StackBase;
unsigned __int64 v6;
unsigned __int64 v7;
INT64 v8;
UINT64 v9;
__int64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
unsigned __int64 v14;
__int64 *v15;
__int64 v16;
__int64 v17;
__int64 v18;
void *v19;
_MMPFN *v20;
unsigned __int64 v21;
__int64 v22;
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v23;
int v24;
int v25;
UINT64 v26;
UINT64 v27;
UINT64 v28;
__int64 v29;
unsigned __int16 v30;
PVOID BugCheckParameter3;
__int64 v32;
__int64 v33;
UINT64 v34;
unsigned __int64 v35;
PVOID P;
PVOID BugCheckParameter1;
__int64 v38;
_MI_PARTITION *Partition;
unsigned __int64 v40;
_KERNEL_STACK_SEGMENT *v41;
__int64 v42[12];
INT64 v43;
__int64 v44;
v41 = StackInfo;
BugCheckParameter3 = *(PVOID *)&Thread;
v3 = *(_QWORD *)&Thread;
memset(v42, 0i64, sizeof(v42));
PteBase = MmGetPteBase();
v30 = (*(&KiProcessorBlock + *(unsigned int *)(v3 + 588)))->ParentNode->Affinity.Reserved[0];
StackBase = StackInfo->StackBase;
v6 = (unsigned __int64)PteBase + ((StackInfo->StackLimit >> 9) & 0x7FFFFFFFF8i64);
v35 = v6;
v7 = (unsigned __int64)PteBase + (((StackBase - 4096) >> 9) & 0x7FFFFFFFF8i64);
v8 = (INT64)PteBase + (((StackInfo->KernelStack - 8) >> 9) & 0x7FFFFFFFF8i64);
v9 = 0i64;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267)
+ 8i64 * *(unsigned __int16 *)(*(_QWORD *)(v3 + 544) + 1838i64));
if( Partition == &Irp )
{
P = 0i64;
}
else
{
P = MiKernelStackVaToStackNode((_LIST_ENTRY *)(StackBase - 1));
if( !P )
return;
}
MI_READ_PTE_LOCK_FREE(v8);
BugCheckParameter1 = 0i64;
v11 = MiSwizzleInvalidPte(128i64);
if( v10 != v11 )
BugCheckParameter1 = (PVOID)((v10 & 0x800) == 0);
v32 = MiSwizzleInvalidPte(768i64);
v13 = MiSwizzleInvalidPte(992i64);
v14 = v6;
if( v6 <= v7 )
{
v15 = &v44;
while( 1 )
{
LODWORD(v16) = MI_READ_PTE_LOCK_FREE(v14);
if( v16 == v13 || v16 == v11 || v16 == v32 || (v16 & 0x800) != 0 )
{
v12 = 1i64;
}
else
{
v12 = 1i64;
*v15 = 4096i64;
++v9;
*(v15 - 1) = (__int64)((v14 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v15 += 2;
if( v9 == 18 )
{
LABEL_10:
if( v9 > 1 )
{
MiPrefetchVirtualMemory(v9, (INT64)&v43, (CHAR *)1, 45i64);
v12 = 1i64;
}
break;
}
}
v14 += 8i64;
if( v14 > v7 )
goto LABEL_10;
}
}
v33 = 0i64;
v17 = ((v12 + v30) << 57) | 2;
v18 = (__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v19 = (void *)(v12 | (unsigned __int64)v42);
v38 = v17;
v40 = v12 | (unsigned __int64)v42;
v44 = 4096i64;
while( v7 >= v35 )
{
if( (MI_READ_PTE_LOCK_FREE(v7) & 0x3E0) != 992i64 )
KeBugCheckEx(0x1Au, (PVOID)0x3451, (PVOID)v7, BugCheckParameter3, 0i64);
v43 = v18;
v42[3] = 0i64;
v42[4] = 0i64;
LOWORD(v42[0]) = 4;
v42[1] = (__int64)&v43;
v42[2] = 1i64;
v42[5] = (__int64)BugCheckParameter3;
MmAccessFault(v17, (PVOID)v18, 0, v19);
if( (*(_BYTE *)v7 & 1) != 0 )
{
LOBYTE(v24) = MiPteInShadowRange((UINT64)&v34);
v25 = v24;
while( 1 )
{
LODWORD(v26) = MI_READ_PTE_LOCK_FREE(v7);
v34 = v26;
v27 = v26;
v28 = v26;
if( v25 )
v27 = v26;
v20 = &MmGetPfnDb()[(v27 >> 12) & 0xFFFFFFFFFi64];
v21 = MiLockPageInline(v20);
LODWORD(v22) = MI_READ_PTE_LOCK_FREE(v7);
if( v28 == v22 )
break;
_InterlockedAnd64(&v20->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v21);
}
MiSetPfnKernelStack(v20, (unsigned __int64)BugCheckParameter3);
v20->u4._bf_0 = v20->u4._bf_0 & 0x8FFFFFFFFFFFFFFFui64 | 0x2000000000000000i64;
*((_BYTE *)&v20->u3 + 3) = *((_BYTE *)&v20->u3 + 3) & 0xF8 | 5;
v23.Long = MiReleaseWsSwapReservationPfn(v20).u.Long;
_InterlockedAnd64(&v20->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v17 = v38;
__writecr8(v21);
if( v23.Long )
MiReleasePageFileInfo(Partition, (_MMPTE)v23.Long, 0i64);
v7 -= 8i64;
v19 = (void *)v40;
v18 -= 4096i64;
++v33;
}
}
if( P )
MiDeleteKernelStackNode(P);
v29 = (__int64)v41;
if( *(PVOID *)(v41->KernelStack - 8) != BugCheckParameter3 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x77u, BugCheckParameter1, *(PVOID *)(*(_QWORD *)(v29 + 16) - 8i64), 0i64, *(PVOID *)(v29 + 16));
}
}Referenced by:
KiInSwapKernelStacks