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