MiConvertRunsToPages
UINT64 *__stdcall MiConvertRunsToPages(PHYSICAL_EXTENTS_DESCRIPTOR *FilesystemExtents, UINT64 *NumberOfPages){
unsigned int *v2;
unsigned int v4;
UINT64 v5;
unsigned int *v6;
ULONG NumberOfValidRuns;
PHYSICAL_MEMORY_RUN *Run;
__int64 v10;
unsigned __int64 PageCount;
unsigned int v12;
__int64 *v13;
unsigned __int64 v14;
unsigned int v15;
unsigned int v16;
UINT64 *result;
UINT64 *v18;
ULONG v19;
__int64 v20;
unsigned __int64 *p_PageCount;
__int64 v22;
unsigned __int64 v23;
unsigned __int64 i;
unsigned __int64 v25;
v4 = 0;
v5 = 0i64;
v6 = v2;
NumberOfValidRuns = FilesystemExtents->NumberOfValidRuns;
if( NumberOfValidRuns )
{
Run = FilesystemExtents->Run;
v10 = NumberOfValidRuns;
do
{
PageCount = Run->PageCount;
v5 += PageCount;
if( v4 <= 1 )
{
if( Run->BasePage == 0x8000000000000000ui64 )
{
v4 = -1;
}
else
{
v12 = 0;
v13 = MiLargePageSizes;
do
{
v14 = *v13;
if( !(Run->BasePage % *v13) && !(PageCount % v14) )
break;
v15 = v12 + 1;
v16 = v12 + 1;
if( v4 > v12 )
v16 = v4;
v4 = v16;
if( v14 == 512 )
break;
++v13;
++v12;
}
while( v15 < 3 );
}
}
++Run;
--v10;
}
while( v10 );
if( v4 > 1 )
v4 = -1;
}
*NumberOfPages = v5;
*v6 = v4;
LODWORD(result) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v18 = result;
if( result )
{
v19 = FilesystemExtents->NumberOfValidRuns;
v20 = 0i64;
if( v19 )
{
p_PageCount = &FilesystemExtents->Run[0].PageCount;
v22 = v19;
do
{
v23 = *p_PageCount;
for( i = *(p_PageCount - 1); v23; --v23 )
{
v18[v20] = i;
v25 = i + 1;
++v20;
if( i == 0x8000000000000000ui64 )
v25 = 0x8000000000000000ui64;
i = v25;
}
p_PageCount += 2;
--v22;
}
while( v22 );
}
return v18;
}
return result;
}Referenced by:
MiAllocateFileExtents