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