MiFlushSectionInternal
NTSTATUS __stdcall MiFlushSectionInternal(
_MMPTE *StartingPte,
_MMPTE *FinalPte,
_SUBSECTION *FirstSubsection,
_SUBSECTION *LastSubsection,
_MI_OVERLAPPED_FLUSH_ENTRY *OverlappedFlushEntry,
UINT64 Flags,
_IO_STATUS_BLOCK *IoStatus){
int v9;
int v10;
_CONTROL_AREA *v11;
_MDL *v12;
bool v13;
__int64 v14;
_SUBSECTION *v15;
unsigned __int64 SubsectionBase;
unsigned __int64 v17;
__int64 bf_0;
__int64 v19;
_SUBSECTION *v20;
_MMPTE *v21;
_MMPFN *v22;
UINT8 v23;
int v24;
unsigned __int64 v25;
unsigned __int64 v26;
__int64 v27;
_MMPFN *v28;
unsigned __int64 v29;
char v30;
unsigned int *p_ByteCount;
unsigned int v32;
int v33;
__int64 v34;
int v35;
_MI_PARTITION *v36;
int v37;
int v38;
unsigned int v39;
struct _KPRCB *CurrentPrcb;
signed __int32 CachedResidentAvailable;
signed __int32 v42;
_MI_RESAVAIL_CHARGE 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;
_MI_OVERLAPPED_FLUSH_ENTRY *v55;
_CONTROL_AREA *v56;
_IO_STATUS_BLOCK *v57;
NTSTATUS result;
_SUBSECTION *v59;
UINT64 v60;
_CONTROL_AREA *v61;
unsigned __int64 v62;
int v63;
_MDL *v64;
UINT64 v65;
_IO_STATUS_BLOCK *v66;
INT64 Status;
INT64 *v68;
int v69;
__int16 v70;
int v71;
int v72;
__int64 v73;
_MDL *v74;
_MI_FLUSH_ENTRY *v75;
_SUBSECTION *NextSubsection;
char *Pool;
_MI_OVERLAPPED_FLUSH_ENTRY *v78;
char *v79;
char *v80;
_QWORD *v81;
_MI_PARTITION *v82;
unsigned __int64 v83;
struct _KPRCB *v84;
__int64 v85;
signed __int32 v86;
_MI_FLUSH_ENTRY *v87;
_LARGE_INTEGER *v88;
__int64 v89;
__int16 v90;
int v91;
int v92;
UINT64 IrpSpFlags;
UINT64 *IoPriority;
char PageIrql[4];
int v96;
ULONG_PTR ProtoPagePfn[2];
unsigned __int64 v98;
__int64 v99;
int v100;
_IO_STATUS_BLOCK *v101;
int v102;
_MDL *Mdl;
UINT64 v104;
unsigned __int64 v105;
UINT8 WsIrql[4];
_IO_PRIORITY_HINT IoPriorityThread;
_MI_OVERLAPPED_FLUSH_ENTRY *v108;
unsigned int v109;
_MI_FLUSH_ENTRY *FlushEntry;
_SUBSECTION *Subsection;
INT64 *SpinLock;
PVOID P;
_FILE_OBJECT *FileObject;
_CONTROL_AREA *ControlArea;
_SUBSECTION *LastSubsectiona;
UINT64 SpinCount;
VOID *OpaqueContext;
_MI_PARTITION *v119;
unsigned __int64 v120;
_ETHREAD *Thread;
_MMPTE *v122;
VOID *ProtoPte;
__int64 v124;
_SUBSECTION *FirstSubsectiona;
char v126[192];
_MMPFN v127[3];
FirstSubsectiona = FirstSubsection;
ProtoPte = StartingPte;
v108 = OverlappedFlushEntry;
v101 = IoStatus;
*(_DWORD *)WsIrql = 0;
PageIrql[0] = 0;
LastSubsectiona = LastSubsection;
memset(v126, 0i64, 0xB8u);
v9 = Flags;
v10 = 0;
if( (Flags & 2) == 0 )
v10 = 2;
if( OverlappedFlushEntry )
{
v9 = Flags | 4;
LODWORD(Flags) = Flags | 4;
}
v11 = FirstSubsection->ControlArea;
P = 0i64;
FlushEntry = 0i64;
v12 = (_MDL *)v126;
Mdl = (_MDL *)v126;
v13 = (v11->u.LongFlags & 0x40000000) == 0;
ControlArea = v11;
if( !v13 )
{
v9 &= ~4u;
LODWORD(Flags) = v9;
}
if( (v9 & 4) != 0 )
{
Pool = (char *)MiAllocatePool(64i64, 0xA00ui64, 0x61466D4Dui64);
v78 = v108;
v79 = Pool;
P = Pool;
if( v108 )
{
*((_QWORD *)v108 + 5) = Pool;
if( !Pool )
return -1073741670;
}
else if( !Pool )
{
goto LABEL_8;
}
*((_WORD *)Pool + 24) = 0;
v80 = Pool + 48;
Pool[50] = 6;
v12 = (_MDL *)(Pool + 80);
FlushEntry = (_MI_FLUSH_ENTRY *)Pool;
*((_DWORD *)Pool + 13) = 0;
v81 = Pool + 56;
v81[1] = v81;
*v81 = v81;
*(_DWORD *)v79 = 0;
*((_QWORD *)v79 + 2) = 0i64;
*((_QWORD *)v79 + 5) = v78;
*((_QWORD *)v79 + 4) = v11;
*((_QWORD *)v79 + 9) = v12;
*((_QWORD *)v79 + 264) = v80;
*((_WORD *)v79 + 156) = 0;
v79[314] = 6;
*((_DWORD *)v79 + 79) = 0;
*((_QWORD *)v79 + 41) = v79 + 320;
*((_QWORD *)v79 + 40) = v79 + 320;
*((_QWORD *)v79 + 42) = v79 + 344;
*((_DWORD *)v79 + 66) = 0;
*((_QWORD *)v79 + 35) = 0i64;
*((_QWORD *)v79 + 38) = v78;
*((_QWORD *)v79 + 37) = v11;
*((_QWORD *)v79 + 265) = v79 + 312;
*((_WORD *)v79 + 288) = 0;
v79[578] = 6;
*((_DWORD *)v79 + 145) = 0;
*((_QWORD *)v79 + 74) = v79 + 584;
*((_QWORD *)v79 + 73) = v79 + 584;
*((_QWORD *)v79 + 75) = v79 + 608;
*((_DWORD *)v79 + 132) = 0;
*((_QWORD *)v79 + 68) = 0i64;
*((_QWORD *)v79 + 71) = v78;
*((_QWORD *)v79 + 70) = v11;
*((_QWORD *)v79 + 266) = v79 + 576;
*((_WORD *)v79 + 420) = 0;
v79[842] = 6;
*((_DWORD *)v79 + 211) = 0;
*((_QWORD *)v79 + 107) = v79 + 848;
*((_QWORD *)v79 + 106) = v79 + 848;
*((_QWORD *)v79 + 108) = v79 + 872;
*((_DWORD *)v79 + 198) = 0;
*((_QWORD *)v79 + 101) = 0i64;
*((_QWORD *)v79 + 104) = v78;
*((_QWORD *)v79 + 103) = v11;
*((_QWORD *)v79 + 267) = v79 + 840;
*((_WORD *)v79 + 552) = 0;
v79[1106] = 6;
*((_DWORD *)v79 + 277) = 0;
*((_QWORD *)v79 + 140) = v79 + 1112;
*((_QWORD *)v79 + 139) = v79 + 1112;
*((_QWORD *)v79 + 141) = v79 + 1136;
*((_DWORD *)v79 + 264) = 0;
*((_QWORD *)v79 + 134) = 0i64;
*((_QWORD *)v79 + 137) = v78;
*((_QWORD *)v79 + 136) = v11;
*((_QWORD *)v79 + 268) = v79 + 1104;
*((_WORD *)v79 + 684) = 0;
v79[1370] = 6;
*((_DWORD *)v79 + 343) = 0;
*((_QWORD *)v79 + 173) = v79 + 1376;
*((_QWORD *)v79 + 172) = v79 + 1376;
*((_DWORD *)v79 + 330) = 0;
Mdl = v12;
*((_QWORD *)v79 + 167) = 0i64;
*((_QWORD *)v79 + 174) = v79 + 1400;
*((_QWORD *)v79 + 170) = v78;
*((_QWORD *)v79 + 169) = v11;
*((_QWORD *)v79 + 269) = v79 + 1368;
*((_WORD *)v79 + 816) = 0;
v79[1634] = 6;
*((_DWORD *)v79 + 409) = 0;
*((_QWORD *)v79 + 206) = v79 + 1640;
*((_QWORD *)v79 + 205) = v79 + 1640;
*((_QWORD *)v79 + 207) = v79 + 1664;
*((_DWORD *)v79 + 396) = 0;
*((_QWORD *)v79 + 200) = 0i64;
*((_QWORD *)v79 + 203) = v78;
*((_QWORD *)v79 + 202) = v11;
*((_QWORD *)v79 + 270) = v79 + 1632;
*((_WORD *)v79 + 948) = 0;
v79[1898] = 6;
*((_DWORD *)v79 + 475) = 0;
*((_QWORD *)v79 + 239) = v79 + 1904;
*((_QWORD *)v79 + 238) = v79 + 1904;
*((_QWORD *)v79 + 240) = v79 + 1928;
*((_DWORD *)v79 + 462) = 0;
*((_QWORD *)v79 + 233) = 0i64;
*((_QWORD *)v79 + 236) = v78;
*((_QWORD *)v79 + 235) = v11;
*((_QWORD *)v79 + 271) = v79 + 1896;
}
LABEL_8:
v122 = FinalPte + 1;
FileObject = MiReferenceControlAreaFile(v11);
Thread = (_ETHREAD *)KeGetCurrentThread();
IoPriorityThread = PsGetIoPriorityThread(Thread);
if( IoPriorityThread < IoPriorityNormal
&& (*(_DWORD *)(v14 + 116) & 0x400) == 0
&& *(_BYTE *)(v14 + 562) != 1
&& KeGetCurrentThread()[1].TrapFrame != (_KTRAP_FRAME *)2 )
{
IoPriorityThread = IoPriorityNormal;
}
if( v9 < 0 )
v10 |= 0x10u;
Subsection = FirstSubsection;
IoStatus->Status = 0;
v15 = FirstSubsection;
SubsectionBase = (unsigned __int64)ProtoPte;
IoStatus->Information = 0i64;
v12->Next = 0i64;
v12->MdlFlags = 0;
v12->StartVa = 0i64;
*(_QWORD *)&v12->ByteCount = 0i64;
--*(_WORD *)(v14 + 484);
v96 = 16;
v102 = 0;
v100 = 1;
v99 = 0i64;
v98 = SubsectionBase;
SpinLock = (INT64 *)&v11->ControlAreaLock;
v17 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&v11->ControlAreaLock);
if( !v11->NumberOfPfnReferences )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&v11->ControlAreaLock);
__writecr8(v17);
if( P )
{
ExFreePoolWithTag(P, 0);
if( v108 )
*((_QWORD *)v108 + 5) = 0i64;
}
MiDereferenceControlAreaFile(v11, FileObject);
KeLeaveCriticalRegionThread(&Thread->Tcb);
result = 0;
IoStatus->Status = 0;
IoStatus->Information = 0i64;
return result;
}
bf_0 = v11->u3._bf_0;
OpaqueContext = (VOID *)(8 * bf_0);
if( 8 * bf_0 && _InterlockedIncrement64((volatile signed __int64 *)(8 * bf_0 + 32)) <= 1 )
__fastfail(0xEu);
v104 = 0i64;
v19 = 0i64;
v20 = LastSubsectiona;
while( 1 )
{
LABEL_14:
if( v15 == v20 )
{
v21 = v122;
}
else
{
v21 = &v15->SubsectionBase[v15->PtesInSubsection - (v15->_bf_34 & 0x3FFFFFFF)];
v20 = LastSubsectiona;
}
v105 = (unsigned __int64)v21;
if( !SubsectionBase )
{
SubsectionBase = (unsigned __int64)v15->SubsectionBase;
v98 = SubsectionBase;
}
if( v15[1].u1.e1._bf_0 && v15->SubsectionBase )
break;
v19 += (__int64)((__int64)v21 - SubsectionBase) >> 3 << 12;
NextSubsection = v15->NextSubsection;
v99 = v19;
if( !NextSubsection )
{
if( v21 == &v15->SubsectionBase[v15->PtesInSubsection - (v15->_bf_34 & 0x3FFFFFFF)] )
{
MiEndingOffset(v15);
v50 = v99;
v53 = v104;
v91 = v90 & 0xFFF;
if( v91 )
v50 = v99 - (unsigned int)(4096 - v91);
goto LABEL_92;
}
LABEL_210:
v53 = v104;
v50 = v19;
goto LABEL_92;
}
if( v20 == v15 )
goto LABEL_210;
SubsectionBase = (unsigned __int64)NextSubsection->SubsectionBase;
v15 = NextSubsection;
v98 = SubsectionBase;
Subsection = NextSubsection;
}
MiIncrementSubsectionViewCount((_MSUBSECTION *)v15, 0i64);
if( (v15->u.SubsectionFlags._bf_2 & 8) != 0 )
MiRemoveUnusedSubsection((_MSUBSECTION *)v15);
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
__writecr8((unsigned __int8)v17);
v120 = SubsectionBase;
LODWORD(v22) = 0;
v23 = 17;
*(_QWORD *)ProtoPagePfn = 0i64;
PageIrql[0] = 17;
if( SubsectionBase >= (unsigned __int64)v21 )
goto LABEL_87;
while( 1 )
{
v24 = v10;
if( (SubsectionBase & 0xFFF) != 0 )
{
if( v23 != 17 )
goto LABEL_25;
}
else if( v23 != 17 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v22, v23);
}
v22 = MiCheckProtoPtePageState((VOID *)SubsectionBase, (UINT8 *)PageIrql);
*(_QWORD *)ProtoPagePfn = v22;
if( v22 )
break;
p_ByteCount = &v12->ByteCount;
SubsectionBase = (SubsectionBase & 0xFFFFFFFFFFFFF000ui64) + 4096;
v13 = v12->ByteCount == 0;
v98 = SubsectionBase;
if( !v13 )
{
LABEL_103:
v23 = PageIrql[0];
if( PageIrql[0] != 17 )
{
MiUnlockProtoPoolPage((ULONG_PTR)v22, PageIrql[0]);
v23 = 17;
PageIrql[0] = 17;
}
goto LABEL_105;
}
v23 = PageIrql[0];
LABEL_71:
if( SubsectionBase >= v105 )
goto LABEL_84;
}
while( 1 )
{
while( 1 )
{
LABEL_25:
v25 = *(_QWORD *)SubsectionBase;
v26 = *(_QWORD *)SubsectionBase;
if( (*(_QWORD *)SubsectionBase & 1) != 0 )
goto LABEL_33;
if( (*(_QWORD *)SubsectionBase & 0xC00i64) != 2048 )
goto LABEL_64;
if( !v25 || !*(&stru_140C4DB30 + 42) || (v25 & *(&stru_140C4DB30 + 42)) != 0 )
{
v26 = *(_QWORD *)SubsectionBase;
if( *(&stru_140C4DB30 + 42) && (v25 & 0x10) == 0 )
v26 = v25 & ~*(&stru_140C4DB30 + 42);
LABEL_33:
v27 = (v26 >> 12) & 0xFFFFFFFFFi64;
v124 = v27 * 48;
if( (MmGetPfnDb()[v27].u4._bf_0 & 0x4000000000000i64) != 0 )
break;
}
}
v28 = &MmGetPfnDb()[v27];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v28->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v28->u2._bf_0 < 0 );
}
if( *(_QWORD *)SubsectionBase == v25 )
break;
_InterlockedAnd64(&v28->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
if( !v28 )
{
LABEL_64:
p_ByteCount = &v12->ByteCount;
goto LABEL_65;
}
v29 = *(_QWORD *)SubsectionBase;
v30 = *((_BYTE *)&v28->u3 + 2);
p_ByteCount = &v12->ByteCount;
if( (v30 & 8) != 0 )
{
if( !*p_ByteCount )
{
if( (v10 & 2) != 0 )
{
MiWaitForPageWriteCompletion(v28, ControlArea, ProtoPagePfn[0], PageIrql[0]);
v23 = 17;
PageIrql[0] = 17;
goto LABEL_70;
}
_InterlockedAnd64(&v28->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v23 = PageIrql[0];
v10 |= 8u;
LABEL_204:
SubsectionBase = v105;
goto LABEL_84;
}
goto LABEL_140;
}
if( (v30 & 0x10) == 0 )
{
_InterlockedAnd64(&v28->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_65:
v47 = *p_ByteCount;
v10 |= 4u;
if( !*p_ByteCount )
v10 = v24;
LABEL_67:
SubsectionBase += 8i64;
v98 = SubsectionBase;
if( (v10 & 4) == 0 && (SubsectionBase != v105 || !v47) )
{
v23 = PageIrql[0];
goto LABEL_70;
}
goto LABEL_102;
}
v32 = *p_ByteCount;
if( (v30 & 0x20) != 0 )
{
memset(v127, 0i64, 0x88u);
if( !v32 )
{
*(_DWORD *)WsIrql = 1;
MiInitializePageFaultPacket(0i64, 0i64, 0, 0i64, (INT64)v127);
MiObtainProtoReference(*(_MMPFN **)ProtoPagePfn, 1ui64);
MiWaitForCollidedFaultComplete(
v127,
v28,
*(VOID **)ProtoPagePfn,
(_MMSUPPORT_INSTANCE *)(unsigned __int8)PageIrql[0],
(UINT8)WsIrql,
IrpSpFlags,
IoPriority);
v23 = 17;
PageIrql[0] = 17;
goto LABEL_70;
}
LABEL_140:
_InterlockedAnd64(&v28->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_102:
LODWORD(v22) = ProtoPagePfn[0];
goto LABEL_103;
}
v33 = 0;
if( !v32 )
{
v33 = 2;
ExAcquireSpinLockExclusiveAtDpcLevel(SpinLock);
v68 = SpinLock;
++ControlArea->ModifiedWriteCount;
ExReleaseSpinLockExclusiveFromDpcLevel(v68);
v69 = v96;
v12->Next = 0i64;
v12->MdlFlags = 0;
v12->StartVa = 0i64;
*p_ByteCount = 0;
v12->ByteOffset = v69;
}
v34 = v29 & 1;
v35 = 0;
v36 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)v28->u4._bf_0 >> 39) & 0x3FF));
v37 = *((_DWORD *)&v28->3 + 4);
v119 = v36;
if( (v37 & 0x400) != 0 )
v35 = 1;
v38 = v33 & 2;
v39 = 4;
if( !v34 )
v38 = v33;
if( !v38 )
v39 = 8;
v109 = v39;
if( v36 == &Irp )
{
CurrentPrcb = KeGetCurrentPrcb();
CachedResidentAvailable = CurrentPrcb->CachedResidentAvailable;
if( CachedResidentAvailable )
{
while( CachedResidentAvailable != -1 )
{
v42 = CachedResidentAvailable;
CachedResidentAvailable = _InterlockedCompareExchange(
(volatile signed __int32 *)&CurrentPrcb->CachedResidentAvailable,
CachedResidentAvailable - 1,
CachedResidentAvailable);
if( v42 == CachedResidentAvailable )
{
v43 = MiChargedLocal;
goto LABEL_53;
}
if( !CachedResidentAvailable )
break;
}
}
}
v43 = MiChargePartitionResidentAvailable(v36, 1ui64, (unsigned int)-(v38 != 0));
if( v43 == MiChargeFailed )
goto LABEL_181;
v39 = v109;
v36 = v119;
LABEL_53:
v44 = v35 & 1;
if( !v38 )
v44 = v35;
if( v44 && !MiChargeCommit(v36, 1ui64, v39) )
{
v82 = v119;
v83 = 1i64;
if( v119 != &Irp )
goto LABEL_180;
v84 = KeGetCurrentPrcb();
v85 = (int)v84->CachedResidentAvailable;
if( (_DWORD)v85 == -1 )
goto LABEL_180;
if( (unsigned __int64)(v85 + 1) <= 0x100 )
{
do
{
v86 = _InterlockedCompareExchange((volatile signed __int32 *)&v84->CachedResidentAvailable, v85 + 1, v85);
v13 = (_DWORD)v85 == v86;
LODWORD(v85) = v86;
if( v13 )
goto LABEL_181;
}
while( v86 != -1 && (unsigned __int64)(v86 + 1i64) <= 0x100 );
}
if( (int)v85 > 192
&& (_DWORD)v85 != -1
&& (_DWORD)v85 == _InterlockedCompareExchange((volatile signed __int32 *)&v84->CachedResidentAvailable, 192, v85) )
{
v83 = (int)v85 - 192 + 1i64;
}
if( v83 )
LABEL_180:
_InterlockedExchangeAdd64((volatile signed __int64 *)&v82->Vp.ResidentAvailablePages, v83);
LABEL_181:
v43 = MiChargeFailed;
goto LABEL_60;
}
if( !v34 )
{
MiUnlinkPageFromList(v28, 0i64);
v28->u2._bf_0 &= 0xC000000000000000ui64;
}
v45 = *((_BYTE *)&v28->u3 + 2);
++v28->u3.ReferenceCount;
*((_BYTE *)&v28->u3 + 2) = v45 | 8;
*((_BYTE *)&v28->u3 + 2) &= ~0x10u;
if( (*(_DWORD *)(&v28->3 + 1) & 0x400i64) == 0 && (MiGetPagePrivilege((ULONG_PTR)v28, 1ui64, 0i64) & 0x10) != 0 )
MiClearPfnImageVerified(v28, 0x1Cui64);
LABEL_60:
_InterlockedAnd64(&v28->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v12 = Mdl;
if( v43 == MiChargeFailed )
{
v72 = 3;
goto LABEL_115;
}
*((_QWORD *)&Mdl[1].Next + *p_ByteCount) = v124 / 48;
ByteOffset = v12->ByteOffset;
v47 = *p_ByteCount + 1;
*p_ByteCount = v47;
if( v43 != MiChargedGlobalNowLow || v47 < 0x10 && (*(_DWORD *)&KeGetCurrentThread()[1].gapD8[12] & 2) != 0 )
{
if( v47 == ByteOffset )
{
v72 = 1;
goto LABEL_115;
}
SubsectionBase = v98;
goto LABEL_67;
}
v72 = 2;
LABEL_115:
MiUnlockProtoPoolPage(ProtoPagePfn[0], PageIrql[0]);
SubsectionBase = v98;
v23 = 17;
PageIrql[0] = 17;
if( v72 != 3 )
{
if( v72 == 2 || v96 == 1 || (v73 = v98 + 8, v98 + 8 >= v105) )
{
SubsectionBase = v98 + 8;
v98 += 8i64;
}
else
{
v74 = MiExpandFlushMdl(v12, (unsigned int)((__int64)(v105 - v98) >> 3) + v96 - 1);
if( v74 )
{
v75 = FlushEntry;
if( v12 != (_MDL *)v126 && (!FlushEntry || v12 != (_MDL *)(FlushEntry + 20)) )
ExFreePoolWithTag(v12, 0);
Mdl = v74;
v12 = v74;
if( v75 )
*((_QWORD *)v75 + 9) = v74;
SubsectionBase += 8i64;
v96 = v74->ByteOffset;
v98 = v73;
goto LABEL_70;
}
SubsectionBase += 8i64;
v96 = v12->ByteOffset;
v98 = v73;
}
}
LABEL_105:
v10 &= ~4u;
v59 = Subsection;
*p_ByteCount <<= 12;
LODWORD(v60) = MiReadyFlushMdlToWrite(v12, v59, (unsigned int)Flags);
if( FlushEntry )
{
v87 = MiIssueAsynchronousFlush(
FileObject,
FlushEntry,
(_MI_FLUSH_ARRAY *)P,
v108,
v60,
((unsigned int)Flags >> 2) & 4,
IoPriorityThread,
OpaqueContext);
FlushEntry = v87;
if( v87 )
{
v12 = (_MDL *)*((_QWORD *)v87 + 9);
v96 = 16;
goto LABEL_132;
}
v10 |= 1u;
v100 = 0;
goto LABEL_204;
}
v61 = ControlArea;
v62 = MmGetPfnDb()[(__int64)v12[1].Next].PteLong | 0x8000000000000000ui64;
LOBYTE(v63) = MiControlAreaUsingExtents((INT64)ControlArea);
if( v63 )
MiFlushFileOnlyMdl(v64, (_IO_STATUS_BLOCK *)v12);
else
MiIssueSynchronousFlush(FileObject, v12, v65, ((unsigned int)Flags >> 2) & 4, OpaqueContext, v101);
MiUnlockFlushMdl(v12, v61, v101);
v66 = v101;
Status = (unsigned int)v101->Status;
if( (int)Status >= 0 )
{
v102 = 0;
if( v12 == (_MDL *)v126 )
{
LABEL_110:
v12->ByteCount = 0;
goto LABEL_70;
}
v96 = 16;
ExFreePoolWithTag(v12, 0);
v12 = (_MDL *)v126;
LABEL_132:
Mdl = v12;
goto LABEL_110;
}
v98 = v62;
SubsectionBase = v62;
if( (_DWORD)Status == -1073741740 && (v10 & 0x10) != 0 )
{
v88 = (_LARGE_INTEGER *)&Mi10Milliseconds;
goto LABEL_200;
}
v48 = *p_ByteCount;
if( !MiIsRetryIoStatus(Status, *p_ByteCount) )
goto LABEL_81;
if( (--v102 & 0x1F) != 0 )
{
v88 = (_LARGE_INTEGER *)&Mi30Milliseconds;
LABEL_200:
KeDelayExecutionThread(0, 0, v88);
LABEL_201:
v66->Status = 0;
v49 = 1;
goto LABEL_82;
}
if( v96 != 1 && v48 > 0x1000 )
{
v96 = 1;
goto LABEL_201;
}
LABEL_81:
v49 = 0;
LABEL_82:
v100 = v49;
if( v12 != (_MDL *)v126 )
{
if( v96 != 1 )
v96 = 16;
ExFreePoolWithTag(v12, 0);
v12 = (_MDL *)v126;
Mdl = (_MDL *)v126;
}
v12->ByteCount = 0;
if( v49 )
{
LABEL_70:
LODWORD(v22) = ProtoPagePfn[0];
goto LABEL_71;
}
LABEL_84:
if( v23 != 17 )
{
MiUnlockProtoPoolPage(ProtoPagePfn[0], v23);
PageIrql[0] = 17;
}
v15 = Subsection;
LABEL_87:
v50 = ((__int64)(SubsectionBase - v120) >> 3 << 12) + v99;
v99 = v50;
LOBYTE(v17) = ExAcquireSpinLockExclusive(SpinLock);
if( !v15->NextSubsection
&& (_MMPTE *)SubsectionBase == &v15->SubsectionBase[v15->PtesInSubsection - (v15->_bf_34 & 0x3FFFFFFF)] )
{
MiEndingOffset(v15);
v71 = v70 & 0xFFF;
if( v71 )
{
v50 -= (unsigned int)(4096 - v71);
v99 = v50;
}
}
LODWORD(v51) = MiDecrementSubsectionViewCount((_MSUBSECTION *)v15);
v53 = v51 + v104;
v13 = *(_QWORD *)&v15[1].NumberOfFullSectors == 0i64;
v104 += v51;
if( v13 && (v15->u.SubsectionFlags._bf_2 & 1) == 0 )
{
LODWORD(v89) = MiInsertUnusedSubsection((_MSUBSECTION *)v15, v52);
v53 += v89;
v104 = v53;
}
if( (v10 & 8) == 0 )
{
if( v100 )
{
v20 = LastSubsectiona;
if( v15 != LastSubsectiona )
{
v15 = v15->NextSubsection;
Subsection = v15;
if( v15 )
{
SubsectionBase = (unsigned __int64)v15->SubsectionBase;
v19 = v99;
v98 = SubsectionBase;
goto LABEL_14;
}
}
}
}
LABEL_92:
ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
__writecr8((unsigned __int8)v17);
v54 = P;
v55 = v108;
if( P && !v108 )
{
MiWaitForAsynchronousFlushes((_MI_FLUSH_ARRAY *)P);
if( v92 < 0 )
LOBYTE(v10) = v10 | 1;
ExFreePoolWithTag(v54, 0);
}
v56 = ControlArea;
MiDereferenceControlAreaFile(ControlArea, FileObject);
if( v53 )
MiReturnCrossPartitionSectionCharges(
*(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (v56->u1.Flags._bf_0 & 0x3FF)),
1i64,
v53);
if( OpaqueContext )
IoDiskIoAttributionDereference(OpaqueContext);
KeLeaveCriticalRegionThread(&Thread->Tcb);
if( (v10 & 1) != 0 )
{
LODWORD(IrpSpFlags) = Flags & 0xFFFFFFFB;
return MiFlushSectionInternal(
(_MMPTE *)ProtoPte,
v122 - 1,
FirstSubsectiona,
LastSubsectiona,
v55,
IrpSpFlags,
v101);
}
else
{
v57 = v101;
if( (v10 & 8) != 0 )
{
result = -1073740749;
v101->Status = -1073740749;
}
else
{
result = v101->Status;
}
v57->Information = v50;
}
return result;
}Referenced by:
MiCleanSection
MiDeleteCachedSubsection
MiFlushControlArea
MiFlushSectionInternal
MmFlushSection
MmFlushVirtualMemory