MiFlushSectionInternal

__int64 __fastcall MiFlushSectionInternal(
        ULONG_PTR a1,
        __int64 a2,
        __int64 *a3,
        __int64 a4,
        __int64 a5,
        unsigned int a6,
        __int64 a7){
  int v9; 
  int v10; 
  __int64 v11; 
  struct _MDL *v12; 
  bool v13; 
  __int64 v14; 
  __int64 *v15; 
  ULONG_PTR v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  _MMPFN *v22; 
  unsigned __int8 v23; 
  int v24; 
  unsigned __int64 v25; 
  unsigned __int64 v26; 
  __int64 v27; 
  char *v28; 
  unsigned __int64 v29; 
  char v30; 
  unsigned int *p_ByteCount; 
  unsigned int v32; 
  int v33; 
  unsigned __int64 v34; 
  int v35; 
  ULONG_PTR *v36; 
  int v37; 
  int v38; 
  unsigned int v39; 
  struct _KPRCB *CurrentPrcb; 
  signed __int32 v41; 
  signed __int32 v42; 
  int v43; 
  int v44; 
  char v45; 
  unsigned int ByteOffset; 
  unsigned int v47; 
  unsigned int v48; 
  int v49; 
  __int64 v50; 
  INT64 v51; 
  UINT64 v52; 
  UINT64 v53; 
  PVOID v54; 
  __int64 v55; 
  INT64 v56; 
  IO_STATUS_BLOCK *v57; 
  __int64 v58; 
  __int64 v59; 
  __int64 v60; 
  __int64 v61; 
  unsigned __int64 v62; 
  MDL *v63; 
  UINT64 v64; 
  IO_STATUS_BLOCK *v65; 
  INT64 Status; 
  INT64 *v67; 
  int v68; 
  int v69; 
  int v70; 
  __int64 v71; 
  MDL *v72; 
  __int64 v73; 
  __int64 v74; 
  __int64 v75; 
  __int64 v76; 
  __int64 v77; 
  __int64 v78; 
  _QWORD *v79; 
  ULONG_PTR *v80; 
  unsigned __int64 v81; 
  struct _KPRCB *v82; 
  __int64 v83; 
  signed __int32 v84; 
  unsigned __int64 v85; 
  union _LARGE_INTEGER *v86; 
  __int16 v87; 
  int v88; 
  IO_STATUS_BLOCK *IoStatus; 
  UINT *v90; 
  char PageIrql[4]; 
  int v92; 
  _MMPFN *ProtoPagePfn; 
  ULONG_PTR v94; 
  __int64 v95; 
  int v96; 
  IO_STATUS_BLOCK *v97; 
  int v98; 
  PVOID P; 
  UINT64 v100; 
  unsigned __int64 v101; 
  UINT8 WsIrql[4]; 
  int IoPriorityThread; 
  __int64 v104; 
  unsigned int v105; 
  __int64 v106; 
  __int64 *v107; 
  PEX_SPIN_LOCK SpinLock; 
  PVOID v109; 
  FILE_OBJECT *FileObject; 
  INT64 v111; 
  __int64 *v112; 
  UINT64 SpinCount; 
  PVOID OpaqueContext; 
  ULONG_PTR *v115; 
  ULONG_PTR v116; 
  _ETHREAD *CurrentThread; 
  unsigned __int64 v118; 
  ULONG_PTR BugCheckParameter1; 
  __int64 v120; 
  __int64 *v121; 
  INT64 result[24]; 
  __int64 v123[18]; 
  v121 = a3;
  BugCheckParameter1 = a1;
  v104 = a5;
  v97 = (IO_STATUS_BLOCK *)a7;
  *(_DWORD *)WsIrql = 0;
  PageIrql[0] = 0;
  v112 = (__int64 *)a4;
  memset((INT64)result, 0i64);
  v9 = a6;
  v10 = 0;
  if( (a6 & 2) == 0 )
    v10 = 2;
  if( a5 )
  {
    v9 = a6 | 4;
    a6 |= 4u;
  }
  v11 = *a3;
  v109 = 0i64;
  v106 = 0i64;
  v12 = (struct _MDL *)result;
  P = result;
  v13 = (*(_DWORD *)(v11 + 56) & 0x40000000) == 0;
  v111 = v11;
  if( !v13 )
  {
    v9 &= ~4u;
    a6 = v9;
  }
  if( (v9 & 4) != 0 )
  {
    LODWORD(v75) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
    v76 = v104;
    v77 = v75;
    v109 = (PVOID)v75;
    if( v104 )
    {
      *(_QWORD *)(v104 + 40) = v75;
      if( !v75 )
        return 3221225626i64;
    }
    else if( !v75 )
    {
      goto LABEL_8;
    }
    *(_WORD *)(v75 + 48) = 0;
    v78 = v75 + 48;
    *(_BYTE *)(v75 + 50) = 6;
    v12 = (struct _MDL *)(v75 + 80);
    v106 = v75;
    *(_DWORD *)(v75 + 52) = 0;
    v79 = (_QWORD *)(v75 + 56);
    v79[1] = v79;
    *v79 = v79;
    *(_DWORD *)v77 = 0;
    *(_QWORD *)(v77 + 16) = 0i64;
    *(_QWORD *)(v77 + 40) = v76;
    *(_QWORD *)(v77 + 32) = v11;
    *(_QWORD *)(v77 + 72) = v12;
    *(_QWORD *)(v77 + 2112) = v78;
    *(_WORD *)(v77 + 312) = 0;
    *(_BYTE *)(v77 + 314) = 6;
    *(_DWORD *)(v77 + 316) = 0;
    *(_QWORD *)(v77 + 328) = v77 + 320;
    *(_QWORD *)(v77 + 320) = v77 + 320;
    *(_QWORD *)(v77 + 336) = v77 + 344;
    *(_DWORD *)(v77 + 264) = 0;
    *(_QWORD *)(v77 + 280) = 0i64;
    *(_QWORD *)(v77 + 304) = v76;
    *(_QWORD *)(v77 + 296) = v11;
    *(_QWORD *)(v77 + 2120) = v77 + 312;
    *(_WORD *)(v77 + 576) = 0;
    *(_BYTE *)(v77 + 578) = 6;
    *(_DWORD *)(v77 + 580) = 0;
    *(_QWORD *)(v77 + 592) = v77 + 584;
    *(_QWORD *)(v77 + 584) = v77 + 584;
    *(_QWORD *)(v77 + 600) = v77 + 608;
    *(_DWORD *)(v77 + 528) = 0;
    *(_QWORD *)(v77 + 544) = 0i64;
    *(_QWORD *)(v77 + 568) = v76;
    *(_QWORD *)(v77 + 560) = v11;
    *(_QWORD *)(v77 + 2128) = v77 + 576;
    *(_WORD *)(v77 + 840) = 0;
    *(_BYTE *)(v77 + 842) = 6;
    *(_DWORD *)(v77 + 844) = 0;
    *(_QWORD *)(v77 + 856) = v77 + 848;
    *(_QWORD *)(v77 + 848) = v77 + 848;
    *(_QWORD *)(v77 + 864) = v77 + 872;
    *(_DWORD *)(v77 + 792) = 0;
    *(_QWORD *)(v77 + 808) = 0i64;
    *(_QWORD *)(v77 + 832) = v76;
    *(_QWORD *)(v77 + 824) = v11;
    *(_QWORD *)(v77 + 2136) = v77 + 840;
    *(_WORD *)(v77 + 1104) = 0;
    *(_BYTE *)(v77 + 1106) = 6;
    *(_DWORD *)(v77 + 1108) = 0;
    *(_QWORD *)(v77 + 1120) = v77 + 1112;
    *(_QWORD *)(v77 + 1112) = v77 + 1112;
    *(_QWORD *)(v77 + 1128) = v77 + 1136;
    *(_DWORD *)(v77 + 1056) = 0;
    *(_QWORD *)(v77 + 1072) = 0i64;
    *(_QWORD *)(v77 + 1096) = v76;
    *(_QWORD *)(v77 + 1088) = v11;
    *(_QWORD *)(v77 + 2144) = v77 + 1104;
    *(_WORD *)(v77 + 1368) = 0;
    *(_BYTE *)(v77 + 1370) = 6;
    *(_DWORD *)(v77 + 1372) = 0;
    *(_QWORD *)(v77 + 1384) = v77 + 1376;
    *(_QWORD *)(v77 + 1376) = v77 + 1376;
    *(_DWORD *)(v77 + 1320) = 0;
    P = v12;
    *(_QWORD *)(v77 + 1336) = 0i64;
    *(_QWORD *)(v77 + 1392) = v77 + 1400;
    *(_QWORD *)(v77 + 1360) = v76;
    *(_QWORD *)(v77 + 1352) = v11;
    *(_QWORD *)(v77 + 2152) = v77 + 1368;
    *(_WORD *)(v77 + 1632) = 0;
    *(_BYTE *)(v77 + 1634) = 6;
    *(_DWORD *)(v77 + 1636) = 0;
    *(_QWORD *)(v77 + 1648) = v77 + 1640;
    *(_QWORD *)(v77 + 1640) = v77 + 1640;
    *(_QWORD *)(v77 + 1656) = v77 + 1664;
    *(_DWORD *)(v77 + 1584) = 0;
    *(_QWORD *)(v77 + 1600) = 0i64;
    *(_QWORD *)(v77 + 1624) = v76;
    *(_QWORD *)(v77 + 1616) = v11;
    *(_QWORD *)(v77 + 2160) = v77 + 1632;
    *(_WORD *)(v77 + 1896) = 0;
    *(_BYTE *)(v77 + 1898) = 6;
    *(_DWORD *)(v77 + 1900) = 0;
    *(_QWORD *)(v77 + 1912) = v77 + 1904;
    *(_QWORD *)(v77 + 1904) = v77 + 1904;
    *(_QWORD *)(v77 + 1920) = v77 + 1928;
    *(_DWORD *)(v77 + 1848) = 0;
    *(_QWORD *)(v77 + 1864) = 0i64;
    *(_QWORD *)(v77 + 1888) = v76;
    *(_QWORD *)(v77 + 1880) = v11;
    *(_QWORD *)(v77 + 2168) = v77 + 1896;
  }
LABEL_8:
  v118 = a2 + 8;
  FileObject = MiReferenceControlAreaFile((_CONTROL_AREA *)v11);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  IoPriorityThread = PsGetIoPriorityThread((__int64)CurrentThread);
  if( IoPriorityThread < 2
    && (*(_DWORD *)(v14 + 116) & 0x400) == 0
    && *(_BYTE *)(v14 + 562) != 1
    && *((_QWORD *)KeGetCurrentThread() + 152) != 2i64 )
  {
    IoPriorityThread = 2;
  }
  if( v9 < 0 )
    v10 |= 0x10u;
  v107 = a3;
  *(_DWORD *)a7 = 0;
  v15 = a3;
  v16 = BugCheckParameter1;
  *(_QWORD *)(a7 + 8) = 0i64;
  v12->Next = 0i64;
  v12->MdlFlags = 0;
  v12->StartVa = 0i64;
  *(_QWORD *)&v12->ByteCount = 0i64;
  --*(_WORD *)(v14 + 484);
  v92 = 16;
  v98 = 0;
  v96 = 1;
  v95 = 0i64;
  v94 = v16;
  SpinLock = (PEX_SPIN_LOCK)(v11 + 72);
  v17 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v11 + 72));
  if( !*(_QWORD *)(v11 + 32) )
  {
    ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v11 + 72));
    __writecr8(v17);
    if( v109 )
    {
      ExFreePoolWithTag(v109, 0);
      if( v104 )
        *(_QWORD *)(v104 + 40) = 0i64;
    }
    MiDereferenceControlAreaFile(v11, (unsigned __int64)FileObject);
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
    v58 = 0i64;
    *(_DWORD *)a7 = 0;
    *(_QWORD *)(a7 + 8) = 0i64;
    return v58;
  }
  v18 = *(_QWORD *)(v11 + 120);
  OpaqueContext = (PVOID)(8 * v18);
  if( 8 * v18 && _InterlockedIncrement64((volatile signed __int64 *)(8 * v18 + 32)) <= 1 )
    __fastfail(0xEu);
  v100 = 0i64;
  v19 = 0i64;
  v20 = (__int64)v112;
  while( 1 )
  {
LABEL_14:
    if( v15 == (__int64 *)v20 )
    {
      v21 = v118;
    }
    else
    {
      v21 = v15[1] + 8i64 * (*((_DWORD *)v15 + 11) - (*((_DWORD *)v15 + 13) & 0x3FFFFFFFu));
      v20 = (__int64)v112;
    }
    v101 = v21;
    if( !v16 )
    {
      v16 = v15[1];
      v94 = v16;
    }
    if( *((_DWORD *)v15 + 26) && v15[1] )
      break;
    v19 += (__int64)(v21 - v16) >> 3 << 12;
    v74 = v15[2];
    v95 = v19;
    if( !v74 )
    {
      if( v21 == v15[1] + 8i64 * (*((_DWORD *)v15 + 11) - (*((_DWORD *)v15 + 13) & 0x3FFFFFFFu)) )
      {
        v87 = MiEndingOffset((_SUBSECTION *)v15);
        v50 = v95;
        v53 = v100;
        v88 = v87 & 0xFFF;
        if( v88 )
          v50 = v95 - (unsigned int)(4096 - v88);
        goto LABEL_92;
      }
LABEL_210:
      v53 = v100;
      v50 = v19;
      goto LABEL_92;
    }
    if( (__int64 *)v20 == v15 )
      goto LABEL_210;
    v16 = *(_QWORD *)(v74 + 8);
    v15 = (__int64 *)v74;
    v94 = v16;
    v107 = (__int64 *)v74;
  }
  MiIncrementSubsectionViewCount(v15, 0);
  if( (*((_BYTE *)v15 + 34) & 8) != 0 )
    MiRemoveUnusedSubsection((_MSUBSECTION *)v15);
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
  __writecr8((unsigned __int8)v17);
  v116 = v16;
  v22 = 0i64;
  v23 = 17;
  ProtoPagePfn = 0i64;
  PageIrql[0] = 17;
  if( v16 >= v21 )
    goto LABEL_87;
  while( 1 )
  {
    v24 = v10;
    if( (v16 & 0xFFF) != 0 )
    {
      if( v23 != 17 )
        goto LABEL_25;
    }
    else if( v23 != 17 )
    {
      MiUnlockProtoPoolPage(v22, v23);
    }
    v22 = MiCheckProtoPtePageState((_MMPTE *)v16, (UINT8 *)PageIrql);
    ProtoPagePfn = v22;
    if( v22 )
      break;
    p_ByteCount = &v12->ByteCount;
    v16 = (v16 & 0xFFFFFFFFFFFFF000ui64) + 4096;
    v13 = v12->ByteCount == 0;
    v94 = v16;
    if( !v13 )
    {
LABEL_103:
      v23 = PageIrql[0];
      if( PageIrql[0] != 17 )
      {
        MiUnlockProtoPoolPage(v22, (unsigned __int8)PageIrql[0]);
        v23 = 17;
        PageIrql[0] = 17;
      }
      goto LABEL_105;
    }
    v23 = PageIrql[0];
LABEL_71:
    if( v16 >= v101 )
      goto LABEL_84;
  }
  while( 1 )
  {
    while( 1 )
    {
LABEL_25:
      v25 = *(_QWORD *)v16;
      v26 = *(_QWORD *)v16;
      if( (*(_QWORD *)v16 & 1) != 0 )
        goto LABEL_33;
      if( (*(_QWORD *)v16 & 0xC00i64) != 2048 )
        goto LABEL_64;
      if( !v25 || !qword_140C4DC80 || (v25 & qword_140C4DC80) != 0 )
      {
        v26 = *(_QWORD *)v16;
        if( qword_140C4DC80 && (v25 & 0x10) == 0 )
          v26 = v25 & ~qword_140C4DC80;
LABEL_33:
        v27 = 48 * ((v26 >> 12) & 0xFFFFFFFFFi64);
        v120 = v27;
        if( (*(_QWORD *)((char *)MmGetPfnDb() + v27 + 40) & 0x4000000000000i64) != 0 )
          break;
      }
    }
    v28 = (char *)MmGetPfnDb() + v27;
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)v28 + 6, 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(&SpinCount);
      while( *((__int64 *)v28 + 3) < 0 );
    }
    if( *(_QWORD *)v16 == v25 )
      break;
    _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
  }
  if( !v28 )
  {
LABEL_64:
    p_ByteCount = &v12->ByteCount;
    goto LABEL_65;
  }
  v29 = *(_QWORD *)v16;
  v30 = v28[34];
  p_ByteCount = &v12->ByteCount;
  if( (v30 & 8) != 0 )
  {
    if( !*p_ByteCount )
    {
      if( (v10 & 2) != 0 )
      {
        MiWaitForPageWriteCompletion((_MMPFN *)v28, (_CONTROL_AREA *)v111, ProtoPagePfn, (unsigned __int8)PageIrql[0]);
        v23 = 17;
        PageIrql[0] = 17;
        goto LABEL_70;
      }
      _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
      v23 = PageIrql[0];
      v10 |= 8u;
LABEL_204:
      v16 = v101;
      goto LABEL_84;
    }
    goto LABEL_140;
  }
  if( (v30 & 0x10) == 0 )
  {
    _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_65:
    v47 = *p_ByteCount;
    v10 |= 4u;
    if( !*p_ByteCount )
      v10 = v24;
LABEL_67:
    v16 += 8i64;
    v94 = v16;
    if( (v10 & 4) == 0 && (v16 != v101 || !v47) )
    {
      v23 = PageIrql[0];
      goto LABEL_70;
    }
    goto LABEL_102;
  }
  v32 = *p_ByteCount;
  if( (v30 & 0x20) != 0 )
  {
    memset((INT64)v123, 0i64);
    if( !v32 )
    {
      *(_DWORD *)WsIrql = 1;
      MiInitializePageFaultPacket(0i64, 0i64, 0, 0i64, (INT64)v123);
      MiObtainProtoReference((INT64)ProtoPagePfn, 1);
      MiWaitForCollidedFaultComplete(
        (_MMPFN *)v123,
        (_MMPFN *)v28,
        ProtoPagePfn,
        (_MMSUPPORT_INSTANCE *)(unsigned __int8)PageIrql[0],
        (UINT8)WsIrql,
        (UINT64)IoStatus,
        v90);
      v23 = 17;
      PageIrql[0] = 17;
      goto LABEL_70;
    }
LABEL_140:
    _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
LABEL_102:
    v22 = ProtoPagePfn;
    goto LABEL_103;
  }
  v33 = 0;
  if( !v32 )
  {
    v33 = 2;
    ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)SpinLock);
    v67 = (INT64 *)SpinLock;
    ++*(_DWORD *)(v111 + 76);
    ExReleaseSpinLockExclusiveFromDpcLevel(v67);
    v68 = v92;
    v12->Next = 0i64;
    v12->MdlFlags = 0;
    v12->StartVa = 0i64;
    *p_ByteCount = 0;
    v12->ByteOffset = v68;
  }
  v34 = v29 & 1;
  v35 = 0;
  v36 = *(ULONG_PTR **)(qword_140C4E388 + 8 * ((*((_QWORD *)v28 + 5) >> 39) & 0x3FFi64));
  v37 = *((_DWORD *)v28 + 4);
  v115 = v36;
  if( (v37 & 0x400) != 0 )
    v35 = 1;
  v38 = v33 & 2;
  v39 = 4;
  if( !v34 )
    v38 = v33;
  if( !v38 )
    v39 = 8;
  v105 = v39;
  if( v36 == &MiSystemPartition )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    v41 = *((_DWORD *)CurrentPrcb + 8391);
    if( v41 )
    {
      while( v41 != -1 )
      {
        v42 = v41;
        v41 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v41 - 1, v41);
        if( v42 == v41 )
        {
          v43 = 1;
          goto LABEL_53;
        }
        if( !v41 )
          break;
      }
    }
  }
  v43 = MiChargePartitionResidentAvailable((INT64)v36, 1ui64, (unsigned int)-(v38 != 0));
  if( !v43 )
    goto LABEL_181;
  v39 = v105;
  v36 = v115;
