MiGetLargePage

INT64 __fastcall MiGetLargePage(
        INT64 a1,
        unsigned int a2,
        _MI_PFN_CACHE_ATTRIBUTE a3,
        unsigned int a4,
        int a5,
        __int64 a6){
  unsigned int v7; 
  unsigned int v9; 
  INT64 v10; 
  unsigned __int8 CurrentIrql; 
  unsigned int v12; 
  INT64 v13; 
  UINT8 *v14; 
  INT64 v15; 
  _BOOL4 v17; 
  __int64 v18; 
  UINT64 v19; 
  INT64 v20; 
  INT64 v21; 
  INT64 v22; 
  _MI_PFN_CACHE_ATTRIBUTE v23; 
  UINT64 v24[3]; 
  INT64 v25[18]; 

  v23 = a3;
  v7 = a4;
  *(UINT64 *)((char *)&v24[1] + 4) = a6;
  LODWORD(v24[0]) = a4;
  memset(v25, 0i64, sizeof(v25));
  v9 = v7 >> *(&stru_140C4DB30 + 156);
  v10 = *(_QWORD *)(a1 + 16) + 4544i64 * (v7 >> *(&stru_140C4DB30 + 156));
  if( !*(_QWORD *)(v10 + 4176) && (MiFlags & 0x30) != 0 )
    return 0i64;
  CurrentIrql = KeGetCurrentIrql();
  v12 = a2 + 1;
  while( 1 )
  {
    --v12;
    LODWORD(v22) = v23;
    LODWORD(v21) = 4;
    LODWORD(v20) = v7;
    LODWORD(v19) = v9;
    LODWORD(v13) = MiGetFreeZeroLargePages(a1, v12, 1i64, a5 | 0x20u, v19, v20, v21, v22);
    v15 = v13;
    if( v13 )
      break;
    v7 = v24[0];
    if( !v12 )
      return 0i64;
  }
  v17 = (*(_DWORD *)(v13 + 16) & 0x3E0i64) != 0;
  HIDWORD(v24[0]) = v17;
  if( v12 == a2 )
  {
    MiLargePageMovesComplete(a1, v9, v14);
  }
  else
  {
    MiInsertDemotedPages(v10, v13, v12, a2, v13);
    LODWORD(v24[0]) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(v15 + 24), 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(v24);
      while( *(__int64 *)(v15 + 24) < 0 );
    }
    _InterlockedAnd64((volatile signed __int64 *)(v15 + 24), 0x7FFFFFFFFFFFFFFFui64);
  }
  __writecr8(CurrentIrql);
  v18 = (v15 - (__int64)MmGetPfnDb()) / 48;
  if( !v17 && (MiFlags & 0x80u) != 0 && (++*(&stru_140C4DB30 + 631) & MmPageValidationFrequency) == 0 )
    MiArePageContentsZero((PVOID)v18);
  MiIsFreeZeroPfnCold(v15);
  if( HIDWORD(v24[0]) == 1 )
  {
    if( HIDWORD(v25[0]) )
      MiNotifyPageHeat(v25);
    if( v12 == 3 )
      MiZeroPhysicalPage(v18, 0i64, v23);
    else
      MiZeroLargePage((_MI_ZERO_THREAD_CONTEXT *)v15);
    *(_MMPTE *)(v15 + 16) = ZeroPte;
  }
  return v15;
}

Referenced by:

MiGetClusterPage
MiGetLargePagesDemoteAsNeeded
MiGetPageChain
MiIdealClusterPage
MiPrefetchPreallocatePages
MiProcessVaContiguityInformation
MiResolvePrivateZeroFault