MiGetControlAreaPtes

NTSTATUS __stdcall MiGetControlAreaPtes(_CONTROL_AREA *ControlArea){
  union {unsigned int LongFlags;_MMSECTION_FLAGS Flags;} v1; 
  volatile int *p_ControlAreaLock; 
  unsigned __int64 v5; 
  _SUBSECTION *LastSubsection; 
  NTSTATUS v7; 

  v1.LongFlags = (unsigned int)ControlArea->u;
  if( (v1.LongFlags & 0x20) != 0 || !ControlArea->FilePointer.Value || (v1.LongFlags & 0x400) != 0 )
    return ControlArea->Segment->TotalNumberOfPtes;
  p_ControlAreaLock = &ControlArea->ControlAreaLock;
  v5 = (unsigned __int8)ExAcquireSpinLockShared((INT64 *)&ControlArea->ControlAreaLock);
  LastSubsection = MiFindLastSubsection(ControlArea, 1ui64);
  v7 = (LastSubsection->StartingSector | ((LastSubsection->u.SubsectionFlags._bf_0 & 0xFFC0) << 26))
     + LastSubsection->PtesInSubsection
     - (LastSubsection->_bf_34 & 0x3FFFFFFF);
  ExReleaseSpinLockSharedFromDpcLevel(p_ControlAreaLock);
  __writecr8(v5);
  return v7;
}

Referenced by:

MiMapViewOfDataSection
MiPfPrepareSequentialReadList