MiPrefetchPreallocatePages

VOID __stdcall MiPrefetchPreallocatePages(INT64 a1, INT64 a2, _MI_PARTITION *a3, INT64 a4, INT64 a5, INT64 a6){
  unsigned __int64 v6; 
  __int64 v11; 
  unsigned __int64 v12; 
  unsigned int *v13; 
  __int64 v14; 
  __int64 v15; 
  unsigned int v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  int v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  __int64 v22; 
  int v23; 
  signed __int32 v24; 
  int v25; 
  unsigned __int8 CurrentIrql; 
  _KQUEUE *LargePage; 
  _MI_COLOR_BASE ColorBase[14]; 
  INT64 v29; 

  LODWORD(v29) = 0;
  v6 = a6;
  *(_OWORD *)ColorBase = 0i64;
  if( a4 != 1 && (*(_BYTE *)(a4 + 184) & 7) == 0 )
  {
    v11 = *(_QWORD *)a1;
    v12 = a6 & 0xFFFFFFFFFFE00000ui64;
    if( v11 && v12 == v11 )
      goto LABEL_30;
    if( (unsigned __int64)(a6 - 1) <= 0x7FFFFFFEFFFEi64
      && v12 == a6
      && (unsigned __int64)(*(_QWORD *)a5 + *(_QWORD *)(a5 + 8) - a6) >= 0x200000 )
    {
      *(_QWORD *)a1 = 0i64;
      if( v6 >= *(_QWORD *)(a1 + 24) && v6 <= *(_QWORD *)(a1 + 32) )
      {
        v13 = (unsigned int *)(a1 + 40);
        goto LABEL_18;
      }
      LODWORD(v14) = MiObtainReferencedVadEx(v6, 2, &v29);
      v15 = v14;
      if( !v14 )
        goto LABEL_30;
      v16 = *(_DWORD *)(v14 + 48);
      v17 = (((*(unsigned int *)(v14 + 28) | ((unsigned __int64)*(unsigned __int8 *)(v14 + 33) << 32)) << 12) | 0xFFF)
          + 1;
      if( (v16 & 0x100000) != 0
        && (v16 & 0x70) == 0
        && v17 - v6 >= 0x200000
        && ((v16 >> 12) & 0x3F) != 0
        && MiProtectionToCacheAttribute((v16 >> 7) & 0x1F) == MiCached )
      {
        v13 = (unsigned int *)(a1 + 40);
        v20 = *(unsigned int *)(v15 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v15 + 32) << 32);
        *(_QWORD *)(a1 + 32) = v18;
        *(_QWORD *)(a1 + 24) = v20 << 12;
        *(_DWORD *)(a1 + 40) = v19;
        MiUnlockAndDereferenceVadShared((PVOID)v15);
LABEL_18:
        v21 = *(_QWORD *)(a2 + 88);
        if( v21 )
        {
          if( v21 == *(_QWORD *)(a1 + 8) )
          {
            LODWORD(v22) = MiSearchNumaNodeTable((PVOID)((v21 - (__int64)MmGetPfnDb()) / 48));
            v13 = (unsigned int *)(a1 + 40);
            if( *(_DWORD *)(v22 + 8) == *(_DWORD *)(a1 + 40) - 1 )
            {
              *(_QWORD *)a1 = v6;
              goto LABEL_30;
            }
          }
          MiPrefetchReleasePreallocatedPages(a1, a2, (INT64)a3, 0i64);
        }
        *(_QWORD *)(a1 + 8) = 0i64;
        if( *(_DWORD *)(a1 + 16) || (MiAcquireNonPagedResources(a3, 0x200ui64), (*(_DWORD *)(a1 + 16) = v23 >= 0) != 0) )
        {
          MiInitializePageColorBase((_MMSUPPORT_INSTANCE *)a4, *v13, ColorBase);
          v24 = _InterlockedExchangeAdd(*(volatile signed __int32 **)ColorBase, 1u);
          v25 = ColorBase[2] & v24 | ColorBase[3];
          CurrentIrql = KeGetCurrentIrql();
          __writecr8(2ui64);
          LargePage = (_KQUEUE *)MiGetLargePage((INT64)a3, 1u, MiCached, v25, 4, 0i64);
          *(_QWORD *)(a2 + 88) = LargePage;
          if( LargePage )
            MiConvertEntireLargePageToSmall(LargePage, 1, 2u, (_LARGE_INTEGER *)1, 0i64, 0i64);
          __writecr8(CurrentIrql);
          *(_QWORD *)(a1 + 8) = *(_QWORD *)(a2 + 88);
          *(_QWORD *)a1 = v6;
        }
        goto LABEL_30;
      }
      MiUnlockAndDereferenceVadShared((PVOID)v15);
    }
    else
    {
      *(_QWORD *)a1 = 0i64;
    }
LABEL_30:
    if( !*(_QWORD *)a1 )
      MiPrefetchReleasePreallocatedPages(a1, a2, (INT64)a3, 0i64);
  }
}

Referenced by:

MiPrefetchVirtualMemory