MxSwitchDescriptors
_MX_ALLOCATION_DESCRIPTOR *__stdcall MxSwitchDescriptors(UINT64 PreferredNode){
_LOADER_PARAMETER_BLOCK *v1;
unsigned __int64 v2;
_LIST_ENTRY *p_MemoryDescriptorListHead;
__int64 *v4;
_LIST_ENTRY *Blink;
int Flink;
unsigned int v7;
__int64 *v8;
__int64 v9;
__int64 v10;
__int64 v11;
_MX_ALLOCATION_DESCRIPTOR *result;
v1 = KeLoaderBlock_0;
v2 = (unsigned int)PreferredNode;
p_MemoryDescriptorListHead = &KeLoaderBlock_0->MemoryDescriptorListHead;
v4 = &qword_140D5AD60[5 * (unsigned int)PreferredNode];
Blink = (_LIST_ENTRY *)v4[4];
while( 2 )
{
if( !Blink )
{
Blink = v1->MemoryDescriptorListHead.Blink;
goto LABEL_14;
}
while( 1 )
{
Blink = Blink->Blink;
LABEL_14:
if( Blink == p_MemoryDescriptorListHead )
break;
Flink = (int)Blink[1].Flink;
if( Flink == 2 || Flink == 24 )
{
v7 = 0;
if( KeNumberNodes )
{
v8 = qword_140D5A380;
do
{
if( Blink == (_LIST_ENTRY *)*v8 )
break;
++v7;
v8 += 5;
}
while( v7 < (unsigned __int16)KeNumberNodes );
}
if( v7 >= (unsigned __int16)KeNumberNodes )
{
LODWORD(v9) = MiSearchNumaNodeTable(Blink[1].Blink);
if( *(_DWORD *)(v9 + 8) == (_DWORD)v2 || (v10 = MxBootDescriptorAnyNode, _bittest64(&v10, v2)) )
{
MiInitializeBootMemoryDescriptor(
(_MX_ALLOCATION_DESCRIPTOR *)v4,
(_MEMORY_ALLOCATION_DESCRIPTOR *)Blink,
(UINT64)Blink[1].Blink,
(UINT64)Blink[2].Flink);
LODWORD(Blink[1].Flink) |= 0x40000000u;
result = (_MX_ALLOCATION_DESCRIPTOR *)v4;
MxFreeDescriptor[v2] = (__int64)v4;
return result;
}
}
}
}
v11 = MxBootDescriptorAnyNode;
if( !_bittest64(&v11, v2) )
{
v4[4] = 0i64;
MxBootDescriptorAnyNode = v11 | (1i64 << v2);
Blink = 0i64;
continue;
}
return 0i64;
}
}Referenced by:
MxGetNextPage