LABEL_53:
  v44 = v35 & 1;
  if( !v38 )
    v44 = v35;
  if( v44 && !(unsigned int)MiChargeCommit((_MI_PARTITION *)v36, 1ui64, v39) )
  {
    v80 = v115;
    v81 = 1i64;
    if( v115 != &MiSystemPartition )
      goto LABEL_180;
    v82 = KeGetCurrentPrcb();
    v83 = *((int *)v82 + 8391);
    if( (_DWORD)v83 == -1 )
      goto LABEL_180;
    if( (unsigned __int64)(v83 + 1) <= 0x100 )
    {
      do
      {
        v84 = _InterlockedCompareExchange((volatile signed __int32 *)v82 + 8391, v83 + 1, v83);
        v13 = (_DWORD)v83 == v84;
        LODWORD(v83) = v84;
        if( v13 )
          goto LABEL_181;
      }
      while( v84 != -1 && (unsigned __int64)(v84 + 1i64) <= 0x100 );
    }
    if( (int)v83 > 192
      && (_DWORD)v83 != -1
      && (_DWORD)v83 == _InterlockedCompareExchange((volatile signed __int32 *)v82 + 8391, 192, v83) )
    {
      v81 = (int)v83 - 192 + 1i64;
    }
    if( v81 )
LABEL_180:
      _InterlockedExchangeAdd64((volatile signed __int64 *)v80 + 896, v81);
LABEL_181:
    v43 = 0;
    goto LABEL_60;
  }
  if( !v34 )
  {
    MiUnlinkPageFromList((_MMPFN *)v28, 0i64);
    *((_QWORD *)v28 + 3) &= 0xC000000000000000ui64;
  }
  v45 = v28[34];
  ++*((_WORD *)v28 + 16);
  v28[34] = v45 | 8;
  v28[34] &= ~0x10u;
  if( (*((_DWORD *)v28 + 4) & 0x400i64) == 0 && (MiGetPagePrivilege((ULONG_PTR)v28, 1, 0i64) & 0x10) != 0 )
    MiClearPfnImageVerified((UINT64)v28, 28);
