MiMakeOutswappedPageResident

UINT64 __fastcall MiMakeOutswappedPageResident(__int64 a1, __int64 a2, __int64 a3, __int64 a4, INT64 a5){
  __int64 v6; 
  _QWORD *v7; 
  _MMPFN *PfnDb; 
  unsigned __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  UINT64 v13; 
  unsigned __int64 v14; 
  char v15; 
  unsigned __int64 v16; 
  UINT64 v17; 
  INT64 v18; 
  signed __int32 v19; 
  unsigned int v20; 
  UINT64 Page; 
  UINT64 v22; 
  UINT64 v23; 
  char *v24; 
  MMPTE *PxeSelfRef; 
  MMPTE *v26; 
  _MMPTE *PteBase; 
  __int64 v28; 
  __int64 v29; 
  int IsPteInStore; 
  int v31; 
  unsigned int v32; 
  __int64 v33; 
  unsigned int PagingFileOffset; 
  char EntireFlags; 
  __int64 v36; 
  int v37; 
  int v38; 
  unsigned __int8 v39; 
  int Status; 
  unsigned __int8 v41; 
  UINT64 v42; 
  unsigned __int64 v43; 
  INT64 v44; 
  char v45; 
  INT64 v46; 
  UINT64 ValidPte; 
  PLARGE_INTEGER Timeout; 
  PLARGE_INTEGER Timeouta; 
  UINT64 Flags; 
  PVOID IoAttributionContext; 
  INT64 v53; 
  _MI_STORE_INPAGE_COMPLETE_FLAGS OutFlags[2]; 
  _MI_PARTITION *Partition; 
  INT64 a12; 
  __int128 a12_8; 
  void *v58; 
  _QWORD *v59; 
  ULONG_PTR BugCheckParameter2[4]; 
  struct _KEVENT Event; 
  IO_STATUS_BLOCK IoStatusBlock; 
  ULONG_PTR BugCheckParameter4[11]; 
  int v64; 
  int v65; 
  struct _MDL MemoryDescriptorList; 
  __int64 v67; 
  OutFlags[0].EntireFlags = 0;
  LOBYTE(OutFlags[1].EntireFlags) = 0;
  a12_8 = 0i64;
  memset((INT64)BugCheckParameter2, 0i64);
  v6 = *(unsigned __int16 *)(a1 + 1838);
  v7 = (_QWORD *)(a1 + 1432);
  v59 = (_QWORD *)(a1 + 1432);
  Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8 * v6);
  while( 2 )
  {
    PfnDb = MmGetPfnDb();
    do
    {
      do
        v9 = MI_READ_PTE_LOCK_FREE((INT64)v7);
      while( !MiInvalidPteConforms(v9) );
      if( (v10 & 0x800) == 0 )
      {
        MiInitializePageColorBase(0i64, (unsigned int)a5, (INT64)&a12_8);
        v19 = _InterlockedExchangeAdd((volatile signed __int32 *)a12_8, 1u);
        v20 = DWORD2(a12_8) & v19 | HIDWORD(a12_8);
        while( 1 )
        {
          Page = MiGetPage(Partition, v20, 0x200ui64);
          v12 = Page;
          if( Page != -1i64 )
            break;
          MiWaitForFreePage(Partition, v22);
        }
        v24 = (char *)MmGetPfnDb() + 48 * Page;
        *v7 = MiMakeTransitionPte(Page, (v9 >> 5) & 0x1F, v23);
        PxeSelfRef = MmGetPxeSelfRef();
        MiInitializePfnForOtherProcess(v12, PxeSelfRef, v12, 0xA00ui64);
        v26 = (MMPTE *)(v24 + 16);
        *((_QWORD *)v24 + 2) = v9;
        PteBase = MmGetPteBase();
        *((_WORD *)&OutFlags[1].1 + 1) = 8
                                       * (((unsigned __int16)((((unsigned int)(((_DWORD)PxeSelfRef << 25)
                                                                             - ((_DWORD)PteBase << 25)) >> 16) & 0xFFF)
                                                            + 0x1FFF) >> 12)
                                        + 6);
        v28 = ((__int64)(((_QWORD)PxeSelfRef << 25) - ((_QWORD)PteBase << 25)) >> 16) & 0xFFF;
        v58 = (void *)(((__int64)(((_QWORD)PxeSelfRef << 25) - ((_QWORD)PteBase << 25)) >> 16) & 0xFFFFFFFFFFFFF000ui64);
        a12 = v28;
        while( 1 )
        {
          MiInitializeInPageSupport((__int64)BugCheckParameter2, 0);
          v29 = *(_QWORD *)v26;
          v65 |= 0x200000u;
          IsPteInStore = MiIsPteInStore((__int64)Partition, v29);
          v32 = v31 & 0xFFFFFEFF | (IsPteInStore != 0 ? 0x100 : 0);
          v33 = (unsigned __int8)HIBYTE(*(_WORD *)v26) >> 4;
          v65 = v32;
          PagingFileOffset = MiGetPagingFileOffset(v26);
          if( (v32 & 0x100) != 0 )
            BugCheckParameter4[0] = PagingFileOffset | ((unsigned __int64)(unsigned int)v33 << 60);
          else
            BugCheckParameter4[0] = (unsigned __int64)PagingFileOffset << 12;
          MiSetPageTablePfnBuddy((INT64)v24, 0xFFFF800000000030ui64, 0i64);
          EntireFlags = 0;
          MemoryDescriptorList.Size = *((_WORD *)&OutFlags[1].1 + 1);
          MemoryDescriptorList.StartVa = v58;
          MemoryDescriptorList.MdlFlags = 16386;
          MemoryDescriptorList.Next = 0i64;
          MemoryDescriptorList.ByteOffset = v28;
          MemoryDescriptorList.ByteCount = 4096;
          v64 = 4096;
          v67 = v12;
          v36 = *((_QWORD *)Partition + v33 + 868);
          if( (*(_WORD *)(v36 + 204) & 0x800) == 0 )
          {
            if( (v65 & 0x100) != 0 )
            {
              IoStatusBlock.Status = 0;
              IoStatusBlock.Information = 0i64;
              v37 = SmPageRead((union MM_STORE_KEY *)BugCheckParameter4, (UINT64)&MemoryDescriptorList);
            }
            else
            {
              LODWORD(Flags) = 0;
              v37 = IoPageReadEx(
                      *(FILE_OBJECT **)(v36 + 56),
                      &MemoryDescriptorList,
                      (LARGE_INTEGER *)BugCheckParameter4,
                      &Event,
                      &IoStatusBlock,
                      Flags,
                      0i64);
            }
            if( v37 < 0 )
            {
              IoStatusBlock.Status = v37;
              IoStatusBlock.Information = 0i64;
              KeSetEvent(&Event, 0);
            }
          }
          KeWaitForSingleObject(&Event, WrPageIn, 0, 0, 0i64);
          v38 = v65;
          OutFlags[0].EntireFlags = 0;
          if( (v65 & 0x100) != 0 )
          {
            MiStoreFaultComplete((_MMINPAGE_SUPPORT *)BugCheckParameter2, OutFlags);
            v39 = MiLockPageInline((INT64)v24);
            if( *((_WORD *)&OutFlags[0].1 + 1) )
              OutFlags[0].EntireFlags = LOWORD(OutFlags[0].EntireFlags) | ((*((unsigned __int16 *)&OutFlags[0].1 + 1) - 1) << 16);
            _InterlockedAnd64((volatile signed __int64 *)v24 + 3, 0x7FFFFFFFFFFFFFFFui64);
            __writecr8(v39);
            EntireFlags = OutFlags[0].EntireFlags;
            v38 = v65;
          }
          Status = IoStatusBlock.Status;
          if( IoStatusBlock.Status >= 0 && *(_QWORD *)(v36 + 216) )
          {
            v65 = v38 | 0x400000;
            Status = MiValidatePagefilePageHash((__int64)BugCheckParameter2);
          }
          if( (MemoryDescriptorList.MdlFlags & 1) != 0 )
            MmUnmapLockedPages(MemoryDescriptorList.MappedSystemVa, &MemoryDescriptorList);
          MiSetPageTablePfnBuddy((INT64)v24, 0i64, 0i64);
          if( Status >= 0 )
            break;
          if( !(unsigned int)MiIsRetryIoStatus((unsigned int)Status, 0x1000ui64) )
          {
            MiFlushAllFilesystemPages();
            KeBugCheckEx(0x77u, Status, Status, (unsigned int)v33, LODWORD(BugCheckParameter4[0]));
          }
          if( (EntireFlags & 1) != 0 )
          {
            LODWORD(v28) = a12;
            v26 = (MMPTE *)(v24 + 16);
            if( (EntireFlags & 2) == 0 )
              continue;
          }
          KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)MiHalfSecond);
          LODWORD(v28) = a12;
          v26 = (MMPTE *)(v24 + 16);
        }
        if( IoStatusBlock.Information != 4096 )
        {
          MiFlushAllFilesystemPages();
          KeBugCheckEx(0x77u, 2ui64, Status, (unsigned int)v33, LODWORD(BugCheckParameter4[0]));
        }
        v41 = MiLockPageInline((INT64)v24);
        v42 = *((_QWORD *)v24 + 2);
        v43 = v41;
        v44 = MiSwizzleInvalidPte(128i64);
        v45 = v24[34];
        *((_QWORD *)v24 + 2) = v44;
        v24[34] = v45 | 0x10;
        _InterlockedAnd64((volatile signed __int64 *)v24 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v43);
        MiReleasePageFileInfo(
          (INT64)Partition,
          v42,
          0,
          v46,
          (INT64)Timeouta,
          Flags,
          (INT64)IoAttributionContext,
          v53,
          *(INT64 *)&OutFlags[0].EntireFlags,
          (INT64)Partition,
          a12,
          a12_8);
        v7 = v59;
        goto LABEL_50;
      }
      v11 = v10;
      if( qword_140C4DC80 )
      {
        if( (v9 & 0x10) != 0 )
          v11 = v10 & 0xFFFFFFFFFFFFFFEFui64;
        else
          v11 = v10 & ~qword_140C4DC80;
      }
      v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
    }
    while( (*((_QWORD *)MmGetPfnDb() + 6 * v12 + 5) & 0x4000000000000i64) == 0 );
    v13 = (UINT64)PfnDb + 48 * v12;
    v14 = (unsigned __int8)MiLockPageInline(v13);
    if( MI_READ_PTE_LOCK_FREE((INT64)v7) != v9 )
    {
LABEL_14:
      _InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v14);
      continue;
    }
    break;
  }
  if( (*(_BYTE *)(v13 + 34) & 7) == 6 )
  {
    v16 = *(_QWORD *)(v13 + 24) ^ ((*(_QWORD *)(v13 + 24) + 1i64) ^ *(_QWORD *)(v13 + 24)) & 0x3FFFFFFFFFFFFFFFi64;
  }
  else
  {
    if( !(unsigned int)MiUnlinkPageFromList((_MMPFN *)v13, 0i64) )
    {
      MiDiscardTransitionPteEx(v13, 0i64);
      goto LABEL_14;
    }
    v15 = *(_BYTE *)(v13 + 34);
    ++*(_WORD *)(v13 + 32);
    *(_BYTE *)(v13 + 34) = v15 & 0xF8 | 6;
    v16 = *(_QWORD *)(v13 + 24) & 0xC000000000000000ui64 | 1;
  }
  *(_QWORD *)(v13 + 24) = v16;
  v17 = MiCaptureDirtyBitToPfn(v13);
  _InterlockedAnd64((volatile signed __int64 *)(v13 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v14);
  if( v17 )
    MiReleasePageFileInfo(
      (INT64)Partition,
      v17,
      0,
      v18,
      (INT64)Timeout,
      Flags,
      (INT64)IoAttributionContext,
      v53,
      *(INT64 *)&OutFlags[0].EntireFlags,
      (INT64)Partition,
      a12,
      a12_8);
LABEL_50:
  ValidPte = MiMakeValidPte((UINT64)MmGetPxeSelfRef(), v12, 2147483652i64);
  *v7 = ValidPte;
  return ValidPte;
}

Referenced by:

KiInSwapProcesses