MiMapUserLargePages

NTSTATUS __stdcall MiMapUserLargePages(_MMVAD_SHORT *Vad, UINT64 PreferredNode){
  unsigned int v3; 
  _MMSUPPORT_INSTANCE *p_Instance; 
  unsigned __int64 v5; 
  unsigned __int64 v6; 
  INT64 *v7; 
  CHAR v8; 
  NTSTATUS result; 
  union {unsigned int LongFlags;_MMVAD_FLAGS VadFlags;_MM_PRIVATE_VAD_FLAGS PrivateVadFlags;_MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;_MM_SHARED_VAD_FLAGS SharedVadFlags;volatile unsigned int VolatileVadLong;} v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  UINT8 v16; 
  char *v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  _MMPTE *PteBase; 
  unsigned int v21; 
  bool i; 
  unsigned __int64 v23; 
  __int64 v24; 
  unsigned __int64 v25; 
  __int64 v26; 
  int v27; 
  UINT64 v28; 
  int v29; 
  UINT8 v30; 
  int v31; 
  UINT64 v32; 
  UINT64 Flags; 
  int v34; 
  unsigned int v35; 
  int v36; 
  unsigned int v37; 
  char *PageTableVirtualAddress; 
  unsigned __int64 v39; 
  _EPROCESS *a3; 
  _MMPFN *Pfn1; 
  __int64 LargePageIndex; 
  __int64 v43; 
  unsigned __int64 v44; 
  _QWORD v45[2]; 
  __int128 v46; 
  int v48; 

  *(_OWORD *)v45 = 0i64;
  v46 = 0i64;
  v3 = MiComputePreferredNode((INT64)Vad);
  v37 = v3;
  a3 = KeGetCurrentThread()->ApcState.Process;
  p_Instance = &a3->Vm.Instance;
  v5 = (Vad->StartingVpn | ((unsigned __int64)Vad->StartingVpnHigh << 32)) << 12;
  v6 = (((Vad->EndingVpn | ((unsigned __int64)Vad->EndingVpnHigh << 32)) << 12) | 0xFFF) + 1;
  v44 = v6;
  result = MiCreateLargePfnList((INT64)Vad, (v6 - v5) >> 12, v8, v7, (CHAR *)v45);
  if( result < 0 )
    return result;
  v10.LongFlags = (unsigned int)Vad->u;
  v11 = 0x140000000ui64;
  v12 = (v10.LongFlags >> 18) & 3;
  if( LODWORD(MiVadPageSizes[v12]) == 16 )
  {
    v13 = 2;
LABEL_4:
    v14 = v13;
    goto LABEL_8;
  }
  if( (v10.LongFlags & 0x500000) == 5242880 )
  {
    v13 = MiVadPageIndices[v12];
    goto LABEL_4;
  }
  v13 = 1;
  LOBYTE(v15) = MiGetLargestPageIndex();
  v14 = v15;
LABEL_8:
  v36 = 0;
  v48 = 0;
  v16 = 17;
  v34 = 0;
  v17 = 0i64;
  v35 = v14;
  v18 = 0i64;
  v19 = v5;
  v39 = v5;
  PteBase = MmGetPteBase();
  PageTableVirtualAddress = (char *)PteBase + ((v5 >> 9) & 0x7FFFFFFFF8i64);
  if( v5 >= v6 )
    return 0;
  do
  {
    v21 = v14;
    for( i = v14 <= v13; i; i = v21 <= v13 )
    {
      v23 = *(_QWORD *)(v11 + 8i64 * v21 + 108432) << 12;
      if( !(v19 % v23) && v6 - v19 >= v23 )
      {
        LODWORD(v24) = v21;
        if( v45[v21] )
        {
LABEL_17:
          if( (unsigned int)v24 <= v13 )
          {
            v21 = v24;
            break;
          }
        }
        else
        {
          while( 1 )
          {
            v24 = (unsigned int)(v24 + 1);
            if( (unsigned int)v24 > v13 )
              break;
            if( v45[v24] )
              goto LABEL_17;
          }
        }
        MiDemotePfnListChain((INT64)v45, v21);
        v11 = 0x140000000ui64;
        PteBase = MmGetPteBase();
        break;
      }
      ++v21;
    }
    Pfn1 = (_MMPFN *)v45[v21];
    v45[v21] = Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0;
    v25 = (unsigned __int64)PageTableVirtualAddress;
    v43 = *(_QWORD *)(v11 + 8i64 * v21 + 108432);
    LargePageIndex = Pfn1 - MmGetPfnDb();
    if( v21 < 2 )
    {
      v26 = 2 - v21;
      do
      {
        v25 = (unsigned __int64)PteBase + ((v25 >> 9) & 0x7FFFFFFFF8i64);
        --v26;
      }
      while( v26 );
      v3 = v37;
    }
    if( ((v25 ^ v18) & 0xFFFFFFFFFFFFF000ui64) != 0 )
    {
      if( v17 )
      {
        MiUnlockPageTable((INT64)p_Instance, (UINT64)v17);
        v17 = 0i64;
      }
      v27 = v34;
      v28 = 1i64;
      if( v34 == 1 )
      {
        if( v21 )
        {
          v29 = 1;
          v48 = 1;
        }
        else
        {
          v29 = v48;
        }
      }
      else
      {
        v29 = v48;
        if( !v21 )
          v29 = 1;
        v48 = v29;
      }
      if( v29 )
      {
        v48 = 0;
        if( v16 == 17 )
          goto LABEL_41;
        LOBYTE(v28) = v16;
        if( v34 == 1 )
          MiUnlockWorkingSetExclusive(p_Instance, v16);
        else
          MiUnlockWorkingSetShared(p_Instance, v28);
        v16 = 17;
      }
      if( v16 != 17 )
      {
LABEL_45:
        if( !v27 )
          v17 = (char *)MmGetPteBase() + ((v25 >> 9) & 0x7FFFFFFFF8i64);
        LODWORD(Flags) = v27;
        MiMakeSystemAddressValid((VOID *)v25, 0i64, v3 + 1, v16, Flags);
        goto LABEL_48;
      }
LABEL_41:
      if( !v21 )
      {
        v34 = 1;
        v27 = 1;
        v16 = MiLockWorkingSetForLargeMapping(p_Instance, 1i64, v3);
      }
      if( v16 == 17 )
      {
        v27 = 0;
        v34 = 0;
        MiLockWorkingSetShared();
        v16 = v30;
      }
      goto LABEL_45;
    }
LABEL_48:
    MiInitializeLargeUserBasePfn(Pfn1, (UINT64)PageTableVirtualAddress, (UINT64)a3);
    MiInsertLargeUserMapping(Vad, (_MMPTE)PageTableVirtualAddress, LargePageIndex, v21);
    v39 += v43 << 12;
    PageTableVirtualAddress += 8 * v43;
    if( (++v36 & 0xF) == 0 && (LOBYTE(v31) = MiWorkingSetIsContended((INT64)p_Instance), v31)
      || MiShouldYieldProcessor() )
    {
      v18 = 0i64;
      v48 = 1;
    }
    else
    {
      v18 = v25;
    }
    v6 = v44;
    v11 = 0x140000000ui64;
    v19 = v39;
    v14 = v35;
    PteBase = MmGetPteBase();
  }
  while( v39 < v44 );
  if( v17 )
    MiUnlockPageTable((INT64)p_Instance, (UINT64)v17);
  if( v16 != 17 )
  {
    LOBYTE(v32) = v16;
    if( v34 == 1 )
      MiUnlockWorkingSetExclusive(p_Instance, v16);
    else
      MiUnlockWorkingSetShared(p_Instance, v32);
  }
  return 0;
}

Referenced by:

MiCopyLargeVad
MiMapViewOfImageSection
MiReserveUserMemory