MiDeleteCachedSubsection
NTSTATUS __stdcall MiDeleteCachedSubsection(_MI_PARTITION *Partition){
_MI_PARTITION_SEGMENTS *p_Segments;
__int64 Flink;
__int64 v4;
_LIST_ENTRY *p_UnusedSubsectionList;
unsigned __int64 v6;
_LIST_ENTRY *i;
NTSTATUS result;
_LIST_ENTRY *v9;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
UINT64 v12;
int v13;
UINT64 v14;
UINT64 v15;
int v16;
_MI_SUBSECTION_STATUS v17;
int v18;
unsigned __int8 v19;
unsigned __int64 v20;
_FILE_OBJECT *v21;
unsigned __int64 v22;
signed __int64 v23;
unsigned __int8 v24;
int v25;
unsigned __int64 v26;
_BOOL4 v27;
char v28;
int v29;
unsigned int v30;
_MI_CONTROL_AREA_WAIT_BLOCK *v31;
UINT64 v32;
UINT64 v33;
UINT64 v34;
__int64 v35;
INT16 v36;
_MI_CONTROL_AREA_WAIT_BLOCK *v37;
__int64 v38;
UINT64 Flags;
signed __int64 v40;
_IO_STATUS_BLOCK IoStatus;
_MMPTE *FinalPte;
_MMPTE *P;
_MMPTE *StartingPte;
p_Segments = &Partition->Segments;
Flink = 1i64;
IoStatus = 0i64;
v4 = 1i64;
p_UnusedSubsectionList = &Partition->Segments.UnusedSubsectionList;
v6 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&Partition->Segments.SegmentListLock);
for( i = p_UnusedSubsectionList->Flink; i != p_UnusedSubsectionList; i = i->Flink )
{
v4 = (__int64)&i[-5];
Flink = (__int64)i[-5].Flink;
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(Flink + 72)) )
break;
}
if( i == p_UnusedSubsectionList )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
result = -1073741275;
LABEL_11:
__writecr8(v6);
return result;
}
v9 = (_LIST_ENTRY *)(v4 + 80);
v10 = *(_LIST_ENTRY **)(v4 + 80);
v11 = *(_LIST_ENTRY **)(v4 + 88);
if( v10->Blink != (_LIST_ENTRY *)(v4 + 80) || v11->Flink != v9 )
__fastfail(3u);
v11->Flink = v10;
v10->Blink = v11;
*(_WORD *)(v4 + 34) &= ~8u;
*(_QWORD *)(v4 + 88) = v4 + 80;
v9->Flink = v9;
MiReduceUnusedSubsectionCount((_MSUBSECTION *)v4);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&p_Segments->SegmentListLock);
v13 = *(_DWORD *)(Flink + 56);
if( (v13 & 1) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
result = -1073741709;
goto LABEL_11;
}
if( (v13 & 8) != 0 )
{
if( *(int *)(v4 + 52) < 0 )
{
LODWORD(v14) = MiInsertUnusedSubsection((_MSUBSECTION *)v4, v12);
v15 = v14;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v6);
if( v15 )
MiReturnCrossPartitionSectionCharges((_MI_CROSS_PARTITION_CHARGES *)Partition, 1i64, v15);
return -1073741792;
}
v16 = 1;
}
else
{
v16 = 0;
}
if( *(_QWORD *)(v4 + 96) )
KeBugCheckEx(0x1Au, (PVOID)0x42004, (PVOID)v4, 0i64, 0i64);
*(_QWORD *)(v4 + 96) = 1i64;
*(_WORD *)(v4 + 32) &= ~1u;
MiRemoveUnusedSegment((_CONTROL_AREA *)Flink);
*(_DWORD *)(Flink + 56) |= 0x100u;
P = *(_MMPTE **)(v4 + 8);
if( v16 == 1 )
{
++*(_DWORD *)(Flink + 76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v6);
v17 = MiIsSubsectionClean((_MSUBSECTION *)v4);
if( v17 )
{
if( v17 == MiSubsectionDirty )
{
v19 = ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
*(_DWORD *)(v4 + 52) |= 0x80000000;
v20 = v19;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v20);
}
v18 = -1073741792;
}
else
{
v18 = 0;
}
}
else
{
v21 = MiPreventControlAreaDelete((_CONTROL_AREA *)Flink);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v6);
StartingPte = *(_MMPTE **)(v4 + 8);
FinalPte = &StartingPte[*(unsigned int *)(v4 + 44) - 1];
v18 = FsRtlAcquireFileForCcFlushEx(v21);
v22 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
v23 = _InterlockedDecrement64((volatile signed __int64 *)(Flink + 112));
v40 = v23;
*(_QWORD *)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(Flink + 60) & 0x3FF)) + 1688i64) = 0i64;
if( v18 < 0 || (*(_DWORD *)(Flink + 56) & 1) != 0 )
{
if( v23 )
++*(_DWORD *)(Flink + 76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v22);
if( v18 >= 0 )
{
FsRtlReleaseFileForCcFlush(v21);
v18 = -1073741431;
}
if( !v40 )
{
MiDeleteControlArea((_CONTROL_AREA *)Flink);
ObfDereferenceObjectWithTag(v21, 0x746C6644ui64);
return v18;
}
}
else
{
++*(_DWORD *)(Flink + 76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v22);
KeGetCurrentThread()[1].TrapFrame = (_KTRAP_FRAME *)1;
LODWORD(Flags) = 2;
v18 = MiFlushSectionInternal(StartingPte, FinalPte, (_SUBSECTION *)v4, (_SUBSECTION *)v4, 0i64, Flags, &IoStatus);
KeGetCurrentThread()[1].TrapFrame = 0i64;
FsRtlReleaseFileForCcFlush(v21);
}
MiDereferenceControlAreaFile((_CONTROL_AREA *)Flink, v21);
}
v24 = ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
v25 = *(_DWORD *)(Flink + 56);
v26 = v24;
if( (v25 & 1) == 0 )
{
if( v18 >= 0 )
{
if( *(_QWORD *)(v4 + 96) == 1i64 && (*(_BYTE *)(v4 + 32) & 1) == 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8(v26);
v27 = MiPurgeSubsection((_MSUBSECTION *)v4) == 0;
v28 = ExAcquireSpinLockExclusive((INT64 *)(Flink + 72));
v25 = *(_DWORD *)(Flink + 56);
LOBYTE(v26) = v28;
v29 = v27;
goto LABEL_46;
}
v18 = -1073741823;
}
v29 = 1;
LABEL_46:
v30 = v25 & 0xFFFFFEFF;
*(_DWORD *)(Flink + 56) = v30;
if( (v30 & 1) != 0 )
goto LABEL_47;
v32 = 0i64;
if( v29 == 1 || *(_QWORD *)(v4 + 96) != 1i64 || *(_DWORD *)(v4 + 104) || (*(_BYTE *)(v4 + 32) & 1) != 0 )
{
v18 = -1073741823;
LODWORD(v33) = MiDecrementSubsectionViewCount((_MSUBSECTION *)v4);
v32 = v33;
if( !*(_QWORD *)(v4 + 96) )
{
LODWORD(v35) = MiInsertUnusedSubsection((_MSUBSECTION *)v4, v34);
v32 += v35;
}
P = 0i64;
}
else
{
MiUpdateSystemProtoPtesTree((_RTL_BALANCED_NODE *)(v4 + 112), 0i64);
*(_QWORD *)(v4 + 8) = 0i64;
*(_QWORD *)(v4 + 96) = 0i64;
}
v37 = MiDecrementModifiedWriteCount((_CONTROL_AREA *)Flink, 1ui64);
if( *(_QWORD *)(Flink + 24) | *(_QWORD *)(Flink + 40) )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
}
else
{
if( !*(_QWORD *)(Flink + 32) )
{
LOBYTE(v36) = v26;
MiDestroySection((_CONTROL_AREA *)Flink, v36, 0i64);
goto LABEL_64;
}
MiInsertUnusedSegment((_CONTROL_AREA *)Flink);
v32 += v38;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
}
__writecr8((unsigned __int8)v26);
LABEL_64:
if( v37 )
MiReleaseControlAreaWaiters(v37);
if( v32 )
MiReturnCrossPartitionSectionCharges((_MI_CROSS_PARTITION_CHARGES *)Partition, 1i64, v32);
if( P )
ExFreePoolWithTag(P, 0);
return v18;
}
*(_DWORD *)(Flink + 56) = v25 & 0xFFFFFEFF;
LABEL_47:
MiDecrementSubsectionViewCount((_MSUBSECTION *)v4);
v31 = MiDecrementModifiedWriteCount((_CONTROL_AREA *)Flink, 1ui64);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(Flink + 72));
__writecr8((unsigned __int8)v26);
if( v31 )
MiReleaseControlAreaWaiters(v31);
return -1073741823;
}Referenced by:
MiRemoveUnusedSegments