MxMapPfnRange

UINT64 __stdcall MxMapPfnRange(UINT64 BasePage, UINT64 TotalPageCount, UINT64 ZeroFillRequired){
  int v3; 
  UINT64 v4; 
  UINT64 v5; 
  _MMPFN *PfnDb; 
  UINT64 v7; 
  _MMPTE *PteBase; 
  __int64 v9; 
  UINT64 v10; 
  __int64 v11; 
  UINT64 v12; 
  UINT64 v13; 
  __int64 v14; 
  __int64 v15; 
  _MMPTE *v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  char *v19; 
  __int64 v20; 
  int v21; 
  __int64 v22; 
  _MMPTE *v23; 
  __int64 v24; 
  __int64 v26; 
  int v27; 
  int v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  int v32; 
  v32 = ZeroFillRequired;
  v26 = 0i64;
  v28 = 0;
  v3 = ZeroFillRequired;
  v31 = 0i64;
  v4 = TotalPageCount;
  v5 = BasePage;
  PfnDb = MmGetPfnDb();
  v7 = (UINT64)PfnDb + 48 * BasePage;
  PteBase = MmGetPteBase();
  if( v7 == (v7 & 0xFFFFFFFFFFE00000ui64) )
    v9 = 0i64;
  else
    v9 = (__int64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64);
  if( TotalPageCount == -1i64
    || (v10 = (UINT64)PfnDb + 48 * BasePage + 48 * TotalPageCount, v10 == (v10 & 0xFFFFFFFFFFE00000ui64)) )
  {
    v11 = 0i64;
  }
  else
  {
    v11 = (__int64)PteBase + (((v10 - 1) >> 9) & 0x7FFFFFFFF8i64);
  }
  v29 = v9;
  v30 = v11;
  if( !TotalPageCount )
    return 1i64;
  while( 1 )
  {
    v12 = v4;
    if( v4 == -1i64 )
    {
      v4 = 0i64;
      v14 = MmPfnDatabase + (MxPfnAllocation << 12);
    }
    else
    {
      MiRestrictRangeToNode(v5, v4);
      v12 = v13;
      v4 -= v13;
      v14 = (__int64)PfnDb + 48 * v5 + 48 * v13;
    }
    LODWORD(v15) = MiSearchNumaNodeTable((PVOID)v5);
    v27 = *(_DWORD *)(v15 + 8);
    v16 = MmGetPteBase();
    v17 = (((unsigned __int64)MmGetPfnDb() + 48 * v5) >> 9) & 0x7FFFFFFFF8i64;
    v5 += v12;
    v18 = (unsigned __int64)v16 + v17;
    v19 = (char *)v16 + (((unsigned __int64)(v14 - 1) >> 9) & 0x7FFFFFFFF8i64);
    if( v18 <= (unsigned __int64)v19 )
      break;
LABEL_21:
    if( !v4 )
      return 1i64;
    PfnDb = MmGetPfnDb();
  }
  v20 = (_QWORD)v16 << 25;
  while( 1 )
  {
    if( v18 == v9 || (v21 = v3, v18 == v11) )
      v21 = 1;
    LODWORD(v31) = 0;
    v28 = v21;
    v26 = (__int64)((v18 << 25) - v20) >> 16;
    if( !(unsigned int)MxMapVa((__int64)&v26) )
      return 0i64;
    if( (_DWORD)v31 )
    {
      v22 = (unsigned int)v31;
      v23 = MmGetPteBase();
      do
      {
        v18 = (unsigned __int64)v23 + ((v18 >> 9) & 0x7FFFFFFFF8i64);
        --v22;
      }
      while( v22 );
      v18 += 8i64;
      v3 = v32;
      v24 = (unsigned int)v31;
      do
      {
        v18 = (__int64)((v18 << 25) - v20) >> 16;
        --v24;
      }
      while( v24 );
    }
    else
    {
      v18 += 8i64;
    }
    if( v18 > (unsigned __int64)v19 )
      goto LABEL_21;
  }
}

Referenced by:

MiCreateSparsePfnDatabase