MiUpControlAreaRefs
VOID __stdcall MiUpControlAreaRefs(_MMVAD_SHORT *Vad){
int v1;
int v2;
INT64 v4;
NTSTATUS v5;
__int64 v6;
union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v7;
UINT64 v8;
_MSUBSECTION *v9;
UINT8 v10;
unsigned __int64 v11;
int v12;
_SUBSECTION *v13;
_SUBSECTION *p_Core;
__int64 v15;
__int64 v16;
UINT64 v17;
UINT64 v18;
_ETHREAD *v19;
unsigned int SessionId;
unsigned __int8 v21;
int v22;
bool v23;
__int64 v24;
_KLOCK_ENTRY *v25;
__int64 v26;
int v27;
int v28;
_BOOL4 a2;
_SUBSECTION *Subsection;
_EX_PUSH_LOCK *v31;
_ETHREAD *CurrentThread;
NTSTATUS active;
int v34;
UINT64 a3;
v34 = v1;
v2 = v1;
v28 = 0;
v4 = *(_QWORD *)Vad[1].ExtraCreateInfo;
v5 = MiControlAreaRequiresCharge(v4);
if( v5 )
{
v6 = *(_QWORD *)(v4 + 64);
v7.LongFlags = (unsigned int)Vad->u;
a2 = v6 != 0;
if( ((v7.LongFlags & 0xF80) == 512 || (v7.LongFlags & 0xF80) == 768) && v6 && (*(_DWORD *)(v4 + 56) & 0x20) == 0 )
{
if( v2 )
_InterlockedIncrement((volatile signed __int32 *)(v4 + 92));
else
_InterlockedAdd((volatile signed __int32 *)(v4 + 92), 0xFFFFFFFF);
v28 = 1;
}
v8 = 0i64;
active = 0;
v9 = 0i64;
v27 = 0;
Subsection = 0i64;
if( (*(_DWORD *)(v4 + 56) & 0x400) == 0 )
{
MiLockNestedVad(Vad);
if( !*(_QWORD *)(v4 + 64) || (*(_DWORD *)(v4 + 56) & 0x20) != 0 )
{
v9 = (_MSUBSECTION *)(v4 + 128);
Subsection = (_SUBSECTION *)(v4 + 128);
}
else
{
MiGetProtoPteAddress();
v9 = 0i64;
}
if( v9 )
v27 = 1;
else
MiUnlockNestedVad(Vad);
}
if( *(_QWORD *)(v4 + 64) )
{
CurrentThread = 0i64;
v31 = 0i64;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v31 = *(_EX_PUSH_LOCK **)v4;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(v31 + 5, 0i64);
v9 = (_MSUBSECTION *)Subsection;
}
v10 = ExAcquireSpinLockExclusive((INT64 *)(v4 + 72));
++*(_QWORD *)(v4 + 40);
++*(_QWORD *)(v4 + 48);
v11 = v10;
if( v9 )
{
v12 = *(_DWORD *)(v4 + 56);
if( (v12 & 0x20) == 0 && *(_QWORD *)(v4 + 64) )
{
MiGetProtoPteAddress();
v13 = 0i64;
p_Core = &v9->Core;
while( 1 )
{
if( v34 )
{
active = MiReferenceActiveSubsection(p_Core, 8ui64, v11);
if( active < 0 )
{
if( v13 )
{
LODWORD(v15) = MiDecrementSubsections(&v9->Core, v13, 8ui64);
v8 += v15;
}
goto LABEL_39;
}
}
else
{
LODWORD(v16) = MiDecrementSubsections(&v9->Core, &v9->Core, 8ui64);
v8 += v16;
}
v13 = p_Core;
p_Core = p_Core->NextSubsection;
if( !p_Core )
goto LABEL_39;
}
}
if( v2 )
{
active = MiReferenceActiveSubsection(&v9->Core, 8ui64, v10);
goto LABEL_39;
}
if( (v12 & 0x20) != 0 )
{
if( v5 != 2 )
goto LABEL_39;
LODWORD(v17) = MiDecrementSubsectionViewCount(v9);
}
else
{
LODWORD(v17) = MiDecrementSubsections(&v9->Core, &v9->Core, 8ui64);
}
v8 = v17;
}
LABEL_39:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v4 + 72));
__writecr8(v11);
if( v8 )
MiReturnCrossPartitionSectionCharges(
*(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(v4 + 60) & 0x3FF)),
a2,
v8);
if( !*(_QWORD *)(v4 + 64) )
{
v18 = (UINT64)&v31[5];
if( (_InterlockedExchangeAdd64(&v31[5]._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v18);
LODWORD(a3) = 0;
v19 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v18) == 1 )
SessionId = MmGetSessionIdEx(v19->Tcb.ApcState.Process);
else
SessionId = -1;
--v19->Tcb.SpecialApcDisable;
v21 = ++v19->Tcb.AbAllocationRegionCount;
v22 = ((char)v19->Tcb.AbEntrySummary | (char)v19->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
v23 = !_BitScanReverse((unsigned int *)&v24, v22);
if( v23 )
break;
v25 = &v19->Tcb.LockEntries[v24];
v22 &= ~(1 << v24);
if( (v25->AcquiredByte & 1) != 0
&& (v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v18 & 0x7FFFFFFFFFFFFFFCi64)
&& v25->LockState.SessionId == SessionId )
{
v25->AcquiredByte &= ~1u;
if( v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
{
if( v25 )
{
v25->CrossThreadReleasableAndBusyByte |= 2u;
if( v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v25);
LODWORD(a3) = v25->BoostBitmap.AllFields & 0x1FFFF;
v25->BoostBitmap.AllFields &= 0xFFFE0000;
v25->ThreadLocalFlags &= ~1u;
v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v26 = v25 - v19->Tcb.LockEntries;
if( v21 == 1 )
v19->Tcb.AbEntrySummary |= 1 << v26;
else
_InterlockedOr8((volatile signed __int8 *)&v19->Tcb.AbOrphanedEntrySummary, 1 << v26);
goto LABEL_60;
}
break;
}
}
}
if( (*(&v19->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v19, (PVOID)v18, (PVOID)SessionId, 0i64);
LABEL_60:
--v19->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v19->Tcb, (VOID *)v18, &a3);
v23 = v19->Tcb.SpecialApcDisable++ == -1;
if( v23 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v19->Tcb.ApcState.ApcListHead[0].Flink != &v19->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
if( v27 == 1 )
MiUnlockNestedVad(Vad);
if( active < 0 && v28 == 1 )
_InterlockedDecrement((volatile signed __int32 *)(v4 + 92));
}
}Referenced by:
MiDeletePartialVad
MiInsertChildVads