MxComputeFreeNodeDescriptorRequirements
VOID __stdcall MxComputeFreeNodeDescriptorRequirements(_LOADER_PARAMETER_BLOCK *LoaderBlock, UINT64 *RequiredPages){
__int64 v4;
UINT64 v5;
UINT64 v6;
_LIST_ENTRY *Flink;
unsigned __int64 Flink_low;
__int64 v9;
UINT64 v10;
UINT64 Blink;
__int64 v12;
__int64 v13;
__int64 v14;
__int64 v15;
_LIST_ENTRY *p_MemoryDescriptorListHead;
memset(RequiredPages, 0i64, 0x200u);
v4 = 0xFFFFFFFFi64;
v5 = -1i64;
v6 = -1i64;
Flink = LoaderBlock->MemoryDescriptorListHead.Flink;
p_MemoryDescriptorListHead = &LoaderBlock->MemoryDescriptorListHead;
if( Flink != &LoaderBlock->MemoryDescriptorListHead )
{
while( 1 )
{
Flink_low = SLODWORD(Flink[1].Flink);
if( (unsigned int)Flink_low > 0x28 || (v9 = 0x1C5C0C00048i64, !_bittest64(&v9, Flink_low)) )
{
v10 = (UINT64)Flink[2].Flink;
Blink = (UINT64)Flink[1].Blink;
if( v10 )
break;
}
LABEL_9:
Flink = Flink->Flink;
if( Flink == p_MemoryDescriptorListHead )
goto LABEL_10;
}
while( 1 )
{
MiRestrictRangeToNode(Blink, v10);
v15 = v12;
LODWORD(v13) = MiSearchNumaNodeTable((PVOID)Blink);
v14 = *(unsigned int *)(v13 + 8);
if( v6 != -1i64 )
{
if( (_DWORD)v14 == (_DWORD)v4
&& (char *)&MmGetPdeBase()[1] + (((48 * v6) >> 18) & 0x3FFFFFF8) >= (char *)MmGetPdeBase()
+ (((48 * Blink) >> 18) & 0x3FFFFFF8) )
{
goto LABEL_8;
}
RequiredPages[(unsigned int)v4] += MxComputePfnPagesNeeded(v5, v6);
}
v5 = Blink;
LABEL_8:
v4 = v14;
v6 = v15 + Blink;
Blink += v15;
v10 -= v15;
if( !v10 )
goto LABEL_9;
}
}
LABEL_10:
RequiredPages[v4] += MxComputePfnPagesNeeded(v5, v6);
}Referenced by:
MiFindLargestLoaderDescriptor