MiAppendSubsectionChain
INT64 __fastcall MiAppendSubsectionChain(INT64 a1, INT64 a2, CHAR a3){
__int64 v4;
bool v6;
UINT64 v7;
KIRQL v8;
UINT64 v9;
_CONTROL_AREA *v10;
unsigned int v11;
unsigned __int64 v12;
int v13;
__int64 v14;
__int64 j;
__int64 i;
__int64 v18;
UINT64 inserted;
INT64 v20;
_CONTROL_AREA *ControlArea;
v4 = *(_QWORD *)(a2 + 16);
v6 = 0;
ControlArea = *(_CONTROL_AREA **)a1;
v7 = 0i64;
v8 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(*(_QWORD *)a1 + 72i64));
v10 = ControlArea;
v11 = 2;
v12 = v8;
if( *((_QWORD *)ControlArea + 6) )
{
if( (*(_DWORD *)(a1 + 48) & 0x3FFFFFFF) != 0 )
{
if( (a3 & 2) == 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)ControlArea + 9);
goto LABEL_13;
}
}
else
{
v6 = (a3 & 2) != 0;
}
if( (a3 & 1) != 0 )
{
for( i = v4; i; i = *(_QWORD *)(v18 + 16) )
{
*(_WORD *)(i + 34) |= 1u;
if( MiControlAreaUsingExtents((INT64)v10) )
*(_DWORD *)(v18 + 52) |= 0x40000000u;
}
goto LABEL_18;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)ControlArea + 9);
v11 = 1;
LABEL_13:
__writecr8(v12);
return v11;
}
if( *(_QWORD *)(v4 + 8) )
{
do
{
if( (*(_DWORD *)(v4 + 48) & 0x3FFFFFFF) != 0 )
MiUpdateSubsectionCrossPartitionRefs((_DWORD *)v4, 0x3FFFFFFFi64);
*(_QWORD *)(v4 + 96) = 0i64;
inserted = MiInsertUnusedSubsection((_MSUBSECTION *)v4, v9);
v4 = *(_QWORD *)(v4 + 16);
v7 += inserted;
}
while( v4 );
goto LABEL_28;
}
if( (a3 & 2) != 0 )
{
v6 = 1;
LABEL_18:
if( !v6 )
goto LABEL_4;
do
{
v20 = MiDecrementSubsectionViewCount((INT64 *)v4, 24);
v4 = *(_QWORD *)(v4 + 16);
v7 += v20;
}
while( v4 );
LABEL_28:
v10 = ControlArea;
}
LABEL_4:
*(_WORD *)(a1 + 34) &= 0xFu;
v13 = *(_DWORD *)(a2 + 40);
*(_DWORD *)(a1 + 52) &= 0xC0000000;
*(_DWORD *)(a1 + 40) = v13;
v14 = *(_QWORD *)(a2 + 16);
*(_QWORD *)(a1 + 16) = v14;
for( j = v14; j; v10 = ControlArea )
{
MiInsertSubsectionNode(v10, (_MSUBSECTION *)j, 1ui64);
j = *(_QWORD *)(j + 16);
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)ControlArea + 9);
__writecr8(v12);
if( v7 )
MiReturnCrossPartitionSectionCharges(
*(volatile INT64 **)(qword_140C4E388 + 8i64 * (*((_WORD *)ControlArea + 30) & 0x3FF)),
1i64,
v7);
return 0i64;
}Referenced by:
MiExtendSection