MiReservePageFileSpace

VOID __stdcall MiReservePageFileSpace(_MI_PARTITION *Partition, _MMPTE *PointerPte, _MMSUPPORT_INSTANCE *WsInfo){
  __int32 bf_0; 
  unsigned int v5; 
  _MMVAD *v6; 
  __int64 v7; 
  _MMVAD *Address; 
  __int64 v9; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  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;} v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  _MMPTE *v16; 
  int v17; 
  _MMPTE *Long; 
  unsigned int v19; 
  INT64 v20; 
  _MMPTE *v21; 
  int v22; 
  INT64 v23; 
  _MMPTE *v24; 
  __int64 v25; 
  int v26; 
  unsigned int v27; 
  int v28; 
  unsigned int v29; 
  NTSTATUS FreePageFileSpace; 
  _MMPTE *v31; 
  char v32; 
  _MMPTE *i; 
  int v34; 
  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;} v35; 
  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;} v36; 
  unsigned __int64 v37; 
  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;} v38; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  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;} v41; 
  int v42; 
  __int64 v43; 
  __int64 v44; 
  unsigned int v45; 
  __int64 v46; 
  int v47; 
  unsigned int v48; 
  int v49; 
  int v50; 
  unsigned int v51; 
  int v52; 
  _MMPTE PageFileInfo; 
  INT64 v54; 
  INT64 v55; 
  _MI_PAGEFILE_SECTION_RESERVE_INFO Info[4]; 
  __int128 v57; 
  __int64 v58; 
  _MMSUPPORT_INSTANCE *v60; 

  v60 = WsInfo;
  *(_OWORD *)Info = 0i64;
  v58 = 0i64;
  bf_0 = Partition->Modwriter.ModWriteData.ReservationClusterInfo._bf_0;
  v5 = bf_0 & 0x3FF;
  v57 = 0i64;
  if( v5 >= 0x10 )
  {
    v6 = 0i64;
    v52 = 0;
    if( !WsInfo )
    {
      v17 = 1;
      MiGetPageFileSectionForReservation(PointerPte, Info, 1ui64);
      if( !v42 )
        return;
      v16 = (_MMPTE *)*((_QWORD *)&v57 + 1);
      PageFileInfo.u.Long = v57;
      v52 = 1;
      goto LABEL_14;
    }
    if( (WsInfo->Flags._bf_0 & 7) != 0 )
    {
      PageFileInfo.u.Long = (unsigned __int64)PointerPte & 0xFFFFFFFFFFFFF000ui64;
      v16 = (_MMPTE *)(((unsigned __int64)PointerPte & 0xFFFFFFFFFFFFF000ui64) + 4088);
      v17 = 1;
LABEL_15:
      Long = (_MMPTE *)PageFileInfo.u.Long;
      v19 = ((__int64)((__int64)v16 - PageFileInfo.u.Long) >> 3) + 1;
      if( v19 > v5 )
      {
        v43 = v16 - PointerPte;
        v44 = (__int64)((__int64)PointerPte - PageFileInfo.u.Long) >> 3;
        v45 = v19 - v5;
        if( (unsigned int)v43 < v45 )
        {
          v47 = v45 - v43;
          v46 = 0i64;
          LODWORD(v44) = v44 - v47;
        }
        else
        {
          v46 = (unsigned int)v43 - v45;
        }
        v16 = &PointerPte[v46];
        Long = &PointerPte[-(unsigned int)v44];
        PageFileInfo.u.Long = (unsigned __int64)Long;
      }
      if( WsInfo )
        v17 = 129;
      if( v6 && (v6->Core.u1.LongFlags1 & 0x80000000) != 0 )
        v17 |= (v6->Core.u.LongFlags & 0xF80 | 0x40) >> 5;
      v20 = 0i64;
      v21 = PointerPte - 1;
      v22 = 0;
      v54 = 0i64;
      v50 = 0;
      if( &PointerPte[-1] >= Long )
      {
        do
        {
          if( !(unsigned int)MiReservePageFileSpaceForPage(Partition, (unsigned __int64)v21, v17, (UINT64 *)&v54) )
            break;
          ++v22;
          --v21;
        }
        while( (unsigned __int64)v21 >= PageFileInfo.u.Long );
        v20 = v54;
        v50 = v22;
      }
      v23 = 0i64;
      v24 = PointerPte + 1;
      v25 = 0i64;
      v55 = 0i64;
      if( &PointerPte[1] <= v16 )
      {
        do
        {
          if( !(unsigned int)MiReservePageFileSpaceForPage(Partition, (unsigned __int64)v24, v17, (UINT64 *)&v55) )
            break;
          v25 = (unsigned int)(v25 + 1);
          ++v24;
        }
        while( v24 <= v16 );
        v23 = v55;
      }
      v26 = v50;
      v27 = v25 + v50 + 1;
      v51 = v27;
      if( v20 )
      {
        v37 = v20;
        if( *(&stru_140C4DB30 + 42) && (v20 & 0x10) == 0 )
          v37 = v20 & ~*(&stru_140C4DB30 + 42);
        LODWORD(v38.Long) = MiUpdatePageFileHighInPte(v20, HIDWORD(v37) + 1);
        PageFileInfo.u.Long = v38.Long;
      }
      else
      {
        if( !v23 )
          goto LABEL_31;
        v39 = v23;
        v40 = v23;
        if( *(&stru_140C4DB30 + 42) && (v23 & 0x10) == 0 )
          v39 = v23 & ~*(&stru_140C4DB30 + 42);
        if( v27 < HIDWORD(v39) )
        {
          if( *(&stru_140C4DB30 + 42) && (v23 & 0x10) == 0 )
            v40 = ~*(&stru_140C4DB30 + 42) & v23;
          LODWORD(v41.Long) = MiUpdatePageFileHighInPte(v23, HIDWORD(v40) - v27);
          PageFileInfo.u.Long = v41.Long;
        }
        else
        {
LABEL_31:
          PageFileInfo.u.Long = 0i64;
        }
      }
      if( MI_IS_PTE_IN_WS_SWAP_SET((_MMPTE *)Partition) )
      {
        PageFileInfo.u.Long = 0i64;
        v28 = 16;
      }
      if( v29 == 1 )
      {
        if( v28 )
          goto LABEL_47;
        v28 = 64;
      }
      FreePageFileSpace = MiFindFreePageFileSpace(Partition, &PageFileInfo, v29, v28 | 1u);
      if( FreePageFileSpace == v51 )
        goto LABEL_36;
      _InterlockedCompareExchange(
        &Partition->Modwriter.ModWriteData.ReservationClusterInfo._bf_0,
        bf_0 ^ ((unsigned __int16)FreePageFileSpace ^ (unsigned __int16)bf_0) & 0x3FF,
        bf_0);
      if( FreePageFileSpace )
      {
        v48 = v51 - FreePageFileSpace;
        if( (unsigned int)v25 < v51 - FreePageFileSpace )
        {
          v49 = v48 - v25;
          v25 = 0i64;
          v26 -= v49;
        }
        else
        {
          v25 = (unsigned int)v25 - v48;
        }
LABEL_36:
        v31 = &PointerPte[v25];
        v32 = v17 & 0xFE;
        for( i = &PointerPte[-v26];
              i <= v31;
              PageFileInfo.u.Long = MiSwizzleInvalidPte((v35.Long + 0x100000000i64) ^ (unsigned int)(LODWORD(v35.Long) ^ LODWORD(v36.Long))) )
        {
          v34 = MiReservePageFileSpaceForPage(Partition, (unsigned __int64)i, v32, &PageFileInfo.u.Long);
          v35.Long = PageFileInfo.u.Long;
          if( !v34 )
            MiReleasePageFileInfo(Partition, PageFileInfo, v60 != 0i64);
          v36.Long = v35.Long;
          if( *(&stru_140C4DB30 + 42) && (v35.Long & 0x10) == 0 )
            v35.Long &= ~*(&stru_140C4DB30 + 42);
          if( v36.Long && *(&stru_140C4DB30 + 42) )
          {
            if( (v36.Long & 0x10) != 0 )
              LODWORD(v36.Long) &= ~0x10u;
            else
              LODWORD(v36.Long) &= ~*(&stru_140C4DB30 + 84);
          }
          ++i;
        }
      }
LABEL_47:
      if( v52 )
        MiReleasePageFileSectionInfo(Info);
      return;
    }
    v7 = (__int64)(((_QWORD)PointerPte << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    Address = MiLocateAddress((VOID *)v7);
    v6 = Address;
    if( Address )
    {
      v10.LongFlags = (unsigned int)Address->Core.u;
      if( (v10.LongFlags & 0x70) == 0
        && (v10.LongFlags & 0x100004) == 0x100000
        && ((v10.LongFlags & 0x100000) == 0 || (v10.LongFlags & 0x400000) == 0 && (v10.LongFlags & 0xC0000) < 0x80000) )
      {
        v11 = v7 & 0xFFFFFFFFFFE00000ui64;
        if( v11 >= (Address->Core.StartingVpn | ((unsigned __int64)Address->Core.StartingVpnHigh << 32)) << 12 )
          v12 = (v11 >> 9) & 0x7FFFFFFFF8i64;
        else
          v12 = 8
              * ((Address->Core.StartingVpn | ((unsigned __int64)Address->Core.StartingVpnHigh << 32)) & 0xFFFFFFFFFi64);
        v13.Long = v12 + v9;
        v14 = v11 + 2093056;
        v15 = Address->Core.EndingVpn | ((unsigned __int64)Address->Core.EndingVpnHigh << 32);
        PageFileInfo.u.Long = v13.Long;
        if( v14 <= v15 << 12 )
        {
          v16 = (_MMPTE *)(v9 + ((v14 >> 9) & 0x7FFFFFFFF8i64));
          PageFileInfo.u.Long = v13.Long;
        }
        else
        {
          v16 = (_MMPTE *)(v9 + 8 * (v15 & 0xFFFFFFFFFi64));
        }
        v17 = 1;
LABEL_14:
        WsInfo = v60;
        goto LABEL_15;
      }
    }
  }
}

Referenced by:

MiFillNoReservationCluster
MiWsleFlush