MiStoreWriteModifiedPages

__int64 __fastcall MiStoreWriteModifiedPages(__int64 a1){
  __int64 v1; 
  MDL *v2; 
  unsigned int v3; 
  __int64 v4; 
  INT64 v5; 
  UINT64 v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  char *v9; 
  unsigned int v10; 
  MDL *p_Size; 
  unsigned int v12; 
  _MDL *Next; 
  int v14; 
  unsigned int v15; 
  unsigned int v16; 
  unsigned int v17; 
  int v18; 
  char *v19; 
  unsigned int v20; 
  unsigned int v21; 
  __int64 *v22; 
  __int64 i; 
  unsigned int v24; 
  int v25; 
  UINT64 v26; 
  UINT64 v27; 
  unsigned int v28; 
  int v29; 
  unsigned __int64 v30; 
  UINT64 v31; 
  UINT64 v32; 
  INT64 v33; 
  int v34; 
  struct _SLIST_ENTRY *v35; 
  __int64 v36; 
  int *v37; 
  int v38; 
  int *v39; 
  bool j; 
  unsigned int v41; 
  __int64 v42; 
  UINT64 updated; 
  unsigned int *v44; 
  unsigned int v45; 
  unsigned int v46; 
  unsigned int v47; 
  int v48; 
  int v49; 
  __int64 v50; 
  unsigned int v51; 
  __int64 v52; 
  INT64 k; 
  _QWORD *v54; 
  unsigned __int64 v55; 
  __int64 v56; 
  INT64 v57; 
  unsigned int v58; 
  __int64 v59; 
  unsigned int v60; 
  _DWORD *v61; 
  __int64 result; 
  unsigned __int8 v63; 
  _DWORD *v64; 
  unsigned int SizeOfBitMap; 
  int v66; 
  volatile signed __int64 *v67; 
  unsigned __int64 v68; 
  const GUID *a5; 
  INT64 a5a; 
  const GUID *a6; 
  INT64 a7; 
  INT64 a8; 
  INT64 a9; 
  INT64 a10; 
  INT64 v76; 
  struct _SLIST_ENTRY *ListEntry; 
  unsigned __int8 ListEntrya; 
  INT64 v79; 
  MDL *v80; 
  UINT64 a3; 
  _ETHREAD *CurrentThread; 
  INT64 v83[2]; 
  UINT64 UnbiasedInterruptTime; 
  MDL *v85; 
  MDL *v86; 
  _MI_PAGING_FILE_SPACE_BITMAPS ReferencedBitmaps; 
  unsigned int v89; 
  unsigned int v90; 
  unsigned int v91; 
  v1 = *(_QWORD *)(a1 + 144);
  v2 = (MDL *)(a1 + 208);
  v3 = *(_DWORD *)(a1 + 248) >> 12;
  v4 = a1;
  a3 = 0i64;
  v5 = *(_QWORD *)(v1 + 248);
  *(_OWORD *)v83 = 0i64;
  v79 = 0i64;
  memset(&ReferencedBitmaps.AllocationBitmap, 0, 32);
  v6 = *(unsigned int *)(v5 + 1172);
  v86 = v2;
  HIDWORD(a10) = v3;
  if( (_DWORD)v6 )
  {
    MiStoreLogWriteDisabled(v6, v3);
    result = 3221225626i64;
    --*(_DWORD *)(v5 + 1172);
    return result;
  }
  v7 = *(_QWORD *)(v5 + 8i64 * *(unsigned int *)(v5 + 1156) + 6944);
  v76 = v7;
  if( !*(_QWORD *)(v7 + 24) )
  {
    MiStoreLogFullPagefile();
    return 3221225599i64;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  ReferencedBitmaps.Anchor = 0i64;
  *(_DWORD *)(v4 + 44) = 1;
  LOBYTE(v8) = 17;
  v9 = 0i64;
  v90 = *(_DWORD *)(v7 + 120);
  LODWORD(a10) = 0;
  ListEntry = 0i64;
  v91 = 0;
  v89 = 1;
  UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
  p_Size = v2 + 1;
  v12 = 0;
  v85 = v2 + 1;
LABEL_4:
  v80 = p_Size;
  HIDWORD(a9) = v12;
  while( v12 < v10 )
  {
    Next = p_Size->Next;
    v14 = 1;
    LODWORD(a9) = 1;
    if( p_Size->Next == (_MDL *)qword_140C4EAA8 || !*(_QWORD *)(v7 + 24) )
      goto LABEL_29;
    if( ReferencedBitmaps.Anchor != *(_MI_PAGING_FILE_SPACE_BITMAPS **)(v7 + 112) )
    {
      if( ReferencedBitmaps.Anchor )
      {
        v64 = MiDerefPageFileSpaceBitmaps(v7, &ReferencedBitmaps, 1);
        if( v64 )
          ExFreePoolWithTag(v64, 0);
      }
      MiRefPageFileSpaceBitmaps((_MMPAGING_FILE *)v7, &ReferencedBitmaps);
    }
    v15 = v90;
    v16 = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap - 1;
    v17 = v90 < ReferencedBitmaps.AllocationBitmap.SizeOfBitMap ? v90 : 0;
    v18 = ((__int64)ReferencedBitmaps.AllocationBitmap.Buffer & 4) != 0i64 ? 0x20 : 0;
    v19 = (char *)ReferencedBitmaps.AllocationBitmap.Buffer
        - (((__int64)ReferencedBitmaps.AllocationBitmap.Buffer & 4) != 0i64 ? 4 : 0);
    while( 1 )
    {
      v20 = v16 + v18;
      v21 = v17 + v18;
      if( v16 - v17 == -1 )
      {
        v24 = -1;
      }
      else
      {
        v22 = (__int64 *)&v19[8 * ((unsigned __int64)v21 >> 6)];
        for( i = ((1i64 << (v21 & 0x3F)) - 1) | *v22; i == -1; i = *v22 )
        {
          if( ++v22 > (__int64 *)&v19[8 * ((unsigned __int64)v20 >> 6)] )
            goto LABEL_35;
        }
        _BitScanForward64((unsigned __int64 *)&i, ~i);
        v24 = i + ((unsigned int)(((char *)v22 - v19) >> 3) << 6);
        if( v24 > v20 )
        {
LABEL_35:
          v24 = -1;
          goto LABEL_36;
        }
        if( v24 != -1 )
        {
          v24 -= v18;
          break;
        }
LABEL_36:
        v15 = v90;
      }
      if( !v17 )
        break;
      SizeOfBitMap = v15 + 1;
      if( v15 + 1 > ReferencedBitmaps.AllocationBitmap.SizeOfBitMap )
        SizeOfBitMap = ReferencedBitmaps.AllocationBitmap.SizeOfBitMap;
      v16 = SizeOfBitMap - 1;
      v17 = 0;
    }
    v9 = (char *)MmGetPfnDb() + 48 * (_QWORD)Next;
    v8 = (unsigned __int8)MiLockPageInline((INT64)v9);
    if( (*((_QWORD *)v9 + 3) & 0x4000000000000000i64) != 0 )
      goto LABEL_80;
    v79 = 0i64;
    v25 = MiStoreCheckCandidatePage((UINT64)v9, v24, &a3, v83, (INT64)&v79);
    if( v25 < 0 )
    {
      MiStoreLogNotCandidate((unsigned int)v25, v24, v26, v27, a5, a6);
LABEL_80:
      v14 = 1;
LABEL_29:
      if( (_BYTE)v8 != 17 )
      {
        _InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8((unsigned __int8)v8);
        LOBYTE(v8) = 17;
      }
      if( v14 )
      {
LABEL_34:
        v34 = HIDWORD(a9);
        _bittestandset(*(signed __int32 **)(*(_QWORD *)(v5 + 1272) + 8i64), HIDWORD(a9));
      }
      else
      {
        v34 = HIDWORD(a9);
      }
      v12 = v34 + 1;
      v10 = HIDWORD(a10);
      p_Size = (MDL *)&v80->Size;
      v91 = 0;
      v4 = a1;
      v7 = v76;
      goto LABEL_4;
    }
    _InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
    __writecr8(v8);
    LOBYTE(v8) = 17;
    if( !ListEntry )
    {
      ListEntry = RtlpInterlockedPopEntrySList((PSLIST_HEADER)(v5 + 1232));
      if( !ListEntry )
      {
        LODWORD(v35) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
        ListEntry = v35;
        if( !v35 )
        {
          LODWORD(a10) = 1;
          goto LABEL_34;
        }
      }
    }
    if( (unsigned __int64)(*(_QWORD *)(v76 + 24) - 1i64) < 8 )
      v28 = *(_DWORD *)(v76 + 24) - 1;
    else
      v28 = 8;
    if( v89 )
    {
      if( (unsigned int)MiSufficientAvailablePages(v5, 0x120ui64) )
      {
        v89 &= -(KiQueryUnbiasedInterruptTime(1u) - UnbiasedInterruptTime < 0x2FAF080);
      }
      else
      {
        v89 = 0;
        if( v28 >= 3 )
          v28 = 3;
      }
    }
    v4 = a1;
    _InterlockedIncrement((volatile signed __int32 *)(a1 + 44));
    LODWORD(a8) = v89;
    v29 = MiStoreWriteIssue(
            (INT64)ListEntry,
            (INT64)v9,
            (union MM_STORE_KEY *)&a3,
            (INT64)v83,
            (INT64)ListEntry,
            v79,
            a1,
            a8);
    if( v29 >= 0 )
    {
      LODWORD(a9) = 0;
      ListEntrya = 0;
      v8 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v76 + 232));
      v90 = v24 + 1;
      _bittestandset(*(signed __int32 **)(*(_QWORD *)(v76 + 112) + 16i64), v24);
      --*(_QWORD *)(v76 + 24);
      *(_DWORD *)(v76 + 120) = v24 + 1;
      MiUpdatePagefilePeakUsage((_QWORD *)v76);
      ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v76 + 232));
      __writecr8(v8);
      v30 = (unsigned __int8)MiLockPageInline((INT64)v9);
      v31 = MiCapturePageFileInfoInline((UINT64 *)v9 + 2, 1i64, 1i64);
      *((_QWORD *)v9 + 2) &= ~2ui64;
      v32 = v31;
      MiUpdatePfnBackingStore((INT64)v9, v76, v24, 1i64);
      _InterlockedAnd64((volatile signed __int64 *)v9 + 3, 0x7FFFFFFFFFFFFFFFui64);
      __writecr8(v30);
      LOBYTE(v8) = 17;
      MiReleasePageFileInfo(v5, v32, 2, v33, a5a, (INT64)a6, a7, a8, a9, a10, v76, ListEntrya);
      v14 = a9;
      goto LABEL_29;
    }
    _InterlockedDecrement((volatile signed __int32 *)(a1 + 44));
    if( v29 != -1073740682 )
    {
      v66 = a10;
      if( v29 == -1073741670 )
        v66 = 1;
      LODWORD(a10) = v66;
LABEL_99:
      LODWORD(a6) = ++*(_DWORD *)(v5 + 1176);
      LODWORD(a5a) = v89;
      MiStoreLogWriteIssueFailure((unsigned int)v29, (INT64)v83, v24, v91, a5a, (INT64)a6);
      goto LABEL_34;
    }
    v90 = v24 + 1;
    if( v91 >= v28 )
      goto LABEL_99;
    LODWORD(a5a) = *(_DWORD *)(v5 + 1176);
    MiStoreLogWriteIssueRetry((INT64)v83, v24, v91, v89, a5a);
    v10 = HIDWORD(a10);
    v7 = v76;
    v12 = HIDWORD(a9);
    p_Size = v80;
    ++v91;
  }
  if( (_DWORD)a10 )
    *(_DWORD *)(v5 + 1172) = 32;
  v36 = *(_QWORD *)(v5 + 1272);
  if( *(_DWORD *)v36 )
  {
    if( v10 <= 1 )
    {
      if( v10 == 1 )
      {
        v63 = _bittest(*(const signed __int32 **)(v36 + 8), 0);
        goto LABEL_77;
      }
    }
    else if( *(_DWORD *)v36 >= v10 )
    {
      v37 = *(int **)(v36 + 8);
      v38 = *v37;
      v39 = &v37[(unsigned __int64)(v10 - 1) >> 5];
      if( v37 != v39 )
      {
        for( j = v38 == -1; ; j = *v37 == -1 )
        {
          if( !j )
            goto LABEL_47;
          if( ++v37 == v39 )
            break;
        }
        if( ((0xFFFFFFFF >> ~(v10 - 1)) & *v37) != 0xFFFFFFFF >> ~(v10 - 1) )
        {
          v63 = 0;
LABEL_77:
          if( v63 )
            goto LABEL_74;
          goto LABEL_47;
        }
LABEL_74:
        RtlClearBits(*(RTL_BITMAP **)(v5 + 1272), 0i64, v10);
        *(_DWORD *)(v4 + 44) = 0;
        v60 = -1073740759;
        v59 = (__int64)CurrentThread;
        goto LABEL_67;
      }
      if( (v38 & (0xFFFFFFFF >> (32 - v10))) == 0xFFFFFFFF >> (32 - v10) )
        goto LABEL_74;
    }
  }
