MiViewMayContainPage

_MI_VIEW_INFO *__stdcall MiViewMayContainPage(
        _CONTROL_AREA *ControlArea,
        _LIST_ENTRY *NextEntry,
        UINT64 StartingOffset,
        UINT64 EndingOffset){
  UINT64 v4; 
  unsigned int v5; 
  unsigned __int64 v6; 
  UINT64 v8; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  unsigned int v12; 
  unsigned __int64 v13; 
  UINT64 v14; 
  int v16; 
  unsigned __int64 v17; 
  unsigned __int8 v18; 
  UINT64 v19; 
  UINT64 v20; 
  VOID *Pool; 
  void *v22; 
  UINT64 v23; 
  _CONTROL_AREA *v24; 
  unsigned __int64 v25; 
  UINT64 v26; 
  __int64 v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 

  v4 = *(_QWORD *)(StartingOffset + 16);
  v5 = -1;
  v6 = 0i64;
  v8 = StartingOffset;
  if( (v4 & 3) != 0 )
  {
    switch( v4 & 3 )
    {
      case 1ui64:
        v6 = v4 & 0xFFFFFFFFFFFFFFFEui64;
        v16 = (unsigned __int8)NextEntry & 0x20;
        if( (ControlArea->u.LongFlags & 0x20) == 0 )
        {
          if( v16 && (*(_DWORD *)(StartingOffset - 48) & 0x280) != 512 )
            return 0i64;
          LODWORD(v17) = MiStartingOffset(
                           *(_SUBSECTION **)(StartingOffset - 24),
                           *(_MMPTE **)(StartingOffset - 16),
                           0xFFFFFFFFui64);
          v11 = v17;
          v18 = *(_BYTE *)(v8 - 64);
          StartingOffset = *(unsigned int *)(v8 - 72);
          v14 = v11
              + (((*(unsigned int *)(v8 - 68) | ((unsigned __int64)*(unsigned __int8 *)(v8 - 63) << 32))
                - (StartingOffset | ((unsigned __int64)v18 << 32))
                + 1) << 12);
          goto LABEL_16;
        }
        if( !v16 )
        {
          v18 = *(_BYTE *)(StartingOffset - 64);
          v11 = 0i64;
          LODWORD(StartingOffset) = *(_DWORD *)(StartingOffset - 72);
          v14 = 0i64;
LABEL_16:
          v4 = ((unsigned int)StartingOffset | ((unsigned __int64)v18 << 32)) << 12;
          goto LABEL_7;
        }
        break;
      case 2ui64:
        v4 &= ~2ui64;
        if( *(_DWORD *)(StartingOffset + 24) != -1 )
          v5 = *(_DWORD *)(StartingOffset + 24);
        v11 = *(_QWORD *)(StartingOffset - 48) << 12;
        v14 = v11 + *(_QWORD *)(StartingOffset - 40);
        goto LABEL_7;
      case 3ui64:
        v4 &= 0xFFFFFFFFFFFFFFFCui64;
        v5 = *(_DWORD *)(StartingOffset + 32);
        v14 = *(_QWORD *)(StartingOffset + 24) - v4 + 1;
        if( (ControlArea->u.LongFlags & 0x20) != 0 )
        {
          v24 = ControlArea + 1;
          if( MiGetSystemRegionType(v4) != 1 )
            v5 = -2;
          while( v24 )
          {
            LODWORD(v25) = MiStartingOffset((_SUBSECTION *)v24, *(_MMPTE **)v24->gap8, v5);
            v29 = v25;
            LODWORD(v26) = MiEndingOffsetWithLock((_SUBSECTION *)v24);
            if( EndingOffset < v26 && EndingOffset >= v29 )
            {
              v27 = *(_QWORD *)v24->gap8;
              v28 = v27 + 8 * ((EndingOffset - v29) >> 12);
              if( v28 < v27 + 8 * (unsigned __int64)HIDWORD(v24->NumberOfMappedViews)
                && ((v24->NumberOfPfnReferences & 0x20000) == 0 || (ControlArea->u.LongFlags & 0x4000000) == 0) )
              {
                v4 += (__int64)(v28 - *(_QWORD *)ControlArea[1].gap8) >> 3 << 12;
                goto LABEL_47;
              }
              return 0i64;
            }
            v24 = *(_CONTROL_AREA **)&v24->gap8[8];
          }
          return 0i64;
        }
LABEL_47:
        v11 = 0i64;
        goto LABEL_7;
    }
    return 0i64;
  }
  v10 = *(_QWORD *)(StartingOffset + 32);
  v11 = v10;
  if( (v4 & 3) == 0 )
    v11 = 4 * (v10 & 0xFFFFFFFFFFFF0000ui64);
  v12 = v10 & 0x3F;
  if( v12 )
    v13 = (unsigned __int64)v12 << 12;
  else
    v13 = 0x40000i64;
  v14 = v11 + v13;
  if( !v4 )
    return 0i64;
LABEL_7:
  if( (ControlArea->u.LongFlags & 0x20) != 0 )
  {
    v19 = 0i64;
    v20 = v4 + 4096;
  }
  else
  {
    if( EndingOffset >= v14 || v30 <= v11 )
      return 0i64;
    v19 = v11;
    if( EndingOffset >= v11 )
    {
      v19 = EndingOffset;
      v4 += EndingOffset - v11;
    }
    v23 = v30 - v19;
    if( v30 > v14 )
      v23 = v14 - v19;
    v20 = v4 + v23;
  }
  Pool = MiAllocatePool(64i64, 0x30ui64, 0x6156694Dui64);
  v22 = Pool;
  if( Pool )
  {
    *((_QWORD *)Pool + 2) = v4;
    *((_QWORD *)Pool + 3) = v20;
    *((_QWORD *)Pool + 1) = v6;
    *((_QWORD *)Pool + 4) = v19;
    *((_DWORD *)Pool + 10) = v5;
    *((_DWORD *)Pool + 11) = *(_DWORD *)(v8 + 16) & 3;
    if( v6 )
    {
      if( !ObReferenceObjectSafeWithTag(v6, 1953261124i64) )
      {
        ExFreePoolWithTag(v22, 0);
        return 0i64;
      }
    }
  }
  return(_MI_VIEW_INFO *)v22;
}

Referenced by:

MiTrimSection