MiMapViewOfImageSection

INT64 __fastcall MiMapViewOfImageSection(
        _CONTROL_AREA *ControlArea,
        _EPROCESS *RequestingProcess,
        _EPROCESS *Process,
        VOID **CapturedBase,
        _LARGE_INTEGER *SectionOffset,
        UINT64 *CapturedViewSize,
        _SECTION *Section,
        _SECTION_INHERIT InheritDisposition,
        UINT64 ProtectionMask,
        UINT64 ZeroBits,
        UINT64 AllocationType,
        UINT64 ImageMapFlags,
        UINT64 PreferredNode){
  _CONTROL_AREA *v14; 
  __int64 v15; 
  unsigned __int64 v16; 
  unsigned int v17; 
  INT64 v18; 
  int v19; 
  INT64 v20; 
  int v21; 
  unsigned int v22; 
  char *v23; 
  UINT64 v24; 
  INT64 v25; 
  INT64 v26; 
  unsigned int v27; 
  int v28; 
  int v29; 
  int v30; 
  unsigned int v31; 
  int v32; 
  VOID *v33; 
  int v34; 
  _ETHREAD *CurrentThread; 
  VOID *v36; 
  UINT64 v37; 
  int v38; 
  int v39; 
  UINT64 v40; 
  char *v41; 
  unsigned __int64 v42; 
  ULONG_PTR v43; 
  unsigned __int64 v44; 
  unsigned __int64 v45; 
  int v46; 
  _CONTROL_AREA *v47; 
  int PerSessionProtos; 
  int v49; 
  int v50; 
  _FILE_OBJECT *v51; 
  char *v52; 
  unsigned __int16 v53; 
  int v54; 
  unsigned int v55; 
  _CONTROL_AREA *v56; 
  __int64 v57; 
  ULONG v58; 
  int v59; 
  __int64 v60; 
  __int64 v61; 
  __int64 v62; 
  RTL_BITMAP *FixupVad; 
  UINT64 v64; 
  UINT64 v65; 
  UINT64 v66; 
  unsigned int v67; 
  __int64 v68; 
  __int16 v69; 
  __int64 v70; 
  __int16 v71; 
  unsigned __int64 v72; 
  __int64 v73; 
  __int16 v74; 
  void *v75; 
  unsigned int SessionId; 
  NTSTATUS LargePageVad; 
  struct _DMA_ADAPTER *v78; 
  unsigned __int64 v79; 
  struct _DMA_ADAPTER *v80; 
  unsigned int v81; 
  struct _DMA_ADAPTER *v82; 
  int v83; 
  UINT64 v84; 
  bool v85; 
  INT64 ***VadEvent; 
  unsigned __int64 v87; 
  char v88; 
  __int64 v89; 
  unsigned __int64 v90; 
  unsigned __int64 v91; 
  UINT64 v92; 
  __int64 v93; 
  _QWORD *v94; 
  _MI_VAD_EVENT_BLOCK **v95; 
  __int64 *InternalFlags; 
  UINT64 InternalFlagsa; 
  UINT64 *HINTHonored; 
  PVOID *StartingAddress; 
  unsigned __int64 v100; 
  __int64 v101; 
  UINT64 v102; 
  __int64 v103; 
  unsigned __int64 Address; 
  PVOID Addressa; 
  UINT64 StartingVpn; 
  UINT64 StartingVpna; 
  ULONG_PTR BugCheckParameter2; 
  unsigned __int64 v109; 
  __int64 v110; 
  INT64 v111; 
  _IMAGE_INFO_EX ExtendedInfo; 
  INT64 result[8]; 
  int v114; 
  unsigned __int64 Alignment; 
  unsigned int Alignmenta; 
  v14 = ControlArea;
  memset((INT64)result, 0i64);
  v15 = *(_QWORD *)v14;
  v16 = *((_QWORD *)RequestingProcess + 11);
  v17 = 0;
  v103 = v15;
  memset(&ExtendedInfo, 0, sizeof(ExtendedInfo));
  v18 = *(_QWORD *)(v15 + 56);
  v111 = v18;
  if( dword_140C4C9D0
    && dword_140C4C9D4 == *(_DWORD *)(v18 + 60)
    && dword_140C4C9D8 == *(_DWORD *)(*(_QWORD *)(v15 + 56) + 68i64) )
  {
    __debugbreak();
  }
  v100 = *(_QWORD *)(v15 + 48);
  StartingVpn = *(_QWORD *)(v15 + 32);
  if( ((*((_DWORD *)v14 + 14) & 0x10000000) != 0 || (*(_DWORD *)(v16 + 2172) & 0x2000) != 0)
    && (*(_BYTE *)(v15 + 15) & 1) == 0 )
  {
    v17 = 1025;
  }
  v19 = *((_DWORD *)RequestingProcess + 10);
  v102 = *((_QWORD *)RequestingProcess + 2);
  if( (v19 & 0x20000000) != 0 )
  {
    if( *(_QWORD *)(v15 + 32) < 0x100000000ui64 || v17 >= 0x400 )
      return 3221225496i64;
    if( (*(_BYTE *)(v18 + 44) & 1) != 0 )
      return 3221226089i64;
    v102 = 0x200000i64;
  }
  if( !SectionOffset || (SectionOffset[7].LowPart & 0x80000) != 0 || (v19 & 0x40000) != 0 )
  {
    if( (_DWORD)Section != 1 )
      return 3221225541i64;
    v17 |= 0x200u;
  }
  if( (v17 & 0x200) == 0 )
  {
    v20 = MiAllowImageMap(v16, (INT64)SectionOffset, (INT64)v14, v18);
    if( (int)v20 < 0 )
      return v20;
    v21 = *(_DWORD *)(v16 + 2512);
    if( (v21 & 0x10) != 0 && (*(_BYTE *)(v18 + 51) & 4) == 0 )
    {
      if( (*(_BYTE *)(v18 + 44) & 1) == 0 )
      {
        v17 |= 1u;
        goto LABEL_12;
      }
      if( (v21 & 8) != 0 )
        return 3221226089i64;
    }
  }
LABEL_12:
  v22 = v17 | 2;
  if( (*(_BYTE *)(v15 + 15) & 1) != 0 && (*(_DWORD *)(v16 + 2512) & 0x40) == 0 )
  {
    v22 |= 1u;
    if( v22 < 0x400 )
      v22 &= ~2u;
  }
  v109 = 0i64;
  if( (v22 & 0x200) != 0 )
    goto LABEL_17;
  v23 = (char *)v14 + 128;
  if( v14 == (_CONTROL_AREA *)-128i64 )
    goto LABEL_17;
  while( (v23[32] & 0xEu) < 0xC )
  {
    v23 = (char *)*((_QWORD *)v23 + 2);
    if( !v23 )
      goto LABEL_17;
  }
  v20 = MiArbitraryCodeBlocked(*((_QWORD *)RequestingProcess + 12));
  if( (int)v20 >= 0 )
  {
LABEL_17:
    BugCheckParameter2 = (ULONG_PTR)v14 + 128;
    MiCheckPurgeAndUpMapCount((__int64)v14);
    v24 = *((_QWORD *)RequestingProcess + 3);
    Alignment = v24;
    LODWORD(v25) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
    v26 = v25;
    if( !v25 )
    {
      MiDereferenceControlArea((__int64)v14);
      return 3221225626i64;
    }
    v27 = *(_DWORD *)(v25 + 64) & 0xFBFFFFFF;
    *(_QWORD *)v25 = -2i64;
    *(_QWORD *)(v25 + 8) = -2i64;
    *(_QWORD *)(v25 + 16) = -2i64;
    v28 = 0;
    if( (_DWORD)CapturedViewSize == 1 )
      v28 = 0x4000000;
    v29 = v28 | v27;
    v30 = *(_DWORD *)(v26 + 48);
    *(_DWORD *)(v26 + 64) = v29;
    v31 = v30 & 0xFFFFFF8F | 0x20;
    *(_DWORD *)(v26 + 48) = v31;
    v32 = v31 ^ (v31 ^ (*((_DWORD *)RequestingProcess + 13) << 12)) & 0x3F000;
    *(_DWORD *)(v26 + 48) = v32;
    if( SectionOffset )
    {
      v33 = MiReferenceFileObjectForMap((INT64)SectionOffset);
      v34 = *(_DWORD *)(v26 + 64);
      *(_QWORD *)(v26 + 128) = v33;
      LODWORD(v33) = v34 & 0xF7FFFFFF | ((unsigned int)SectionOffset[7].HighPart >> 4) & 0x8000000;
      v32 = *(_DWORD *)(v26 + 48);
      *(_DWORD *)(v26 + 64) = (_DWORD)v33;
    }
    *(_QWORD *)(v26 + 40) = 0i64;
    if( (v22 & 0x200) != 0 )
    {
      v67 = v22 | 1;
      v22 = v22 & 0xFFFFFFFC | 1;
      *(_DWORD *)(v26 + 48) = v32 & 0xFFFFF07F | 0x80;
      if( v67 >= 0x400 )
        v22 = v67;
    }
    else
    {
      *(_DWORD *)(v26 + 48) = v32 & 0xFFFFF07F | 0x380;
      if( (*(_BYTE *)(v16 + 992) & 1) != 0 )
        *(_DWORD *)(v26 + 64) |= 0x10000000u;
      *(_DWORD *)(v26 + 52) ^= (*(_DWORD *)(v26 + 52) ^ v100) & 0x7FFFFFFF;
      *(_BYTE *)(v26 + 34) = v100 >> 31;
    }
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v101 = (__int64)CurrentThread;
    if( (*((_DWORD *)RequestingProcess + 18) & 1) == 0 || v102 == 0x200000 )
      v36 = (VOID *)(StartingVpn + *(unsigned int *)CapturedBase);
    else
      v36 = *(VOID **)Process;
    Address = (unsigned __int64)v36;
    if( v102 == 0x200000 )
    {
      Alignment = (*((_QWORD *)RequestingProcess + 3) + 0x1FFFFFi64) & 0xFFFFFFFFFFE00000ui64;
      v22 = v22 & 0xFFFFFFFC | 1;
      *(_DWORD *)(v26 + 52) ^= (*(_DWORD *)(v26 + 52) ^ (Alignment >> 12)) & 0x7FFFFFFF;
      *(_BYTE *)(v26 + 34) = Alignment >> 43;
      *(_DWORD *)(v26 + 64) |= 0x1000000u;
      LargePageVad = MiCreateLargePageVad((_EPROCESS *)v16, (_MMVAD_SHORT *)v26);
      if( LargePageVad < 0 )
      {
        v78 = *(struct _DMA_ADAPTER **)(v26 + 128);
        if( v78 )
          HalPutDmaAdapter(v78);
        MiDereferenceControlArea((__int64)v14);
        ExFreePoolWithTag((PVOID)v26, 0);
        return(unsigned int)LargePageVad;
      }
      v24 = Alignment;
      CurrentThread = (_ETHREAD *)v101;
    }
    v110 = 0i64;
    if( MiUserHotPatchReserveSize
      && *(_WORD *)(v111 + 48) == 0x8664
      && (v22 & 0x200) == 0
      && (*(_DWORD *)(v26 + 64) & 0x1000000) == 0
      && v24 < 0x7FFFFFFF
      && (*(_BYTE *)(v16 + 992) & 1) == 0 )
    {
      if( (v24 >> 12) + ((v24 & 0xFFF) != 0) == *(_DWORD *)(v103 + 8) )
      {
        v79 = v24 + (unsigned int)MiUserHotPatchReserveSize;
        if( v79 < v24 )
        {
          v80 = *(struct _DMA_ADAPTER **)(v26 + 128);
          if( v80 )
            HalPutDmaAdapter(v80);
          MiDereferenceControlArea((__int64)v14);
          ExFreePoolWithTag((PVOID)v26, 0);
          return 3221225503i64;
        }
        v24 += (unsigned int)MiUserHotPatchReserveSize;
        Alignment = v79;
      }
      CurrentThread = (_ETHREAD *)v101;
    }
    if( (*(_DWORD *)(v26 + 48) & 0xF80) == 896
      && *(_QWORD *)(v16 + 1088)
      && (*(_DWORD *)(v16 + 2172) & 0x1000) == 0
      && v16 != PsSecureSystemProcess
      && (PspNotifyEnableMask & 1) != 0 )
    {
      v22 |= 0x800u;
    }
    v114 = 32;
    LOCK_ADDRESS_SPACE((__int64)CurrentThread, v16);
    if( (*(_DWORD *)(v16 + 1124) & 0x20) != 0 )
    {
      PerSessionProtos = -1073741558;
      goto LABEL_188;
    }
    v37 = v102;
    if( (*((_DWORD *)RequestingProcess + 18) & 1) != 0 && v102 != 0x200000 )
    {
      v95 = (_MI_VAD_EVENT_BLOCK **)*((_QWORD *)RequestingProcess + 1);
      MiIsVaRangeAvailable((_EPROCESS *)v16, v36, v24, *(VOID **)RequestingProcess);
      if( !v83 )
      {
        PerSessionProtos = -1073741800;
        goto LABEL_188;
      }
LABEL_41:
      v39 = 1073741827;
      v40 = StartingVpn;
      v41 = (char *)(Address - *(unsigned int *)CapturedBase);
      if( v41 == (char *)StartingVpn )
        v39 = 0;
      *(_DWORD *)(v26 + 24) = Address >> 12;
      StartingVpna = Address >> 12;
      *(_BYTE *)(v26 + 32) = Address >> 12 >> 32;
      v42 = (Address - 1 + v24) >> 12;
      *(_DWORD *)(v26 + 28) = v42;
      *(_BYTE *)(v26 + 33) = BYTE4(v42);
      v43 = BugCheckParameter2;
      v44 = (unsigned __int64)*CapturedBase >> 12;
      v45 = *(unsigned int *)(BugCheckParameter2 + 44);
      if( v44 >= v45 )
      {
        do
        {
          v43 = *(_QWORD *)(v43 + 16);
          v44 -= v45;
          v45 = *(unsigned int *)(v43 + 44);
        }
        while( v44 >= v45 );
        BugCheckParameter2 = v43;
      }
      *(_QWORD *)(v26 + 72) = v43;
      v46 = v39;
      Alignmenta = v39;
      *(_QWORD *)(v26 + 80) = *(_QWORD *)(v43 + 8) + 8 * v44;
      *(_QWORD *)(v26 + 88) = *(_QWORD *)(v103 + 64) + 8 * (*(unsigned int *)(v103 + 8) - 1i64);
      if( (InheritDisposition & 4) == 0 )
      {
        Alignmenta = v39;
        if( v16 != PsSecureSystemProcess )
        {
          Alignmenta = v39;
          if( v41 != (char *)v40 )
          {
            if( (*((_DWORD *)RequestingProcess + 10) & 0x800000) == 0 && (v22 & 0x400) == 0
              || (*((_DWORD *)ControlArea + 14) & 0x800) != 0
              || (v22 & 2) == 0 )
            {
              Alignmenta = v39;
              if( (v22 & 0x400) != 0 )
              {
                PerSessionProtos = -1073741800;
                goto LABEL_154;
              }
            }
            else
            {
              FixupVad = MiAllocateFixupVad(v26);
              if( FixupVad )
              {
                ExFreePoolWithTag((PVOID)v26, 0);
                v26 = (INT64)FixupVad;
                v46 = 1073741878;
                Alignmenta = 1073741878;
              }
              else
              {
                Alignmenta = v39;
                v46 = v39;
                if( (v22 & 0x400) != 0 )
                {
                  PerSessionProtos = -1073741670;
                  goto LABEL_154;
                }
              }
            }
          }
        }
      }
      if( *((_DWORD *)RequestingProcess + 13) )
        *(_BYTE *)(*(_QWORD *)(v16 + 1680) + 352i64) = 1;
      v47 = ControlArea;
      if( (*((_DWORD *)ControlArea + 14) & 0x4000000) != 0 )
      {
        SessionId = MmGetSessionIdEx(v16);
        PerSessionProtos = MiCreatePerSessionProtos(ControlArea, SessionId);
        if( PerSessionProtos < 0 )
          goto LABEL_154;
        v47 = ControlArea;
        v22 |= 0x80u;
      }
      if( (*(_DWORD *)(v26 + 64) & 0x10000000) != 0 )
      {
        v89 = *(unsigned int *)(v26 + 52);
        LODWORD(v89) = v89 & 0x7FFFFFFF;
        v90 = v89 | ((unsigned __int64)*(unsigned __int8 *)(v26 + 34) << 31);
        v91 = MiUpdatePrivateDemandZeroView(v16, v26, 0i64) + v90;
        *(_DWORD *)(v26 + 52) ^= (*(_DWORD *)(v26 + 52) ^ v91) & 0x7FFFFFFF;
        *(_BYTE *)(v26 + 34) = v91 >> 31;
        result[1] = v101;
        MiInsertVadEvent((_MMVAD_SHORT *)v26, (_MI_VAD_EVENT_BLOCK *)result, 0i64);
        v47 = ControlArea;
        v22 |= 0x20u;
      }
      PerSessionProtos = MiInsertSharedCommitNode(v47, v16, 0);
      if( PerSessionProtos >= 0 )
      {
        v22 |= 0x40u;
        v49 = MiControlAreaRequiresCharge((INT64)ControlArea);
        if( v49 )
        {
          if( v49 != 2 )
            goto LABEL_55;
          PerSessionProtos = MiReferenceActiveSubsection(BugCheckParameter2, v50, 0x11u);
          if( PerSessionProtos >= 0 )
          {
            v22 |= 0x100u;
LABEL_55:
            PerSessionProtos = MiInsertVadCharges(v26, v16);
            if( PerSessionProtos >= 0 )
            {
              if( v46 == 1073741878 )
                ++*(_QWORD *)(*(_QWORD *)(v16 + 1680) + 384i64);
              MiGetWsAndInsertVad(v26);
              v51 = 0i64;
              if( v102 == 0x200000 )
              {
                MiLockVad(v101, v26);
                PerSessionProtos = MiMapUserLargePages(v26);
                if( PerSessionProtos < 0 )
                {
                  UNLOCK_ADDRESS_SPACE_UNORDERED(v101, v16);
                  goto LABEL_236;
                }
                MiUnlockVad(v101, v26);
              }
              v52 = (char *)((v109 << 16) + Address);
              Addressa = v52;
              *(_QWORD *)Process = v52;
              if( !*(_BYTE *)(v111 + 50)
                || (v53 = *(_WORD *)(v111 + 48), v53 >= KUSER_SHARED_DATA.ImageNumberLow)
                && v53 <= KUSER_SHARED_DATA.ImageNumberHigh
                || (v68 = *(_QWORD *)(v16 + 1408)) != 0 && ((v69 = *(_WORD *)(v68 + 8), v69 == 332) || v69 == 452) )
              {
                v54 = Alignmenta;
              }
              else
              {
                v54 = 1073741838;
                Alignmenta = 1073741838;
              }
              v55 = v22 | 4;
              if( (v55 & 0x200) != 0 )
              {
LABEL_77:
                if( (v55 & 8) == 0 )
                {
                  v62 = v101;
LABEL_92:
                  if( (v55 & 4) != 0 )
                    UNLOCK_ADDRESS_SPACE(v62, v16);
                  if( (v55 & 0x200) == 0 && SectionOffset && (*(_BYTE *)(v16 + 992) & 1) == 0 )
                    *((_DWORD *)RequestingProcess + 18) |= 4u;
                  return Alignmenta;
                }
                MiLockVad(v101, v26);
                UNLOCK_ADDRESS_SPACE_UNORDERED(v101, v16);
                v55 &= ~4u;
                if( (*(_DWORD *)(v26 + 64) & 0x10000000) != 0 )
                {
                  MiUpdatePrivateDemandZeroView(v16, v26, 1i64);
                  MiRemoveVadEvent(v26, result);
                  v55 &= ~0x20u;
                }
                if( (v55 & 0x10) == 0
                  || (PerSessionProtos = MiCommitVadCfgBits(v26, 0i64, 0i64), PerSessionProtos >= 0) )
                {
                  if( *((_QWORD *)RequestingProcess + 10) )
                  {
                    v92 = *((unsigned int *)RequestingProcess + 19);
                    if( (_DWORD)v92 != 4 && (unsigned int)(v92 - 1) > 1 && (_DWORD)v92 != -2147483647 )
                    {
                      PerSessionProtos = -1073741755;
                      goto LABEL_236;
                    }
                    InternalFlags = &v110;
                    LODWORD(v95) = 0;
                    PerSessionProtos = MiSecureVad(
                                         (_MMVAD_SHORT *)v26,
                                         Addressa,
                                         *((_QWORD *)RequestingProcess + 3),
                                         v92,
                                         v95);
                    if( PerSessionProtos < 0 )
                      goto LABEL_236;
                    **((_QWORD **)RequestingProcess + 10) = v110 ^ qword_140C4DB90 ^ v16;
                    v60 = 0i64;
                  }
                  else
                  {
                    v60 = v110;
                  }
                  if( v55 < 0x800
                    || (v60 = (__int64)MiAddSecureEntry(v26, StartingVpna << 12, (v42 << 12) | 0xFFF, -2147483647, 0)) != 0 )
                  {
                    if( (*((_DWORD *)RequestingProcess + 15) & 2) != 0 )
                      MiSoftFaultMappedView(v26);
                    v61 = v26;
                    v62 = v101;
                    MiUnlockVad(v101, v61);
                    if( v55 >= 0x800 )
                    {
                      PsCallImageNotifyRoutines(&v51->FileName, (PVOID)v16, &ExtendedInfo, v51);
                      HalPutDmaAdapter((PADAPTER_OBJECT)v51);
                    }
                    if( v60 )
                      MmUnsecureVirtualMemory((PVOID)(v60 ^ qword_140C4DB90 ^ v16));
                    goto LABEL_92;
                  }
                  PerSessionProtos = -1073741670;
                }
LABEL_236:
                MiReferenceVad(v26);
                if( v51 )
                  HalPutDmaAdapter((PADAPTER_OBJECT)v51);
                MiUnmapVad(
                  (_MMVAD *)v26,
                  0i64,
                  0i64,
                  v93,
                  (__int64)v95,
                  (__int64)InternalFlags,
                  (__int64)HINTHonored,
                  (int)StartingAddress);
                v94 = (_QWORD *)*((_QWORD *)RequestingProcess + 10);
                if( v94 )
                  *v94 = 0i64;
                return(unsigned int)PerSessionProtos;
              }
              if( (NtGlobalFlag & 0x40000) == 0
                || (v72 = (unsigned int)(v54 - 1073741827), (unsigned int)v72 <= 0x33)
                && (v73 = 0x8000000000801i64, _bittest64(&v73, v72)) )
              {
                v56 = ControlArea;
              }
              else
              {
                v57 = v103;
                if( (*(_BYTE *)(v101 + 1304) & 0x20) != 0
                  || (v74 = *(_WORD *)(v103 + 12), (v74 & 0x2000) != 0)
                  || *(char *)(v103 + 14) >= 0 )
                {
                  v56 = ControlArea;
                  goto LABEL_67;
                }
                *(_WORD *)(v103 + 12) = v74 | 0x2000;
                v75 = v52;
                v56 = ControlArea;
                MiLoadUserSymbols(ControlArea, v75, (_EPROCESS *)v16);
              }
              v57 = v103;
LABEL_67:
              if( v55 >= 0x800 )
              {
                LOBYTE(ExtendedInfo.ImageInfo.Properties) = 3;
                if( (*(_DWORD *)(v26 + 64) & 0x8000000) != 0 )
                  v58 = ExtendedInfo.ImageInfo.Properties & 0xFFF80FFF;
                else
                  v58 = ExtendedInfo.ImageInfo.Properties & 0xFFF80FFF | ((*(_BYTE *)(v57 + 15) & 0xF0 | ((*(_BYTE *)(v57 + 15) & 0xE) << 7)) << 8);
                v59 = 0;
                if( Alignmenta == 1073741838 )
                  v59 = 2048;
                ExtendedInfo.ImageInfo.Properties = v58 & 0xFFFFF7FF | v59;
                ExtendedInfo.ImageInfo.ImageBase = Addressa;
                ExtendedInfo.ImageInfo.ImageSize = *((_QWORD *)RequestingProcess + 3);
                if( *((_QWORD *)RequestingProcess + 3) != _InterlockedCompareExchange64(
                                                             (volatile signed __int64 *)(v57 + 24),
                                                             -1i64,
                                                             -1i64) )
                  ExtendedInfo.ImageInfo.Properties |= 0x80000u;
                ExtendedInfo.ImageInfo.ImageSelector = 0;
                ExtendedInfo.ImageInfo.ImageSectionNumber = 0;
                v51 = MiReferenceControlAreaFile(v56);
                v55 |= 8u;
              }
              if( MiIsProcessCfgEnabled() )
              {
                v55 |= 0x18u;
              }
              else if( (*(_DWORD *)(v26 + 64) & 0x10000000) != 0
                     || *((_QWORD *)RequestingProcess + 10)
                     || (*((_DWORD *)RequestingProcess + 15) & 2) != 0 )
              {
                v55 |= 8u;
              }
              goto LABEL_77;
            }
          }
        }
        else
        {
          PerSessionProtos = -1073740277;
        }
      }
LABEL_154:
      v14 = ControlArea;
LABEL_188:
      if( (v22 & 0x80u) != 0 )
      {
        v81 = MmGetSessionIdEx(v16);
        MiDereferencePerSessionProtos((__int64 *)v14, v81);
      }
      if( (v22 & 0x100) != 0 )
        MiReturnCrossPartitionControlAreaCharges((INT64)v14);
      if( (v22 & 0x40) != 0 )
        MiRemoveSharedCommitNode(v14, v16, 0i64);
      UNLOCK_ADDRESS_SPACE(v101, v16);
      if( (v22 & 0x20) != 0 )
        MiRemoveVadEvent(v26, result);
      if( v26 )
      {
        if( v102 == 0x200000 )
          MiReleaseVadEventBlocks(v26, 0);
        v82 = *(struct _DMA_ADAPTER **)(v26 + 128);
        if( v82 )
          HalPutDmaAdapter(v82);
        ExFreePoolWithTag((PVOID)v26, 0);
      }
      MiDereferenceControlArea((__int64)v14);
      return(unsigned int)PerSessionProtos;
    }
    if( v24 > 0x7FFFFFFF0000i64 )
    {
      PerSessionProtos = -1073741801;
      goto LABEL_188;
    }
    if( (v22 & 1) == 0 )
    {
      v95 = (_MI_VAD_EVENT_BLOCK **)*((_QWORD *)RequestingProcess + 1);
      MiIsVaRangeAvailable((_EPROCESS *)v16, v36, v24, *(VOID **)RequestingProcess);
      if( v38 )
        goto LABEL_41;
    }
    v64 = *((_QWORD *)RequestingProcess + 1);
    v65 = 0i64;
    if( StartingVpn < 0x100000000i64 && v64 >= 0x100000000i64 && (*(_BYTE *)(v103 + 15) & 1) == 0 )
      v64 = 0xFFFFFFFFi64;
    if( (*(_BYTE *)(v103 + 14) & 0x40) != 0 )
    {
      v70 = *(_QWORD *)(v16 + 1408);
      if( !v70 || (v71 = *(_WORD *)(v70 + 8), v71 != 332) && v71 != 452 )
        v65 = 0x100000000i64;
    }
    if( *(_QWORD *)RequestingProcess >= v64 )
    {
      PerSessionProtos = -1073741801;
    }
    else
    {
      LODWORD(StartingAddress) = 0;
      LODWORD(HINTHonored) = (*(_DWORD *)(v26 + 48) >> 7) & 0x1F;
      PerSessionProtos = MiSelectUserAddress(
                           *((unsigned int *)RequestingProcess + 10),
                           *(_QWORD *)RequestingProcess,
                           v64,
                           Alignment,
                           v37,
                           v65,
                           HINTHonored,
                           StartingAddress);
      if( PerSessionProtos >= 0 )
      {
        v24 = Alignment;
        v66 = v102;
LABEL_110:
        if( v66 == 0x200000 )
        {
          if( v24 - *((_QWORD *)RequestingProcess + 3) >= 0x10000 )
            v109 = (unsigned int)ExGenRandom(1i64) % ((v24 - *((_QWORD *)RequestingProcess + 3)) >> 16);
          VadEvent = MiLocateVadEvent(v26, 16i64);
          VadEvent[2] = (INT64 **)(v87 >> 12);
          *((_BYTE *)VadEvent + 8) = v88;
        }
        goto LABEL_41;
      }
    }
    v84 = *((_QWORD *)RequestingProcess + 1);
    v85 = v64 == v84;
    v24 = Alignment;
    if( v85 )
    {
      v66 = v102;
    }
    else
    {
      LODWORD(StartingAddress) = 0;
      LODWORD(HINTHonored) = (*(_DWORD *)(v26 + 48) >> 7) & 0x1F;
      InternalFlagsa = v65;
      v66 = v102;
      PerSessionProtos = MiSelectUserAddress(
                           *((unsigned int *)RequestingProcess + 10),
                           *(_QWORD *)RequestingProcess,
                           v84,
                           Alignment,
                           v102,
                           InternalFlagsa,
                           HINTHonored,
                           StartingAddress);
    }
    if( PerSessionProtos < 0 )
      goto LABEL_154;
    goto LABEL_110;
  }
  return v20;
}

Referenced by:

MiMapImageInSystemProcess
MiMapViewOfSection