MiAllocateMdlPagesByLists
NTSTATUS __stdcall MiAllocateMdlPagesByLists(
PVOID *Partition,
_MDL *MemoryDescriptorList,
UINT64 Flags,
_MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
UINT64 HighPage,
UINT64 SizeInPages,
UINT16 IdealNode){
UINT64 v8;
__int64 v9;
_MI_PARTITION *v10;
__int16 v11;
signed __int32 v12;
unsigned int v13;
unsigned int v14;
int v15;
__int64 v16;
unsigned __int64 ByteCount;
int v18;
int v19;
_MMPFN *PfnDb;
UINT64 v21;
UINT64 v22;
INT64 v23;
NTSTATUS v24;
__int64 v25;
unsigned __int64 v26;
void *v27;
__int64 v28;
int v29;
__int64 v30;
__int64 v31;
int v32;
int v33;
__int64 v34;
NTSTATUS v35;
unsigned int v37;
int v38;
_MDL **v39;
__int128 v40;
char v43;
int IdealNodea;
v43 = Flags;
v8 = 0i64;
v9 = 0i64;
v10 = (_MI_PARTITION *)Partition;
v40 = 0i64;
MiInitializePageColorBase(0i64, (unsigned int)(IdealNode + 1), (_MI_COLOR_BASE *)&v40);
v12 = _InterlockedExchangeAdd((volatile signed __int32 *)v40, 1u);
v13 = 8;
v14 = HIDWORD(v40) | v12 & DWORD2(v40);
v15 = -1;
v37 = v14;
ByteCount = MemoryDescriptorList->ByteCount;
v18 = v11 & 0x400;
*(_QWORD *)&v40 = *(&KiProcessorBlock + *(unsigned int *)(v16 + 588));
v38 = v18;
v39 = &MemoryDescriptorList[1].Next + (ByteCount >> 12);
v19 = 1;
IdealNodea = 1;
while( 1 )
{
PfnDb = MmGetPfnDb();
if( v19 == 1 )
{
IdealNodea = 0;
v13 = 2 * ((v11 & 1) == 0) + 8;
}
if( v18 )
LODWORD(v21) = MiGetEnclavePage(v10, 0i64);
else
LODWORD(v21) = MiGetPage((ULONG_PTR *)&v10->Core.PartitionId, v14, v13);
v22 = v21;
if( v21 == -1i64 )
{
v14 = v37;
LABEL_21:
v35 = 1;
goto LABEL_22;
}
v23 = (INT64)&PfnDb[v21];
if( v21 > HighPage )
break;
v24 = MiPfnZeroingNeeded((_MMPFN *)v23, CacheAttribute);
v25 = v9 + 1;
if( !v24 )
v25 = v9;
v9 = v25;
if( v15 == -1 )
{
LODWORD(v34) = MiSearchNumaNodeTable((PVOID)((v23 - (__int64)PfnDb) / 48));
v15 = *(_DWORD *)(v34 + 8);
}
v26 = (__int64)((unsigned __int128)((v23 - (__int64)PfnDb) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64) >> 3;
v27 = (void *)((v26 >> 63) + v26);
LODWORD(v28) = MiSearchNumaNodeTable(v27);
if( *(_DWORD *)(v28 + 8) == v15 )
{
if( (*(_DWORD *)(v23 + 16) & 0x3E0i64) != 0 )
{
if( (v43 & 1) == 0 )
v13 &= ~2u;
}
else
{
v29 = v13 | 2;
if( (v43 & 1) == 0 )
v29 = v13;
v13 = v29;
}
}
else
{
IdealNodea = 1;
}
LODWORD(v30) = MiSearchNumaNodeTable(v27);
++v8;
v15 = *(_DWORD *)(v30 + 8);
*v39++ = (_MDL *)v22;
LODWORD(v31) = MiSearchNumaNodeTable(v27);
v32 = *(_DWORD *)(v31 + 8);
v33 = (MiGetPfnChannel(v23) << *(&stru_140C4DB30 + 157)) | *(&stru_140C4DB30 + 66) & v22 | (v32 << *(&stru_140C4DB30 + 156));
v14 = v33 & ~*(&stru_140C4DB30 + 36) | *(&stru_140C4DB30 + 36) & (v33 + 1);
v37 = v14;
if( v8 >= SizeInPages )
goto LABEL_21;
v19 = IdealNodea;
LOBYTE(v11) = v43;
v10 = (_MI_PARTITION *)Partition;
v18 = v38;
}
MiReleaseFreshPage((_MMPFN *)v23);
v14 = v37;
v35 = 0;
LABEL_22:
if( v8 )
*(_DWORD *)(v40 + 32528) = v14;
MemoryDescriptorList->ByteCount += (_DWORD)v8 << 12;
if( v9 )
MemoryDescriptorList->MappedSystemVa = (void *)1;
return v35;
}Referenced by:
MiFindPagesForMdl