MiAddRangeToCrashDump
NTSTATUS __stdcall MiAddRangeToCrashDump(
_MM_KERNEL_DUMP_CONTEXT *Context,
_MMPTE *PointerPxe,
_MMPTE *EndPxe,
_MI_VA_RANGE *VaHierarchy,
UINT64 PagingLevel){
__int64 v5;
__int64 v6;
_MMPTE *v7;
NTSTATUS v9;
UINT64 v10;
UINT64 v11;
UINT64 v12;
UINT64 v13;
__int64 v14;
__int64 v15;
__int64 v16;
__int64 v17;
NTSTATUS SystemRegionType;
_MI_VA_RANGE *v19;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
__int64 v21;
__int64 v22;
__int64 v23;
unsigned __int64 v24;
__int64 v25;
__int64 v26;
unsigned __int64 v27;
__int64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
unsigned __int64 v31;
int v32;
_MMPTE *v33;
NTSTATUS v34;
UINT64 v35;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *v36;
__int64 v37;
_MMPFN *v38;
int v39;
UINT64 v40;
unsigned __int64 v41;
_MMPTE *PteBase;
int v43;
UINT64 v45;
UINT64 v46;
_MI_VA_RANGE *VaHierarchya;
VaHierarchya = VaHierarchy;
v5 = (unsigned int)PagingLevel;
v6 = (__int64)PointerPxe;
v7 = EndPxe;
v9 = 0;
if( (unsigned __int64)PointerPxe < *(_QWORD *)&VaHierarchy[4 * (int)PagingLevel] )
v6 = *(_QWORD *)&VaHierarchy[4 * (int)PagingLevel];
if( (unsigned __int64)EndPxe > *(_QWORD *)&VaHierarchy[4 * (int)PagingLevel + 2] )
v7 = *(_MMPTE **)&VaHierarchy[4 * (int)PagingLevel + 2];
while( v6 <= (unsigned __int64)v7 )
{
if( (_DWORD)v5 == 3 )
KdCheckForDebugBreak();
LODWORD(v10) = MI_READ_PTE_LOCK_FREE(v6);
v46 = v10;
v11 = v10;
v12 = v10 & 1;
if( (v10 & 1) != 0 )
{
v13 = v10;
MiPteInShadowRange((UINT64)&v46);
v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
if( v14 == MiState[(int)v5 + 1185] || v14 == MiState[(int)v5 + 1181] )
goto LABEL_64;
}
else
{
if( (_DWORD)v5 )
goto LABEL_64;
v14 = 0i64;
}
if( (_DWORD)v5 == 3 )
{
if( (_MMPTE *)v6 == MmGetPxeSelfRef() )
goto LABEL_64;
v15 = v6;
v16 = (_QWORD)MmGetPteBase() << 25;
v17 = 4i64;
do
{
v15 = ((v15 << 25) - v16) >> 16;
--v17;
}
while( v17 );
SystemRegionType = MiGetSystemRegionType(v15);
v19 = VaHierarchya;
if( VaHierarchya[20] == 1 && SystemRegionType == 1 )
goto LABEL_64;
if( SystemRegionType == 8 )
goto LABEL_64;
}
else
{
v19 = VaHierarchya;
}
if( (_DWORD)v5 )
{
p_u4 = &MmGetPfnDb()->u4;
if( (v11 & 0x80u) != 0i64 )
{
if( (((unsigned __int64)p_u4[6 * v14]._bf_0 >> 50) & 1) == 0 )
goto LABEL_64;
v21 = (_QWORD)MmGetPteBase() << 25;
v22 = (v6 << 25) - v21;
v23 = (v22 + 0x10000000) >> 16;
v24 = v22 >> 16;
if( (int)v5 > 0 )
{
v25 = v5;
do
{
v24 = (__int64)((v24 << 25) - v21) >> 16;
v23 = ((v23 << 25) - v21) >> 16;
--v25;
}
while( v25 );
}
v26 = *((_QWORD *)v19 + 9);
v27 = *((_QWORD *)v19 + 8) & 0xFFFFFFFFFFFFF000ui64;
v28 = 1i64;
v29 = v23 - 1;
if( v24 >= v27 )
v27 = v24;
v30 = v26 | 0xFFF;
if( v29 <= v30 )
v30 = v29;
v31 = (v30 - v27 + 1) >> 12;
goto LABEL_61;
}
if( (((unsigned __int64)p_u4[6 * v14]._bf_0 >> 50) & 1) != 0 )
{
v32 = (*(__int64(__fastcall **)(_MM_KERNEL_DUMP_CONTEXT *, __int64, __int64))Context)(Context, v14, 1i64);
if( v32 < 0 && v9 >= 0 )
v9 = v32;
}
v33 = (_MMPTE *)(((v6 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
LODWORD(v45) = v5 - 1;
v34 = MiAddRangeToCrashDump(Context, v33, v33 + 511, VaHierarchya, v45);
if( v34 < 0 && v9 >= 0 )
v9 = v34;
}
else
{
if( !v12 )
{
if( (v11 & 0x400) != 0 || (v11 & 0x800) == 0 )
goto LABEL_64;
v35 = v11;
if( *(&stru_140C4DB30 + 42) && (v11 & 0x10) == 0 )
v35 = v11 & ~*(&stru_140C4DB30 + 42);
v14 = (v35 >> 12) & 0xFFFFFFFFFi64;
}
v36 = &MmGetPfnDb()->u4;
v37 = ((unsigned __int64)v36[6 * v14]._bf_0 >> 50) & 1;
if( (((unsigned __int64)v36[6 * v14]._bf_0 >> 50) & 1) != 0 )
{
v38 = &MmGetPfnDb()[v14];
LOBYTE(v39) = MiIsPageSecured((INT64)v38);
if( !v39 )
{
if( MiGetSystemRegionType(v40) == 9 )
{
v41 = v38->PteLong | 0x8000000000000000ui64;
PteBase = MmGetPteBase();
if( v41 <= (unsigned __int64)&PteBase[0x7FFFFFFEFi64]
&& v41 >= (unsigned __int64)PteBase
&& ((v38->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) == 0
|| (*(_BYTE *)(&v38->u3 + 1) & 7) != 6
|| (v38->u4._bf_0 & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64)
&& v14 != *(&stru_140C4DB30 + 304) )
{
LODWORD(v37) = 0;
}
}
if( (_DWORD)v37 == 1 )
{
v28 = 2i64;
v31 = 1i64;
v27 = v14;
LABEL_61:
v43 = (*(__int64(__fastcall **)(_MM_KERNEL_DUMP_CONTEXT *, unsigned __int64, unsigned __int64, __int64))Context)(
Context,
v27,
v31,
v28);
if( v43 < 0 && v9 >= 0 )
v9 = v43;
}
}
}
}
LABEL_64:
v6 += 8i64;
}
return v9;
}Referenced by:
MiAddRangeToCrashDump
MmAddRangeToCrashDump