MiGetUltraMapping

VOID __fastcall MiGetUltraMapping(_MI_ZERO_THREAD_CONTEXT *ThreadContext, INT64 LargePageIndex){
  __int64 v2; 
  char v3; 
  unsigned __int64 v4; 
  unsigned int v5; 
  char v6; 
  __int64 v7; 
  __int64 v9; 
  unsigned __int64 v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  UINT64 v13; 
  _MMPTE *PteBase; 
  unsigned __int64 Long; 
  int v16; 
  __int64 v17; 
  _XSTATE_CONFIGURATION *v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  int v23; 
  _MMPTE *PdpteBase; 
  UINT64 SetBitsAndClear; 
  UINT64 v26; 
  UINT64 v27; 
  __int64 v28; 
  __int64 v29; 
  INT64 *v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  int v34; 
  unsigned __int64 v35; 
  unsigned __int64 v36; 
  unsigned __int64 *v37; 
  int v38; 
  unsigned __int64 v39; 
  int v40; 
  __int64 v41; 
  unsigned __int64 v42; 
  unsigned __int64 i; 
  _QWORD *v44; 
  __int64 v45; 
  _KLOCK_QUEUE_HANDLE LockHandle; 
  UINT64 v47; 
  _XSTATE_CONFIGURATION *v48; 
  unsigned __int64 *v49; 

  v4 = *(_QWORD *)ThreadContext;
  v5 = LargePageIndex;
  v6 = v3;
  v7 = v2;
  v9 = MiUltraMapSizes[(unsigned int)LargePageIndex];
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( !v4 )
    goto LABEL_17;
  if( (_DWORD)LargePageIndex == 1 )
  {
    v10 = v9 << 9;
LABEL_5:
    v11 = v10 - 1;
    v12 = v2 << 12;
    if( (v2 << 12) + (v4 & (v10 - 1)) > v10 )
    {
      v4 = ~v11 & (v10 + v4 - 1);
      *(_QWORD *)ThreadContext = v4;
    }
    if( (v11 & v4) != 0 && (v3 & 2) == 0 )
    {
      *(_QWORD *)ThreadContext = v12 + v4;
      return;
    }
    v13 = (UINT64)MmGetPdeBase() + (((v4 - 1) >> 18) & 0x3FFFFFF8);
    PteBase = MmGetPteBase();
    v47 = v13;
    if( v5 <= 1 )
    {
      v41 = 2 - v5;
      do
      {
        v13 = (UINT64)PteBase + ((v13 >> 9) & 0x7FFFFFFFF8i64);
        --v41;
      }
      while( v41 );
      v47 = v13;
    }
    Long = ZeroPte.u.Long;
    LOBYTE(v16) = MiPteInShadowRange(v13);
    if( v16 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
      Long = v17 | ZeroPte.u.Long;
    *(_QWORD *)v47 = Long;
    if( (v6 & 2) != 0 )
    {
      if( v5 > 1 )
      {
        v39 = ZeroPte.u.Long;
        v49 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + ((v47 >> 9) & 0x7FFFFFFFF8i64));
        LOBYTE(v40) = MiPteInShadowRange((UINT64)v49);
        if( v40 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
          v39 = ZeroPte.u.Long | 0x8000000000000000ui64;
        *v49 = v39;
      }
    }
    else if( v5 != 1 )
    {
      v18 = (_XSTATE_CONFIGURATION *)(v47 + 8);
      v48 = v18;
      if( ((unsigned __int16)v18 & 0xFFF) != 0 )
      {
        v19 = (_QWORD)MmGetPteBase() << 25;
        v20 = (((((_QWORD)v18 << 25) - v19) >> 16 << 25) - v19) >> 16;
        LODWORD(v21) = MiMakeValidPte(v18, *((_QWORD *)ThreadContext + 2), 3087007748i64);
        v22 = v21;
        LOBYTE(v23) = MiPteInShadowRange((UINT64)v48);
        if( v23 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v22 & 1) != 0 )
          v22 |= 0x8000000000000000ui64;
        v48->EnabledFeatures = v22;
        *(_QWORD *)ThreadContext = v12 + v20;
        return;
      }
    }
    goto LABEL_33;
  }
  if( (_DWORD)LargePageIndex )
  {
    v10 = 0x200000i64;
    goto LABEL_5;
  }
LABEL_33:
  v4 -= v9;
LABEL_17:
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C4DB30 + 448, &LockHandle);
  PdpteBase = MmGetPdpteBase();
  if( v4 )
  {
    v35 = (v4 - *(&stru_140C4DB30 + 449)) >> 30;
    v36 = ZeroPte.u.Long;
    v37 = (unsigned __int64 *)((char *)&PdpteBase->u.Long + ((v4 >> 27) & 0x1FFFF8));
    LOBYTE(v38) = MiPteInShadowRange((UINT64)v37);
    if( v38 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
      v36 = ZeroPte.u.Long | 0x8000000000000000ui64;
    *v37 = v36;
    _bittestandset64(*(&stru_140C4DB30 + 454), v35);
  }
  if( (v6 & 2) != 0 )
  {
    *(_QWORD *)ThreadContext = 0i64;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
  }
  else
  {
    while( 1 )
    {
      SetBitsAndClear = RtlFindSetBitsAndClearEx(
                          (_RTL_BITMAP_EX *)((char *)&stru_140C4DB30 + 3608),
                          1ui64,
                          *(&stru_140C4DB30 + 450));
      v26 = SetBitsAndClear;
      if( SetBitsAndClear != -1i64 )
        break;
      KeFlushTb(FlushKernel, FlushAllProcessors);
      v42 = 0i64;
      for( i = *(&stru_140C4DB30 + 451) >> 6; v42 < i; *v44 |= v45 )
      {
        v44 = (_QWORD *)(*(&stru_140C4DB30 + 452) + 8 * v42);
        v45 = *(_QWORD *)(*(&stru_140C4DB30 + 454) + 8 * v42++);
      }
      memset(
        *(&stru_140C4DB30 + 454),
        0i64,
        4 * ((*(&stru_140C4DB30 + 453) >> 5) + ((*(&stru_140C4DB30 + 3624) & 0x1F) != 0)));
    }
    *(&stru_140C4DB30 + 450) = SetBitsAndClear + 1;
    KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
    __writecr8(LockHandle.OldIrql);
    v27 = *(&stru_140C4DB30 + 449) + (v26 << 30);
    if( (v6 & 1) == 0 )
      *(_QWORD *)ThreadContext = v27 + (v7 << 12);
    if( v5 )
    {
      v28 = (__int64)MmGetPdpteBase() + ((v27 >> 27) & 0x1FFFF8);
      v29 = (_QWORD)MmGetPteBase() << 25;
      v30 = (INT64 *)(ThreadContext + 2);
      v31 = (v5 != 1) + 1i64;
      do
      {
        LODWORD(v32) = MiMakeValidPte((_XSTATE_CONFIGURATION *)v28, *v30, 3087007748i64);
        v33 = v32;
        LOBYTE(v34) = MiPteInShadowRange(v28);
        if( v34 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v33 & 1) != 0 )
          v33 |= 0x8000000000000000ui64;
        *(_QWORD *)v28 = v33;
        ++v30;
        v28 = ((v28 << 25) - v29) >> 16;
        --v31;
      }
      while( v31 );
    }
  }
}

Referenced by:

MiAllocateHyperSpace
MiCombineAllPhysicalMemory
MiCombinePte
MiDecrementAndInsertStandbyPages
MiDeletePteRun
MiDeleteUltraMapContext
MiGetPageChain
MiHugePageOperation
MiInitializeNewUltraHugeContext
MiMapPageInHyperSpaceWorker
MiMapPagesToZero
MiPfnShareCountIsZero
MiScrubNodeLargePageList
MiScrubPage
MiSharePages
MiTimeSingleLargePageZeroWorker
MiWsleFree
MiZeroLargePage
MiZeroWithUltraSpace
MmMapMdl