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