MiCombineCandidate
INT64 __fastcall MiCombineCandidate(_MI_PAGE_COMBINING_SUPPORT *Pcs, _MMPFN *InputPfn){
__int64 v2;
char v3;
__int128 v4;
__int128 v5;
unsigned __int64 Buffer;
__int64 v7;
int v8;
unsigned __int64 v9;
__int64 v10;
unsigned __int64 PteBase;
unsigned __int64 v12;
unsigned __int64 v13;
unsigned __int64 v14;
int v15;
unsigned int v16;
__int64 v17;
unsigned __int64 v19;
UNICODE_STRING antNameA;
__int128 v21;
__int128 v22;
__int64 a1;
v3 = (char)InputPfn;
v4 = *(_OWORD *)(v2 + 16);
antNameA = *(UNICODE_STRING *)v2;
v5 = *(_OWORD *)(v2 + 32);
v21 = v4;
v22 = v5;
if( (BYTE2(v5) & 7u) <= 1 )
return 0i64;
Buffer = (unsigned __int64)antNameA.Buffer;
v7 = (*((_QWORD *)&v22 + 1) >> 39) & 0x3FFi64;
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * v7) != Pcs->Partition && (v3 & 1) == 0 )
return 0i64;
LOBYTE(v8) = MI_PFN_IS_PROTO(&antNameA, (UNICODE_STRING *)v7, BYTE8(v22), (PWCHAR)v2);
if( v8 )
return 0i64;
if( (v9 & 0x1000000000i64) != 0 )
return 0i64;
if( (BYTE3(v22) & 8) != 0 )
return 0i64;
PteBase = (unsigned __int64)MmGetPteBase();
if( Buffer < PteBase
|| Buffer > (unsigned __int64)MmGetPteLimit()
|| (*((_QWORD *)&v21 + 1) & 0x4000000000000000i64) != 0
|| ((v9 >> 60) & 7) == 4
|| (Buffer | 0x8000000000000000ui64) <= PteBase + 0x3FFFFFFF78i64
&& (Buffer | 0x8000000000000000ui64) >= PteBase
&& (BYTE3(v22) & 0x20) != 0 )
{
return 0i64;
}
if( byte_140C51D9E
&& _bittest64((const signed __int64 *)qword_140C522C8, (unsigned __int64)((v10 - (__int64)MmGetPfnDb()) / 48) >> 9) )
{
return 0i64;
}
v12 = v21;
a1 = v21;
if( (v21 & 1) != 0 || (_QWORD)v21 && qword_140C4DC80 && (qword_140C4DC80 & (unsigned __int64)v21) == 0 )
return 0i64;
v13 = ((unsigned __int64)v21 >> 5) & 0x1F;
if( (_DWORD)v13 == 24
|| (_DWORD)v13 == 31
|| (((unsigned __int64)v21 >> 5) & 0x18) == 16
|| (unsigned int)v13 >= 0x1E
|| (unsigned int)MiGetPagePrivilege((ULONG_PTR)&antNameA, 0, 0i64) )
{
return 0i64;
}
v14 = (__int64)((Buffer << 25) - (PteBase << 25)) >> 16;
if( v14 >= 0xFFFF800000000000ui64 )
v15 = *((unsigned __int8 *)&antNameB + ((v14 >> 39) & 0x1FF) - 256);
else
v15 = 0;
if( Buffer > PteBase + 0x3FFFFFFF78i64 )
{
if( v15 == 6 )
{
v16 = 2;
}
else
{
if( v15 != 1 || (unsigned int)MiIsSessionMetadata((PVOID)v14) )
return 0i64;
v16 = 3;
}
}
else
{
v16 = 1;
}
v17 = BYTE2(v22) & 7;
if( (unsigned __int8)(v17 - 2) > 1u || (_WORD)v22 )
{
if( (_BYTE)v17 != 6
|| (antNameA.Length & 1) == 0
|| (*((_QWORD *)&v22 + 1) & 0xFFFFFFFFFi64) == 0xFFFFFFFFDi64
|| (_WORD)v22 != 1
|| (*((_QWORD *)&v21 + 1) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
{
return 0i64;
}
if( v16 == 1 && (v12 & 0x400) == 0 )
{
if( (v12 & 0x800) == 0
&& (((unsigned __int8)v12 >> 2) & (unsigned __int8)v22) == 0
&& (((unsigned __int8)v12 >> 1) & (unsigned __int8)v22) == 0 )
{
v19 = v12;
if( qword_140C4DC80 && (v12 & 0x10) == 0 )
v19 = v12 & ~qword_140C4DC80;
if( HIDWORD(v19) == 1 )
return 0i64;
}
if( (v12 & 0x400) == 0 && ((v12 >> 26) & 1) != 0 )
return 0i64;
}
}
else if( v16 == 1 && (MI_IS_RESET_PTE(v12) || (unsigned int)MI_IS_SOFTWARE_PTE_SHADOW_STACK(&a1)) )
{
return 0i64;
}
return v16;
}Referenced by:
MiCapturePfnVm
MiCombineAllPhysicalMemory
MiCombinePte
MiCrcStillIntact
MiMapArbitraryPage
MiRecheckCombineVm
MiSharePages