MiDeleteCachedSubsection
NTSTATUS __stdcall MiDeleteCachedSubsection(_MI_PARTITION *Partition){
INT64 *v1;
__int64 v3;
ULONG_PTR v4;
_QWORD **v5;
unsigned __int64 v6;
_QWORD *i;
NTSTATUS result;
_QWORD *v9;
__int64 v10;
_QWORD *v11;
UINT64 v12;
int v13;
UINT64 inserted;
int v15;
UINT64 v16;
int IsSubsectionClean;
NTSTATUS v18;
KIRQL v19;
unsigned __int64 v20;
_FILE_OBJECT *v21;
unsigned __int64 v22;
signed __int64 v23;
KIRQL v24;
int v25;
unsigned __int64 v26;
BOOL v27;
KIRQL v28;
int v29;
unsigned int v30;
_QWORD *v31;
_QWORD *v32;
INT64 v33;
UINT64 v34;
INT16 v35;
_QWORD *v36;
_QWORD *v37;
signed __int64 v38;
__int128 v39[6];
__int64 v41;
PVOID P;
ULONG_PTR v43;
v1 = (INT64 *)((char *)Partition + 1344);
v3 = 1i64;
v39[0] = 0i64;
v4 = 1i64;
v5 = (_QWORD **)((char *)Partition + 1720);
v6 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)Partition + 336);
for( i = *v5; i != v5; i = (_QWORD *)*i )
{
v4 = (ULONG_PTR)(i - 10);
v3 = *(i - 10);
if( (unsigned int)ExTryAcquireSpinLockExclusiveAtDpcLevel((INT64 *)(v3 + 72)) )
break;
}
if( i == v5 )
{
ExReleaseSpinLockExclusiveFromDpcLevel(v1);
result = -1073741275;
LABEL_11:
__writecr8(v6);
return result;
}
v9 = (_QWORD *)(v4 + 80);
v10 = *(_QWORD *)(v4 + 80);
v11 = *(_QWORD **)(v4 + 88);
if( *(_QWORD *)(v10 + 8) != v4 + 80 || (_QWORD *)*v11 != v9 )
__fastfail(3u);
*v11 = v10;
*(_QWORD *)(v10 + 8) = v11;
*(_WORD *)(v4 + 34) &= ~8u;
*(_QWORD *)(v4 + 88) = v4 + 80;
*v9 = v9;
MiReduceUnusedSubsectionCount((_MSUBSECTION *)v4);
ExReleaseSpinLockExclusiveFromDpcLevel(v1);
v13 = *(_DWORD *)(v3 + 56);
if( (v13 & 1) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
result = -1073741709;
goto LABEL_11;
}
if( (v13 & 8) != 0 )
{
if( *(int *)(v4 + 52) < 0 )
{
inserted = MiInsertUnusedSubsection((_MSUBSECTION *)v4, v12);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v6);
if( inserted )
MiReturnCrossPartitionSectionCharges((volatile INT64 *)Partition, 1i64, inserted);
return -1073741792;
}
v15 = 1;
}
else
{
v15 = 0;
}
if( *(_QWORD *)(v4 + 96) )
KeBugCheckEx(0x1Au, 0x42004ui64, v4, 0i64, 0i64);
*(_QWORD *)(v4 + 96) = 1i64;
*(_WORD *)(v4 + 32) &= ~1u;
MiRemoveUnusedSegment((_CONTROL_AREA *)v3);
*(_DWORD *)(v3 + 56) |= 0x100u;
P = *(PVOID *)(v4 + 8);
if( v15 == 1 )
{
++*(_DWORD *)(v3 + 76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v6);
IsSubsectionClean = MiIsSubsectionClean(v4, v16);
if( IsSubsectionClean )
{
if( IsSubsectionClean == 1 )
{
v19 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v3 + 72));
*(_DWORD *)(v4 + 52) |= 0x80000000;
v20 = v19;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v20);
}
v18 = -1073741792;
}
else
{
v18 = 0;
}
}
else
{
v21 = (_FILE_OBJECT *)MiPreventControlAreaDelete(v3);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v6);
v43 = *(_QWORD *)(v4 + 8);
v41 = v43 - 8 + 8i64 * *(unsigned int *)(v4 + 44);
v18 = FsRtlAcquireFileForCcFlushEx(v21);
v22 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v3 + 72));
v23 = _InterlockedDecrement64((volatile signed __int64 *)(v3 + 112));
v38 = v23;
*(_QWORD *)(*(_QWORD *)(qword_140C4E388 + 8i64 * (*(_WORD *)(v3 + 60) & 0x3FF)) + 1688i64) = 0i64;
if( v18 < 0 || (*(_DWORD *)(v3 + 56) & 1) != 0 )
{
if( v23 )
++*(_DWORD *)(v3 + 76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v22);
if( v18 >= 0 )
{
FsRtlReleaseFileForCcFlush(v21);
v18 = -1073741431;
}
if( !v38 )
{
MiDeleteControlArea((_CONTROL_AREA *)v3);
ObfDereferenceObjectWithTag(v21, 0x746C6644ui64);
return v18;
}
}
else
{
++*(_DWORD *)(v3 + 76);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v22);
*((_QWORD *)KeGetCurrentThread() + 152) = 1i64;
v18 = MiFlushSectionInternal(v43, v41, (__int64 *)v4, v4, 0i64, 2u, (__int64)v39);
*((_QWORD *)KeGetCurrentThread() + 152) = 0i64;
FsRtlReleaseFileForCcFlush(v21);
}
MiDereferenceControlAreaFile(v3, (unsigned __int64)v21);
}
v24 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v3 + 72));
v25 = *(_DWORD *)(v3 + 56);
v26 = v24;
if( (v25 & 1) == 0 )
{
if( v18 >= 0 )
{
if( *(_QWORD *)(v4 + 96) == 1i64 && (*(_BYTE *)(v4 + 32) & 1) == 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8(v26);
v27 = MiPurgeSubsection((_MSUBSECTION *)v4) == 0;
v28 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v3 + 72));
v25 = *(_DWORD *)(v3 + 56);
LOBYTE(v26) = v28;
v29 = v27;
goto LABEL_46;
}
v18 = -1073741823;
}
v29 = 1;
LABEL_46:
v30 = v25 & 0xFFFFFEFF;
*(_DWORD *)(v3 + 56) = v30;
if( (v30 & 1) != 0 )
goto LABEL_47;
v33 = 0i64;
if( v29 == 1 || *(_QWORD *)(v4 + 96) != 1i64 || *(_DWORD *)(v4 + 104) || (*(_BYTE *)(v4 + 32) & 1) != 0 )
{
v18 = -1073741823;
v33 = MiDecrementSubsectionViewCount((INT64 *)v4, 0);
if( !*(_QWORD *)(v4 + 96) )
v33 += MiInsertUnusedSubsection((_MSUBSECTION *)v4, v34);
P = 0i64;
}
else
{
MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)(v4 + 112), 0i64);
*(_QWORD *)(v4 + 8) = 0i64;
*(_QWORD *)(v4 + 96) = 0i64;
}
MiDecrementModifiedWriteCount((_CONTROL_AREA *)v3, (_BYTE *)1);
v37 = v36;
if( *(_QWORD *)(v3 + 24) | *(_QWORD *)(v3 + 40) )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
}
else
{
if( !*(_QWORD *)(v3 + 32) )
{
LOBYTE(v35) = v26;
MiDestroySection((_CONTROL_AREA *)v3, v35, 0i64);
goto LABEL_64;
}
v33 += MiInsertUnusedSegment((_CONTROL_AREA *)v3);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
}
__writecr8((unsigned __int8)v26);
LABEL_64:
if( v37 )
MiReleaseControlAreaWaiters(v37);
if( v33 )
MiReturnCrossPartitionSectionCharges((volatile INT64 *)Partition, 1i64, v33);
if( P )
ExFreePoolWithTag(P, 0);
return v18;
}
*(_DWORD *)(v3 + 56) = v25 & 0xFFFFFEFF;
LABEL_47:
MiDecrementSubsectionViewCount((INT64 *)v4, 0);
MiDecrementModifiedWriteCount((_CONTROL_AREA *)v3, (_BYTE *)1);
v32 = v31;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v3 + 72));
__writecr8((unsigned __int8)v26);
if( v32 )
MiReleaseControlAreaWaiters(v32);
return -1073741823;
}Referenced by:
MiRemoveUnusedSegments