LABEL_47:
  v41 = -1;
  v42 = *(_QWORD *)(v4 + 176) >> 12;
  updated = MiTransferSoftwarePte(ZeroPte, *(_QWORD *)(v4 + 144), (unsigned int)v42);
  while( 2 )
  {
    v44 = *(unsigned int **)(v5 + 1272);
    v45 = v41 + 1;
    v46 = *v44;
    v47 = v45 < *v44 ? v45 : 0;
    v48 = *v44 - 1;
    v49 = (v44[2] & 4) != 0i64 ? 0x20 : 0;
    v50 = *((_QWORD *)v44 + 1) - ((*((_QWORD *)v44 + 1) & 4i64) != 0 ? 4 : 0);
    while( 1 )
    {
      v51 = v48 + v49;
      v52 = 1i64;
      k = v47 + v49;
      if( v51 - (_DWORD)k != -1 )
      {
        v54 = (_QWORD *)(v50 + 8 * ((unsigned __int64)(unsigned int)k >> 6));
        v52 = ~*v54 | ((1i64 << ((v47 + v49) & 0x3F)) - 1);
        for( k = -1i64; v52 == -1; v52 = ~*v54 )
        {
          if( (unsigned __int64)++v54 > v50 + 8 * ((unsigned __int64)v51 >> 6) )
            goto LABEL_59;
        }
        v52 = ~v52;
        _BitScanForward64(&v55, v52);
        v41 = v55 + ((unsigned int)(((__int64)v54 - v50) >> 3) << 6);
        if( v41 <= v51 )
          break;
      }
LABEL_59:
      v41 = -1;
LABEL_60:
      if( !v47 )
        goto LABEL_56;
      v58 = v45 + 1;
      if( v45 + 1 > v46 )
        v58 = v46;
      v48 = v58 - 1;
      v47 = 0;
    }
    if( v41 == -1 )
      goto LABEL_60;
    v41 -= v49;
LABEL_56:
    if( v41 != -1 )
    {
      _bittestandreset(*(signed __int32 **)(*(_QWORD *)(v5 + 1272) + 8i64), v41);
      v56 = *((_QWORD *)&v85->Next + v41);
      if( v56 == qword_140C4EAA8 )
      {
        updated = MiUpdatePageFileHighInPte(updated, v41 + (unsigned int)v42);
        MiReleasePageFileInfo(v5, updated, 2, v57, (INT64)a5, (INT64)a6, a7, a8, a9, a10, v76, (INT64)ListEntry);
      }
      else
      {
        v67 = (volatile signed __int64 *)((char *)MmGetPfnDb() + 48 * v56);
        v68 = (unsigned __int8)MiLockPageInline((INT64)v67);
        *((_BYTE *)v67 + 34) |= 0x10u;
        _InterlockedAnd64(v67 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(v68);
      }
      continue;
    }
    break;
  }
  MiStoreUpdatePagefileHash(k, v52, v86, HIDWORD(a10));
  v59 = (__int64)CurrentThread;
  *(_DWORD *)(a1 + 40) |= 0x20u;
  --*(_WORD *)(v59 + 486);
  ++*(_DWORD *)(v5 + 1180);
  KiLeaveGuardedRegionUnsafe(v59);
  MiStoreModifiedWriteDereference(a1);
  v7 = v76;
  v60 = 259;
LABEL_67:
  KeLeaveCriticalRegionThread(v59);
  if( ListEntry )
    MiStoreFreeWriteSupport(ListEntry, (union SLIST_HEADER *)v5);
  if( ReferencedBitmaps.Anchor )
  {
    v61 = MiDerefPageFileSpaceBitmaps(v7, &ReferencedBitmaps, 0);
    if( v61 )
      ExFreePoolWithTag(v61, 0);
  }
  return v60;
}

Referenced by:

MiGatherPagefilePages