MiViewMayContainPage

void *__fastcall MiViewMayContainPage(__int64 a1, char a2, __int64 a3, unsigned __int64 a4, unsigned __int64 a5){
  UINT64 v5; 
  unsigned int v6; 
  void *v7; 
  __int64 v9; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  unsigned int v13; 
  unsigned __int64 v14; 
  unsigned __int64 v15; 
  int v17; 
  unsigned __int8 v18; 
  unsigned __int64 v19; 
  UINT64 v20; 
  __int64 v21; 
  void *v22; 
  unsigned __int64 v23; 
  __int64 v24; 
  __int64 v25; 
  unsigned __int64 v26; 
  unsigned __int64 v27; 
  v5 = *(_QWORD *)(a3 + 16);
  v6 = -1;
  v7 = 0i64;
  v9 = a3;
  if( (v5 & 3) != 0 )
  {
    switch( v5 & 3 )
    {
      case 1ui64:
        v7 = (void *)(v5 & 0xFFFFFFFFFFFFFFFEui64);
        v17 = a2 & 0x20;
        if( (*(_DWORD *)(a1 + 56) & 0x20) == 0 )
        {
          if( v17 && (*(_DWORD *)(a3 - 48) & 0x280) != 512 )
            return 0i64;
          v12 = MiStartingOffset(*(_QWORD *)(a3 - 24), *(_QWORD *)(a3 - 16), 0xFFFFFFFF);
          v18 = *(_BYTE *)(v9 - 64);
          a3 = *(unsigned int *)(v9 - 72);
          v15 = v12
              + (((*(unsigned int *)(v9 - 68) | ((unsigned __int64)*(unsigned __int8 *)(v9 - 63) << 32))
                - (a3 | ((unsigned __int64)v18 << 32))
                + 1) << 12);
          goto LABEL_16;
        }
        if( !v17 )
        {
          v18 = *(_BYTE *)(a3 - 64);
          v12 = 0i64;
          LODWORD(a3) = *(_DWORD *)(a3 - 72);
          v15 = 0i64;
LABEL_16:
          v5 = ((unsigned int)a3 | ((unsigned __int64)v18 << 32)) << 12;
          goto LABEL_7;
        }
        break;
      case 2ui64:
        v5 &= ~2ui64;
        if( *(_DWORD *)(a3 + 24) != -1 )
          v6 = *(_DWORD *)(a3 + 24);
        v12 = *(_QWORD *)(a3 - 48) << 12;
        v15 = v12 + *(_QWORD *)(a3 - 40);
        goto LABEL_7;
      case 3ui64:
        v5 &= 0xFFFFFFFFFFFFFFFCui64;
        v6 = *(_DWORD *)(a3 + 32);
        v15 = *(_QWORD *)(a3 + 24) - v5 + 1;
        if( (*(_DWORD *)(a1 + 56) & 0x20) != 0 )
        {
          v24 = a1 + 128;
          if( (unsigned int)MiGetSystemRegionType(v5) != 1 )
            v6 = -2;
          while( v24 )
          {
            v27 = MiStartingOffset(v24, *(_QWORD *)(v24 + 8), v6);
            if( a4 < MiEndingOffsetWithLock(v24) && a4 >= v27 )
            {
              v25 = *(_QWORD *)(v24 + 8);
              v26 = v25 + 8 * ((a4 - v27) >> 12);
              if( v26 < v25 + 8 * (unsigned __int64)*(unsigned int *)(v24 + 44)
                && ((*(_BYTE *)(v24 + 34) & 2) == 0 || (*(_DWORD *)(a1 + 56) & 0x4000000) == 0) )
              {
                v5 += (__int64)(v26 - *(_QWORD *)(a1 + 136)) >> 3 << 12;
                goto LABEL_47;
              }
              return 0i64;
            }
            v24 = *(_QWORD *)(v24 + 16);
          }
          return 0i64;
        }
LABEL_47:
        v12 = 0i64;
        goto LABEL_7;
    }
    return 0i64;
  }
  v11 = *(_QWORD *)(a3 + 32);
  v12 = v11;
  if( (v5 & 3) == 0 )
    v12 = 4 * (v11 & 0xFFFFFFFFFFFF0000ui64);
  v13 = v11 & 0x3F;
  if( v13 )
    v14 = (unsigned __int64)v13 << 12;
  else
    v14 = 0x40000i64;
  v15 = v12 + v14;
  if( !v5 )
    return 0i64;
LABEL_7:
  if( (*(_DWORD *)(a1 + 56) & 0x20) != 0 )
  {
    v19 = 0i64;
    v20 = v5 + 4096;
  }
  else
  {
    if( a4 >= v15 || a5 <= v12 )
      return 0i64;
    v19 = v12;
    if( a4 >= v12 )
    {
      v19 = a4;
      v5 += a4 - v12;
    }
    v23 = a5 - v19;
    if( a5 > v15 )
      v23 = v15 - v19;
    v20 = v5 + v23;
  }
  LODWORD(v21) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
  v22 = (void *)v21;
  if( v21 )
  {
    *(_QWORD *)(v21 + 16) = v5;
    *(_QWORD *)(v21 + 24) = v20;
    *(_QWORD *)(v21 + 8) = v7;
    *(_QWORD *)(v21 + 32) = v19;
    *(_DWORD *)(v21 + 40) = v6;
    *(_DWORD *)(v21 + 44) = *(_DWORD *)(v9 + 16) & 3;
    if( v7 )
    {
      if( !ObReferenceObjectSafeWithTag(v7, 0x746C6644ui64) )
      {
        ExFreePoolWithTag(v22, 0);
        return 0i64;
      }
    }
  }
  return v22;
}

Referenced by:

MiTrimSection