MiPrefetchPreallocatePages

VOID __fastcall MiPrefetchPreallocatePages(INT64 a1, INT64 a2, _MI_PARTITION *a3, INT64 a4, INT64 arg20, 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; 
  UINT64 v25; 
  unsigned __int8 CurrentIrql; 
  KQUEUE *LargePage; 
  INT64 a5; 
  __int128 v29; 
  INT64 v30; 
  LODWORD(v30) = 0;
  v6 = a6;
  v29 = 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 *)arg20 + *(_QWORD *)(arg20 + 8) - a6) >= 0x200000 )
    {
      *(_QWORD *)a1 = 0i64;
      if( v6 >= *(_QWORD *)(a1 + 24) && v6 <= *(_QWORD *)(a1 + 32) )
      {
        v13 = (unsigned int *)(a1 + 40);
        goto LABEL_18;
      }
      v14 = MiObtainReferencedVadEx(v6, 2, &v30);
      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
        && (unsigned int)MiProtectionToCacheAttribute((v16 >> 7) & 0x1F) == 1 )
      {
        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)
          || (v23 = MiAcquireNonPagedResources(a3, 0x200ui64), (*(_DWORD *)(a1 + 16) = v23 >= 0) != 0) )
        {
          MiInitializePageColorBase(a4, *v13, (INT64)&v29);
          v24 = _InterlockedExchangeAdd((volatile signed __int32 *)v29, 1u);
          v25 = DWORD2(v29) & (unsigned int)v24 | HIDWORD(v29);
          CurrentIrql = KeGetCurrentIrql();
          __writecr8(2ui64);
          LODWORD(a5) = 4;
          LargePage = (KQUEUE *)MiGetLargePage((INT64)a3, 1ui64, 1ui64, v25, a5, 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