MiUpdateLastSubsectionSize

NTSTATUS __stdcall MiUpdateLastSubsectionSize(_SUBSECTION *LastSubsection, UINT64 *NewSectionSize, UINT64 PtesUsed){
  _CONTROL_AREA *ControlArea; 
  UINT64 v5; 
  int v7; 
  INT64 *p_ControlAreaLock; 
  unsigned __int64 v9; 
  INT64 v10; 
  __int64 v11; 
  _SEGMENT *Segment; 
  unsigned __int16 Short0; 
  __int64 TotalNumberOfPtes; 
  NTSTATUS result; 

  ControlArea = LastSubsection->ControlArea;
  v5 = (unsigned int)PtesUsed;
  v7 = 0;
  p_ControlAreaLock = (INT64 *)&LastSubsection->ControlArea->ControlAreaLock;
  while( 1 )
  {
    v9 = (unsigned __int8)ExAcquireSpinLockExclusive(p_ControlAreaLock);
    if( !(_DWORD)v5 )
      break;
    LODWORD(v10) = MiGetSubsectionHoldingCrossPartitionReferences((INT64)LastSubsection);
    LODWORD(v11) = MiGetSubsectionHoldingCrossPartitionReferences(v10);
    if( (*(_DWORD *)(v11 + 48) & 0x3FFFFFFF) == 0 )
    {
      if( v7 == 1 )
        v7 = 2;
LABEL_6:
      LastSubsection->_bf_34 ^= (LastSubsection->_bf_34 ^ (LastSubsection->_bf_34 - v5)) & 0x3FFFFFFF;
      break;
    }
    if( v7 )
      goto LABEL_6;
    ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
    __writecr8(v9);
    result = MiGetSubsectionCharges((UINT8)LastSubsection);
    if( result < 0 )
      return result;
    v7 = 1;
  }
  LastSubsection->NumberOfFullSectors = (*NewSectionSize >> 12)
                                      - (LastSubsection->StartingSector | ((LastSubsection->u.SubsectionFlags._bf_0 & 0xFFC0) << 26));
  LastSubsection->u.SubsectionFlags._bf_2 = LastSubsection->u.SubsectionFlags._bf_2 & 0xF | (16
                                                                                           * *(_WORD *)NewSectionSize);
  ExReleaseSpinLockExclusiveFromDpcLevel(p_ControlAreaLock);
  __writecr8(v9);
  if( (_DWORD)v5 )
  {
    Segment = ControlArea->Segment;
    _InterlockedExchange64(
      (volatile __int64 *)&ControlArea->Segment->SizeOfSegment,
      _InterlockedCompareExchange64((volatile signed __int64 *)&ControlArea->Segment->SizeOfSegment, -1i64, -1i64)
    + (v5 << 12));
    Short0 = Segment->SegmentFlags.Short0;
    TotalNumberOfPtes = Segment->TotalNumberOfPtes;
    Segment->TotalNumberOfPtes = v5 + TotalNumberOfPtes;
    Segment->SegmentFlags.Short0 = Short0 ^ (Short0 ^ ((v5
                                                      + (TotalNumberOfPtes | ((unsigned __int64)(Short0 & 0x3FF) << 32))) >> 32)) & 0x3FF;
    if( v7 == 2 )
      MiReturnCrossPartitionSectionCharges(
        *(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (ControlArea->u1.Flags._bf_0 & 0x3FF)),
        1i64,
        v5);
  }
  return 0;
}

Referenced by:

MmExtendSection