MiAddPhysicalPagesToCrashDump
VOID __stdcall MiAddPhysicalPagesToCrashDump(_MM_KERNEL_DUMP_CONTEXT *Context){
PHYSICAL_MEMORY_DESCRIPTOR *v1;
int v2;
unsigned __int64 v4;
unsigned __int64 BasePage;
_MMPFN *v6;
__int64 v7;
unsigned __int64 EntireField;
__int64 v9;
bool v10;
char v11;
INT64 v12;
INT64 v13;
v1 = MmPhysicalMemoryBlock;
v2 = 0;
if( MmPhysicalMemoryBlock->NumberOfRuns )
{
while( 1 )
{
v4 = 0i64;
BasePage = v1->Run[v2].BasePage;
if( v1->Run[v2].PageCount )
break;
LABEL_17:
if( ++v2 >= v1->NumberOfRuns )
return;
}
while( 1 )
{
v6 = &MmGetPfnDb()[BasePage];
v7 = 1i64;
EntireField = v6->u4.EntireField;
if( (EntireField & 0x1000000000i64) != 0 )
break;
if( (*(_BYTE *)(&v6->u3 + 1) & 0xC0) == 64 )
{
v11 = *(_BYTE *)(&v6->u3 + 1) & 7;
if( v11 == 6 )
{
if( ((EntireField >> 60) & 7) == 1
|| (v6->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 0 && (EntireField & 0xFFFFFFFFFi64) == 0xFFFFFFFFDi64 )
{
goto LABEL_16;
}
LABEL_15:
(*(void(__fastcall **)(_MM_KERNEL_DUMP_CONTEXT *, unsigned __int64, __int64, __int64))Context)(
Context,
BasePage,
v7,
2i64);
goto LABEL_16;
}
if( (unsigned __int8)(v11 - 2) <= 1u )
{
v10 = (*(_DWORD *)(&v6->3 + 1) & 0x400i64) == 0;
LABEL_14:
if( v10 )
goto LABEL_15;
}
}
LABEL_16:
v1 = MmPhysicalMemoryBlock;
v4 += v7;
BasePage += v7;
if( v4 >= MmPhysicalMemoryBlock->Run[v2].PageCount )
goto LABEL_17;
}
LODWORD(v12) = 0;
LODWORD(v13) = 0;
LODWORD(v9) = MiGetPagesRemainingInResidentPage((INT64)v6, &v12, &v13);
v7 = v9;
if( (_DWORD)v12 != 6 )
goto LABEL_16;
v10 = (_DWORD)v13 == 1;
goto LABEL_14;
}
}Referenced by:
MmGetDumpRange