MiBuildReservationCluster

UINT64 __stdcall MiBuildReservationCluster(
        UINT64 *Page,
        _MMPAGING_FILE *PagingFile,
        UINT64 *ClusterSize,
        UINT64 *ChargedPages){
  INT64 v4; 
  __int16 v5; 
  __int64 v6; 
  __int64 v7; 
  UINT64 v8; 
  _MMPFN *PfnDb; 
  INT64 v10; 
  unsigned __int8 *v11; 
  unsigned __int64 v12; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  UINT64 v15; 
  INT64 v16; 
  unsigned int v17; 
  __int64 v18; 
  unsigned __int64 v19; 
  INT64 v20; 
  UNICODE_STRING *v21; 
  PWCHAR v22; 
  int v23; 
  _QWORD *v24; 
  _QWORD *v25; 
  __int64 v26; 
  __int64 v27; 
  INT64 v28; 
  __int64 v29; 
  unsigned __int64 v30; 
  __int64 v31; 
  INT64 updated; 
  unsigned __int64 v33; 
  INT64 v34; 
  int v35; 
  INT64 v36; 
  ULONG_PTR v37; 
  __int64 v38; 
  int v39; 
  unsigned int v40; 
  __int64 v41; 
  unsigned __int64 v42; 
  __int64 v43; 
  INT64 v44; 
  UINT8 *v45; 
  ULONG_PTR v46; 
  __int64 v47; 
  UINT64 *v48; 
  unsigned __int64 v49; 
  unsigned __int64 v50; 
  __int64 v51; 
  int v52; 
  _MMPAGING_FILE *v53; 
  _DWORD *v54; 
  INT64 v56; 
  INT64 v57; 
  INT64 v58; 
  INT64 v59; 
  INT64 v60; 
  INT64 v61; 
  UINT64 *Src; 
  INT64 v63; 
  INT64 a2; 
  int v65; 
  INT64 v66; 
  _MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps; 
  INT64 v68; 
  INT64 v69[2]; 
  __int128 v70; 
  __int64 v71; 
  UINT64 *v72; 
  v72 = Page;
  v4 = *((_QWORD *)PagingFile + 31);
  v5 = *((_WORD *)PagingFile + 102);
  Src = Page;
  v60 = 0i64;
  LODWORD(v61) = 0;
  v71 = 0i64;
  memset(&ReferencedBitmaps, 0, sizeof(ReferencedBitmaps));
  *(_OWORD *)v69 = 0i64;
  v70 = 0i64;
  MiRefPageFileSpaceBitmaps(PagingFile, &ReferencedBitmaps);
  LODWORD(v63) = 0;
  v6 = v5 & 0xF;
  v7 = 5 * v6;
  v8 = *(_QWORD *)(v4 + 40 * v6 + 2832);
  if( v8 == 0xFFFFFFFFFi64 )
  {
LABEL_66:
    v17 = 0;
    LODWORD(v14) = 0;
LABEL_67:
    v48 = Src;
    goto LABEL_68;
  }
  PfnDb = MmGetPfnDb();
  while( 1 )
  {
    v10 = (INT64)PfnDb + 48 * v8;
    v12 = (unsigned __int8)MiLockPageInline(v10);
    if( v8 == *(_QWORD *)(v4 + 8 * v7 + 2832) )
      break;
    _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v12);
LABEL_11:
    v8 = *(_QWORD *)(v4 + 8 * v7 + 2832);
    PfnDb = MmGetPfnDb();
    if( v8 == 0xFFFFFFFFFi64 )
      goto LABEL_66;
  }
  v13 = *(_QWORD *)(v10 + 16);
  if( qword_140C4DC80 && (v13 & 0x10) == 0 )
    v13 &= ~qword_140C4DC80;
  v14 = HIDWORD(v13);
  if( (unsigned int)v14 >= ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
  {
    _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v12);
    goto LABEL_66;
  }
  if( _bittest64((const signed __int64 *)ReferencedBitmaps.AllocationBitmap.Buffer, v14) )
  {
    MiUnlinkPageFromList((_MMPFN *)v10, 0i64);
    v15 = *(_QWORD *)(v10 + 16);
    *(_QWORD *)(v10 + 16) = v15 & 0xFFFFFFFFFFFFFFFDui64;
    MiInsertPageInList((_MMPFN *)v10, 8ui64);
    _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v12);
    MiReleasePageFileInfo(v4, v15, 0, v16, v56, v57, v58, v59, v60, v61, (INT64)Src, v63);
    goto LABEL_11;
  }
  MiReferencePageForModifiedWrite((_MMPFN *)v10, 1u, v11);
  v17 = 1;
  *v72 = v8;
  if( *(_DWORD *)ClusterSize == 1 )
  {
    _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v12);
    goto LABEL_67;
  }
  v18 = *(_QWORD *)(v10 + 16);
  v19 = *(_QWORD *)(v10 + 8) | 0x8000000000000000ui64;
  a2 = *(_QWORD *)(v10 + 40) & 0xFFFFFFFFFi64;
  v66 = (INT64)MmGetPfnDb() + 48 * a2;
  MiLockNestedPageAtDpcInline(v66);
  v20 = v66;
  v21 = *(UNICODE_STRING **)(v66 + 24);
  *(_QWORD *)(v66 + 24) = (unsigned __int64)v21 ^ (((unsigned __int64)&v21->Length + 1) ^ (unsigned __int64)v21) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)(v20 + 24), 0x7FFFFFFFFFFFFFFFui64);
  _InterlockedAnd64((volatile signed __int64 *)(v10 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v12);
  LOBYTE(v23) = MI_PFN_IS_PROTO((UNICODE_STRING *)v10, v21, v20, v22);
  if( v23
    && (!(unsigned int)MiGetPageFileSectionForReservation(v19, (__int64)v69, 0)
     || (LODWORD(v61) = 1, (*(_QWORD *)(v10 + 24) & 0x4000000000000000i64) != 0))
    || (v24 = (_QWORD *)MiReservePtes((INT64)&qword_140C4EC80, 1ui64), v68 = (INT64)v24, (v25 = v24) == 0i64) )
  {
    v48 = Src;
  }
  else
  {
    *v24 = MiMakeValidPte((UINT64)v24, a2, 536870913i64);
    v26 = ((_QWORD)v25 << 25) - ((_QWORD)MmGetPteBase() << 25);
    v27 = 8 * ((v19 >> 3) & 0x1FF);
    v28 = v27 + (v26 >> 16);
    a2 = v28;
    if( (_DWORD)v61 )
      v29 = 8 * ((*((_QWORD *)&v70 + 1) >> 3) & 0x1FFi64);
    else
      v29 = 4088i64;
    v30 = v18 & 0xFFFFFFFFFC00FC1Fui64;
    v31 = (v29 - v27) >> 3;
    updated = v30;
    v33 = v30;
    v65 = *(_DWORD *)ClusterSize;
    if( (unsigned int)v31 >= v65 - 1 )
      LODWORD(v31) = v65 - 1;
    if( qword_140C4DC80 && (v30 & 0x10) == 0 )
      v33 = v30 & ~qword_140C4DC80;
    v34 = HIDWORD(v33);
    if( v34 + (unsigned __int64)(unsigned int)v31 >= ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
      LODWORD(v31) = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap - v34 - 1;
    v35 = v63;
    v36 = v28;
    if( (_DWORD)v31 )
    {
      do
      {
        ++v34;
        v63 = v36 + 8;
        updated = MiUpdatePageFileHighInPte(updated, v34);
        v38 = MiGetPageForWriteCluster((__int64)&ReferencedBitmaps.AllocationBitmap, v37, updated);
        if( v38 == -1 )
          break;
        LODWORD(v31) = v31 - 1;
        ++v17;
        *++v72 = v38;
        if( v38 == qword_140C4EAA8 )
          ++v35;
        if( HIDWORD(v60) == 3 && v17 >= 0x10 )
          break;
        v36 = v63;
      }
      while( (_DWORD)v31 );
      LOWORD(v28) = a2;
    }
    v17 -= v60;
    v39 = v35 - v60;
    v40 = v65 - v17;
    LODWORD(v63) = v39;
    if( (_DWORD)v61 )
      v41 = v27 - 8 * (((unsigned __int64)v70 >> 3) & 0x1FF);
    else
      v41 = v28 & 0xFFF;
    v42 = v30;
    v43 = v41 >> 3;
    if( (unsigned int)v43 >= v40 )
      v43 = v40;
    if( qword_140C4DC80 && (v30 & 0x10) == 0 )
      v42 = v30 & ~qword_140C4DC80;
    v44 = HIDWORD(v42);
    if( (unsigned int)v43 > (unsigned __int64)(v44 - 1) )
      v43 = (unsigned int)(v44 - 1);
    if( (_DWORD)v43 )
    {
      v45 = (UINT8 *)&Src[v43];
      memmove(v45, (UINT8 *)Src, 8i64 * v17);
      do
      {
        --v44;
        a2 -= 8i64;
        v30 = MiUpdatePageFileHighInPte(v30, v44);
        v47 = MiGetPageForWriteCluster((__int64)&ReferencedBitmaps.AllocationBitmap, v46, v30);
        if( v47 == -1 )
          break;
        v45 -= 8;
        LODWORD(v43) = v43 - 1;
        ++v17;
        *(_QWORD *)v45 = v47;
        if( v47 == qword_140C4EAA8 )
          ++v39;
      }
      while( (HIDWORD(v60) != 3 || v17 < 0x10) && (_DWORD)v43 );
      v48 = Src;
      LODWORD(v63) = v39;
      if( Src != (UINT64 *)v45 )
        memmove((UINT8 *)Src, v45, 8i64 * v17);
    }
    else
    {
      v48 = Src;
    }
    v49 = *((_QWORD *)MmGetPfnDb() + 6 * *v48 + 2);
    if( qword_140C4DC80 && (v49 & 0x10) == 0 )
      v49 &= ~qword_140C4DC80;
    v14 = HIDWORD(v49);
    MiReleasePtes((INT64)&qword_140C4EC80, v68, 1ui64);
  }
  v50 = (unsigned __int8)MiLockPageInline(v66);
  MiDecrementShareCount(v66);
  _InterlockedAnd64((volatile signed __int64 *)(v66 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v50);
  if( (_DWORD)v61 )
    MiReleasePageFileSectionInfo((INT64)v69);
LABEL_68:
  v51 = *(unsigned int *)ClusterSize;
  if( v17 < (unsigned int)v51
    && v17
    && v17 + (unsigned __int64)(unsigned int)v14 < ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
  {
    if( (unsigned __int64)(unsigned int)v14 + v51 <= ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
      v52 = *(_DWORD *)ClusterSize;
    else
      v52 = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap - v14;
    v53 = PagingFile;
    v17 += MiAddToReservationCluster(
             (__int64)PagingFile,
             (__int64)&ReferencedBitmaps.AllocationBitmap,
             v52 - v17,
             (unsigned int)v14 + v17,
             &v48[v17],
             &v63);
  }
  else
  {
    v53 = PagingFile;
  }
  v54 = MiDerefPageFileSpaceBitmaps((__int64)v53, &ReferencedBitmaps, 0);
  if( v54 )
    ExFreePoolWithTag(v54, 0);
  *(_DWORD *)ClusterSize = v17;
  *(_DWORD *)ChargedPages = v17 - v63;
  return(unsigned int)v14;
}

Referenced by:

MiGatherPagefilePages