MiAllocateFastLargePagesForMdl

NTSTATUS __fastcall MiAllocateFastLargePagesForMdl(UINT64 rcx0, UINT64 edx0, INT8 a3){
  unsigned int v4; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  int v9; 
  int v10; 
  unsigned __int64 v11; 
  _MI_LARGEPAGE_MEMORY_INFO *LargeZeroPages; 
  int v13; 
  unsigned __int8 CurrentIrql; 
  __int64 v15; 
  _QWORD *v16; 
  INT64 *v17; 
  unsigned __int64 v18; 
  INT64 v19; 
  unsigned int v20; 
  __int64 v21; 
  __int64 v22; 
  UINT64 ZeroFillNeeded; 
  INT64 *v25[2]; 
  __int128 v26; 
  INT64 v27[48]; 

  v4 = edx0;
  memset(v27, 0i64, sizeof(v27));
  v6 = *(_DWORD *)(rcx0 + 60);
  v7 = *(_QWORD *)(rcx0 + 64);
  v8 = 4i64;
  *(_OWORD *)v25 = 0i64;
  v26 = 0i64;
  if( v6 )
  {
    if( v6 == 2 )
    {
      v9 = 28;
    }
    else
    {
      v9 = 4;
      if( v6 == 3 )
        v9 = 0;
    }
  }
  else
  {
    v9 = 12;
  }
  v10 = a3 & 1;
  v11 = (unsigned __int64)*(unsigned int *)(v7 + 40) >> 12;
  LODWORD(ZeroFillNeeded) = v9;
  LargeZeroPages = MiAllocateLargeZeroPages(
                     *(_QWORD *)rcx0,
                     *(_QWORD *)(rcx0 + 40) - v11,
                     *(_QWORD *)(rcx0 + 32),
                     v4,
                     ZeroFillNeeded);
  v13 = (int)LargeZeroPages;
  if( LargeZeroPages )
  {
    CurrentIrql = KeGetCurrentIrql();
    MiInitializeDpcGang((INT64)v27, v4, CurrentIrql < 2u ? 0 : 2);
    LODWORD(v27[23]) |= 0x40u;
    v15 = 0i64;
    *(_QWORD *)(rcx0 + 72) = KeGetCurrentThread()->ApcState.Process;
    v27[0] = rcx0;
    v16 = (_QWORD *)(v7 + 48 + 8 * v11);
    do
    {
      v17 = v25[v15];
      v18 = MiLargePageSizes[v15];
      if( v17 )
      {
        do
        {
          v19 = *v17;
          v20 = 0;
          v21 = ((char *)v17 - (char *)MmGetPfnDb()) / 48;
          if( v18 )
          {
            v22 = 0i64;
            do
            {
              ++v20;
              *v16++ = v21 + v22;
              v22 = v20;
            }
            while( v20 < v18 );
          }
          MiInsertDpcGang((INT64)v27, v17);
          v17 = (INT64 *)v19;
        }
        while( v19 );
      }
      ++v15;
      --v8;
    }
    while( v8 );
    *(_DWORD *)(v7 + 40) += v13 << 12;
    MiStartDpcGang((UINT64 *)v27);
    MiEndDpcGang((INT64)v27);
    *(_QWORD *)(v7 + 16) = 0i64;
    LODWORD(LargeZeroPages) = 2;
    *(_WORD *)(v7 + 10) |= 2u;
    if( v10 )
      *(_QWORD *)(v7 + 24) = 1i64;
  }
  return(int)LargeZeroPages;
}

Referenced by:

MiFindPagesForMdl