MiInPageSingleKernelStack
VOID __stdcall MiInPageSingleKernelStack(_ETHREAD *Thread, _KERNEL_STACK_SEGMENT *StackInfo){
_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;
volatile signed __int64 *v20;
unsigned __int64 v21;
UINT64 v22;
INT64 v23;
BOOL v24;
INT64 v25;
unsigned __int64 v26;
INT64 v27;
__int64 v28;
ULONG_PTR BugCheckParameter4;
INT64 v30;
INT64 v31;
_ETHREAD *BugCheckParameter3;
INT64 a9;
INT64 a9a;
UINT64 v35;
unsigned __int64 v36;
PVOID P;
ULONG_PTR BugCheckParameter1;
__int64 v39;
INT64 a1;
unsigned __int64 v41;
_KERNEL_STACK_SEGMENT *v42;
INT64 result[12];
INT64 v44;
__int64 v45;
v42 = StackInfo;
BugCheckParameter3 = Thread;
memset((INT64)result, 0i64);
PteBase = MmGetPteBase();
LOWORD(v31) = *(_WORD *)(*((_QWORD *)*(&KiProcessorBlock + *((unsigned int *)Thread + 147)) + 24) + 146i64);
StackBase = StackInfo->StackBase;
v6 = (unsigned __int64)PteBase + ((StackInfo->StackLimit >> 9) & 0x7FFFFFFFF8i64);
v36 = v6;
v7 = (unsigned __int64)PteBase + (((StackBase - 4096) >> 9) & 0x7FFFFFFFF8i64);
v8 = (INT64)PteBase + (((StackInfo->KernelStack - 8) >> 9) & 0x7FFFFFFFF8i64);
v9 = 0i64;
a1 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(*((_QWORD *)Thread + 68) + 1838i64));
if( (ULONG_PTR *)a1 == &MiSystemPartition )
{
P = 0i64;
}
else
{
P = MiKernelStackVaToStackNode(StackBase - 1);
if( !P )
return;
}
MI_READ_PTE_LOCK_FREE(v8);
BugCheckParameter1 = 0i64;
v11 = MiSwizzleInvalidPte(128i64);
if( v10 != v11 )
BugCheckParameter1 = (v10 & 0x800) == 0;
a9 = MiSwizzleInvalidPte(768i64);
v13 = MiSwizzleInvalidPte(992i64);
v14 = v6;
if( v6 <= v7 )
{
v15 = &v45;
while( 1 )
{
v16 = MI_READ_PTE_LOCK_FREE(v14);
if( v16 == v13 || v16 == v11 || v16 == a9 || (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)&v44, (CHAR *)1, 45i64);
v12 = 1i64;
}
break;
}
}
v14 += 8i64;
if( v14 > v7 )
goto LABEL_10;
}
}
a9a = 0i64;
v17 = ((v12 + (unsigned __int16)v31) << 57) | 2;
v18 = (__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
v19 = (void *)(v12 | (unsigned __int64)result);
v39 = v17;
v41 = v12 | (unsigned __int64)result;
v45 = 4096i64;
while( v7 >= v36 )
{
if( (MI_READ_PTE_LOCK_FREE(v7) & 0x3E0) != 992 )
KeBugCheckEx(0x1Au, 0x3451ui64, v7, (ULONG_PTR)BugCheckParameter3, 0i64);
v44 = v18;
result[3] = 0i64;
result[4] = 0i64;
LOWORD(result[0]) = 4;
result[1] = (INT64)&v44;
result[2] = 1i64;
result[5] = (INT64)BugCheckParameter3;
MmAccessFault(v17, (PVOID)v18, 0, v19);
if( (*(_BYTE *)v7 & 1) != 0 )
{
v24 = MiPteInShadowRange((UINT64)&v35);
while( 1 )
{
v25 = MI_READ_PTE_LOCK_FREE(v7);
v35 = v25;
v26 = v25;
v27 = v25;
if( v24 )
v26 = v25;
v20 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * ((v26 >> 12) & 0xFFFFFFFFFi64));
v21 = (unsigned __int8)MiLockPageInline((INT64)v20);
if( v27 == MI_READ_PTE_LOCK_FREE(v7) )
break;
_InterlockedAnd64(v20 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v21);
}
MiSetPfnKernelStack(v20, (UINT64)BugCheckParameter3);
*((_QWORD *)v20 + 5) = v20[5] & 0x8FFFFFFFFFFFFFFFui64 | 0x2000000000000000i64;
*((_BYTE *)v20 + 35) = *((_BYTE *)v20 + 35) & 0xF8 | 5;
v22 = MiReleaseWsSwapReservationPfn((INT64)v20);
_InterlockedAnd64(v20 + 3, 0x7FFFFFFFFFFFFFFFui64);
v17 = v39;
__writecr8(v21);
if( v22 )
MiReleasePageFileInfo(
a1,
v22,
0,
v23,
BugCheckParameter4,
v30,
v31,
(INT64)BugCheckParameter3,
a9a,
v35,
v36,
(INT64)P);
v7 -= 8i64;
v19 = (void *)v41;
v18 -= 4096i64;
++a9a;
}
}
if( P )
MiDeleteKernelStackNode(P);
v28 = (__int64)v42;
if( *(_ETHREAD **)(v42->KernelStack - 8) != BugCheckParameter3 )
{
MiFlushAllFilesystemPages();
KeBugCheckEx(0x77u, BugCheckParameter1, *(_QWORD *)(*(_QWORD *)(v28 + 16) - 8i64), 0i64, *(_QWORD *)(v28 + 16));
}
}Referenced by:
KiInSwapKernelStacks