LABEL_60:
  _InterlockedAnd64((volatile signed __int64 *)v28 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v12 = (struct _MDL *)P;
  if( !v43 )
  {
    v70 = 3;
    goto LABEL_115;
  }
  *((_QWORD *)P + *p_ByteCount + 6) = v120 / 48;
  ByteOffset = v12->ByteOffset;
  v47 = *p_ByteCount + 1;
  *p_ByteCount = v47;
  if( v43 != 3 || v47 < 0x10 && (*((_DWORD *)KeGetCurrentThread() + 325) & 2) != 0 )
  {
    if( v47 == ByteOffset )
    {
      v70 = 1;
      goto LABEL_115;
    }
    v16 = v94;
    goto LABEL_67;
  }
  v70 = 2;
LABEL_115:
  MiUnlockProtoPoolPage(ProtoPagePfn, (unsigned __int8)PageIrql[0]);
  v16 = v94;
  v23 = 17;
  PageIrql[0] = 17;
  if( v70 != 3 )
  {
    if( v70 == 2 || v92 == 1 || (v71 = v94 + 8, v94 + 8 >= v101) )
    {
      v16 = v94 + 8;
      v94 += 8i64;
    }
    else
    {
      v72 = MiExpandFlushMdl(v12, (unsigned int)((__int64)(v101 - v94) >> 3) + v92 - 1);
      if( v72 )
      {
        v73 = v106;
        if( v12 != (struct _MDL *)result && (!v106 || v12 != (struct _MDL *)(v106 + 80)) )
          ExFreePoolWithTag(v12, 0);
        P = v72;
        v12 = v72;
        if( v73 )
          *(_QWORD *)(v73 + 72) = v72;
        v16 += 8i64;
        v92 = v72->ByteOffset;
        v94 = v71;
        goto LABEL_70;
      }
      v16 += 8i64;
      v92 = v12->ByteOffset;
      v94 = v71;
    }
  }
LABEL_105:
  v10 &= ~4u;
  v59 = (__int64)v107;
  *p_ByteCount <<= 12;
  v60 = MiReadyFlushMdlToWrite((__int64)v12, v59, a6);
  if( v106 )
  {
    v85 = MiIssueAsynchronousFlush(
            FileObject,
            v106,
            (unsigned __int64)v109,
            v104,
            v60,
            (a6 >> 2) & 4,
            IoPriorityThread,
            (__int64)OpaqueContext);
    v106 = v85;
    if( v85 )
    {
      v12 = *(struct _MDL **)(v85 + 72);
      v92 = 16;
      goto LABEL_132;
    }
    v10 |= 1u;
    v96 = 0;
    goto LABEL_204;
  }
  v61 = v111;
  v62 = *((_QWORD *)MmGetPfnDb() + 6 * (__int64)v12[1].Next + 1) | 0x8000000000000000ui64;
  if( MiControlAreaUsingExtents(v111) )
    MiFlushFileOnlyMdl(v63, (IO_STATUS_BLOCK *)v12);
  else
    MiIssueSynchronousFlush(FileObject, v12, v64, (a6 >> 2) & 4, OpaqueContext, v97);
  MiUnlockFlushMdl(v12, v61, v97);
  v65 = v97;
  Status = (unsigned int)v97->Status;
  if( (int)Status >= 0 )
  {
    v98 = 0;
    if( v12 == (struct _MDL *)result )
    {
LABEL_110:
      v12->ByteCount = 0;
      goto LABEL_70;
    }
    v92 = 16;
    ExFreePoolWithTag(v12, 0);
    v12 = (struct _MDL *)result;
LABEL_132:
    P = v12;
    goto LABEL_110;
  }
  v94 = v62;
  v16 = v62;
  if( (_DWORD)Status == -1073741740 && (v10 & 0x10) != 0 )
  {
    v86 = (union _LARGE_INTEGER *)&Mi10Milliseconds;
    goto LABEL_200;
  }
  v48 = *p_ByteCount;
  if( !(unsigned int)MiIsRetryIoStatus(Status, *p_ByteCount) )
    goto LABEL_81;
  if( (--v98 & 0x1F) != 0 )
  {
    v86 = (union _LARGE_INTEGER *)&Mi30Milliseconds;
LABEL_200:
    KeDelayExecutionThread(0, 0, v86);
LABEL_201:
    v65->Status = 0;
    v49 = 1;
    goto LABEL_82;
  }
  if( v92 != 1 && v48 > 0x1000 )
  {
    v92 = 1;
    goto LABEL_201;
  }
LABEL_81:
  v49 = 0;
LABEL_82:
  v96 = v49;
  if( v12 != (struct _MDL *)result )
  {
    if( v92 != 1 )
      v92 = 16;
    ExFreePoolWithTag(v12, 0);
    v12 = (struct _MDL *)result;
    P = result;
  }
  v12->ByteCount = 0;
  if( v49 )
  {
LABEL_70:
    v22 = ProtoPagePfn;
    goto LABEL_71;
  }
LABEL_84:
  if( v23 != 17 )
  {
    MiUnlockProtoPoolPage(ProtoPagePfn, v23);
    PageIrql[0] = 17;
  }
  v15 = v107;
LABEL_87:
  v50 = ((__int64)(v16 - v116) >> 3 << 12) + v95;
  v95 = v50;
  LOBYTE(v17) = ExAcquireSpinLockExclusive(SpinLock);
  if( !v15[2] && v16 == v15[1] + 8i64 * (*((_DWORD *)v15 + 11) - (*((_DWORD *)v15 + 13) & 0x3FFFFFFFu)) )
  {
    v69 = MiEndingOffset((_SUBSECTION *)v15) & 0xFFF;
    if( v69 )
    {
      v50 -= (unsigned int)(4096 - v69);
      v95 = v50;
    }
  }
  v51 = MiDecrementSubsectionViewCount(v15, 0);
  v53 = v51 + v100;
  v13 = v15[12] == 0;
  v100 += v51;
  if( v13 && (*((_BYTE *)v15 + 34) & 1) == 0 )
  {
    v53 += MiInsertUnusedSubsection((_MSUBSECTION *)v15, v52);
    v100 = v53;
  }
  if( (v10 & 8) == 0 )
  {
    if( v96 )
    {
      v20 = (__int64)v112;
      if( v15 != v112 )
      {
        v15 = (__int64 *)v15[2];
        v107 = v15;
        if( v15 )
        {
          v16 = v15[1];
          v19 = v95;
          v94 = v16;
          goto LABEL_14;
        }
      }
    }
  }
LABEL_92:
  ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)SpinLock);
  __writecr8((unsigned __int8)v17);
  v54 = v109;
  v55 = v104;
  if( v109 && !v104 )
  {
    if( (int)MiWaitForAsynchronousFlushes((unsigned int *)v109) < 0 )
      LOBYTE(v10) = v10 | 1;
    ExFreePoolWithTag(v54, 0);
  }
  v56 = v111;
  MiDereferenceControlAreaFile(v111, (unsigned __int64)FileObject);
  if( v53 )
    MiReturnCrossPartitionSectionCharges(
      *(volatile INT64 **)(qword_140C4E388 + 8i64 * (*(_WORD *)(v56 + 60) & 0x3FF)),
      1i64,
      v53);
  if( OpaqueContext )
    IoDiskIoAttributionDereference(OpaqueContext);
  KeLeaveCriticalRegionThread((__int64)CurrentThread);
  if( (v10 & 1) != 0 )
    return MiFlushSectionInternal(BugCheckParameter1, v118 - 8, v121, (__int64)v112, v55, a6 & 0xFFFFFFFB, (__int64)v97);
  v57 = v97;
  if( (v10 & 8) != 0 )
  {
    v58 = 3221226547i64;
    v97->Status = -1073740749;
  }
  else
  {
    v58 = (unsigned int)v97->Status;
  }
  v57->Information = v50;
  return v58;
}

Referenced by:

MiCleanSection
MiDeleteCachedSubsection
MiFlushControlArea
MiFlushSectionInternal
MmFlushSection
MmFlushVirtualMemory