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