MiGetLargePage

INT64 __fastcall MiGetLargePage(INT64 a1, UINT64 a2, UINT64 a3, UINT64 a4, INT64 a5, INT64 a6){
  unsigned int v7; 
  unsigned int v8; 
  unsigned int v9; 
  INT64 v10; 
  unsigned __int8 CurrentIrql; 
  unsigned int v12; 
  INT64 FreeZeroLargePages; 
  UINT8 *v14; 
  INT64 v15; 
  int v17; 
  _BOOL8 v18; 
  __int64 v19; 
  UINT64 v20; 
  INT64 v21; 
  INT64 v22; 
  INT64 v23; 
  _MI_PFN_CACHE_ATTRIBUTE v24; 
  UINT64 v25[3]; 
  INT64 result; 
  v24 = (int)a3;
  v7 = a4;
  v8 = a2;
  *(UINT64 *)((char *)&v25[1] + 4) = a6;
  LODWORD(v25[0]) = a4;
  memset((INT64)&result, 0i64);
  v9 = v7 >> byte_140C4DBCC;
  v10 = *(_QWORD *)(a1 + 16) + 4544i64 * (v7 >> byte_140C4DBCC);
  if( !*(_QWORD *)(v10 + 4176) && (MiFlags & 0x30) != 0 )
    return 0i64;
  CurrentIrql = KeGetCurrentIrql();
  v12 = v8 + 1;
  while( 1 )
  {
    --v12;
    LODWORD(v23) = v24;
    LODWORD(v22) = 4;
    LODWORD(v21) = v7;
    LODWORD(v20) = v9;
    FreeZeroLargePages = MiGetFreeZeroLargePages(a1, v12, 1i64, (unsigned int)a5 | 0x20, v20, v21, v22, v23);
    v15 = FreeZeroLargePages;
    if( FreeZeroLargePages )
      break;
    v7 = v25[0];
    if( !v12 )
      return 0i64;
  }
  v17 = *(_DWORD *)(FreeZeroLargePages + 16);
  v18 = (v17 & 0x3E0) != 0i64;
  HIDWORD(v25[0]) = (v17 & 0x3E0) != 0i64;
  if( v12 == v8 )
  {
    MiLargePageMovesComplete(a1, v9, v14);
  }
  else
  {
    MiInsertDemotedPages(v10, v15, v12, v8, v15);
    LODWORD(v25[0]) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)(v15 + 24), 0x3Fui64) )
    {
      do
        KeYieldProcessorEx(v25);
      while( *(__int64 *)(v15 + 24) < 0 );
    }
    _InterlockedAnd64((volatile signed __int64 *)(v15 + 24), 0x7FFFFFFFFFFFFFFFui64);
  }
  __writecr8(CurrentIrql);
  v19 = (v15 - (__int64)MmGetPfnDb()) / 48;
  if( !v18 && (MiFlags & 0x80u) != 0 && (++dword_140C4E50C & MmPageValidationFrequency) == 0 )
    MiArePageContentsZero((PVOID)v19);
  MiIsFreeZeroPfnCold(v15);
  if( HIDWORD(v25[0]) == 1 )
  {
    if( HIDWORD(result) )
      MiNotifyPageHeat(&result);
    if( v12 == 3 )
      MiZeroPhysicalPage(v19, 0i64, v24);
    else
      MiZeroLargePage(v15, v8, (unsigned int)v24);
    *(_QWORD *)(v15 + 16) = ZeroPte;
  }
  return v15;
}

Referenced by:

MiGetClusterPage
MiGetLargePagesDemoteAsNeeded
MiGetPageChain
MiIdealClusterPage
MiPrefetchPreallocatePages
MiProcessVaContiguityInformation
MiResolvePrivateZeroFault