MiAppendSubsectionChain
NTSTATUS __stdcall MiAppendSubsectionChain(
_MSUBSECTION *LastSubsection,
_MSUBSECTION *ExtendedSubsectionHead,
UINT64 AllocationFlags){
_MSUBSECTION *NextSubsection;
char v5;
bool v6;
UINT64 v7;
unsigned __int8 v8;
UINT64 v9;
_CONTROL_AREA *v10;
NTSTATUS v11;
unsigned __int64 v12;
unsigned int NumberOfFullSectors;
_SUBSECTION *v14;
_MSUBSECTION *v15;
_MSUBSECTION *i;
int v18;
__int64 v19;
__int64 v20;
__int64 v21;
_CONTROL_AREA *ControlArea;
NextSubsection = (_MSUBSECTION *)ExtendedSubsectionHead->Core.NextSubsection;
v5 = AllocationFlags;
v6 = 0;
ControlArea = LastSubsection->Core.ControlArea;
v7 = 0i64;
v8 = ExAcquireSpinLockExclusive((INT64 *)&LastSubsection->Core.ControlArea->ControlAreaLock);
v10 = ControlArea;
v11 = 2;
v12 = v8;
if( ControlArea->NumberOfUserReferences )
{
if( (LastSubsection->Core.u1.e1._bf_0 & 0x3FFFFFFF) != 0 )
{
if( (v5 & 2) == 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
goto LABEL_13;
}
}
else
{
v6 = (v5 & 2) != 0;
}
if( (v5 & 1) != 0 )
{
for( i = NextSubsection; i; i = *(_MSUBSECTION **)(v19 + 16) )
{
i->Core.u.SubsectionFlags._bf_2 |= 1u;
LOBYTE(v18) = MiControlAreaUsingExtents((INT64)v10);
if( v18 )
*(_DWORD *)(v19 + 52) |= 0x40000000u;
}
goto LABEL_18;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
v11 = 1;
LABEL_13:
__writecr8(v12);
return v11;
}
if( NextSubsection->Core.SubsectionBase )
{
do
{
if( (NextSubsection->Core.u1.e1._bf_0 & 0x3FFFFFFF) != 0 )
MiUpdateSubsectionCrossPartitionRefs(NextSubsection, 0x3FFFFFFF);
NextSubsection->NumberOfMappedViews = 0i64;
LODWORD(v20) = MiInsertUnusedSubsection(NextSubsection, v9);
NextSubsection = (_MSUBSECTION *)NextSubsection->Core.NextSubsection;
v7 += v20;
}
while( NextSubsection );
goto LABEL_28;
}
if( (v5 & 2) != 0 )
{
v6 = 1;
LABEL_18:
if( !v6 )
goto LABEL_4;
do
{
LODWORD(v21) = MiDecrementSubsectionViewCount(NextSubsection);
NextSubsection = (_MSUBSECTION *)NextSubsection->Core.NextSubsection;
v7 += v21;
}
while( NextSubsection );
LABEL_28:
v10 = ControlArea;
}
LABEL_4:
LastSubsection->Core.u.SubsectionFlags._bf_2 &= 0xFu;
NumberOfFullSectors = ExtendedSubsectionHead->Core.NumberOfFullSectors;
LastSubsection->Core._bf_34 &= 0xC0000000;
LastSubsection->Core.NumberOfFullSectors = NumberOfFullSectors;
v14 = ExtendedSubsectionHead->Core.NextSubsection;
LastSubsection->Core.NextSubsection = v14;
v15 = (_MSUBSECTION *)v14;
if( v14 )
{
do
{
MiInsertSubsectionNode(v10, v15, 1ui64);
v15 = (_MSUBSECTION *)v15->Core.NextSubsection;
v10 = ControlArea;
}
while( v15 );
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
__writecr8(v12);
if( v7 )
MiReturnCrossPartitionSectionCharges(
*(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (ControlArea->u1.Flags._bf_0 & 0x3FF)),
1i64,
v7);
return 0;
}Referenced by:
MiExtendSection