MiCombineCandidate
_MI_COMBINE_CANDIDATE __stdcall 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;
_MI_COMBINE_CANDIDATE v16;
__int64 v17;
int v18;
unsigned __int64 v20;
_UNICODE_STRING antNameA;
__int128 v22;
__int128 v23;
__int64 v24;
v3 = (char)InputPfn;
v4 = *(_OWORD *)(v2 + 16);
antNameA = *(_UNICODE_STRING *)v2;
v5 = *(_OWORD *)(v2 + 32);
v22 = v4;
v23 = v5;
if( (BYTE2(v5) & 7u) <= 1 )
return 0;
Buffer = (unsigned __int64)antNameA.Buffer;
v7 = (*((_QWORD *)&v23 + 1) >> 39) & 0x3FFi64;
if( *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v7) != Pcs->Partition && (v3 & 1) == 0 )
return 0;
LOBYTE(v8) = MI_PFN_IS_PROTO(&antNameA, (_UNICODE_STRING *)v7, BYTE8(v23), (PWCHAR)v2);
if( v8 )
return 0;
if( (v9 & 0x1000000000i64) != 0 )
return 0;
if( (BYTE3(v23) & 8) != 0 )
return 0;
PteBase = (unsigned __int64)MmGetPteBase();
if( Buffer < PteBase
|| Buffer > (unsigned __int64)MmGetPteLimit()
|| (*((_QWORD *)&v22 + 1) & 0x4000000000000000i64) != 0
|| ((v9 >> 60) & 7) == 4
|| (Buffer | 0x8000000000000000ui64) <= PteBase + 0x3FFFFFFF78i64
&& (Buffer | 0x8000000000000000ui64) >= PteBase
&& (BYTE3(v23) & 0x20) != 0 )
{
return 0;
}
if( *(&stru_140C50B28 + 4726)
&& _bittest64(*(&stru_140C50B28 + 756), (unsigned __int64)((v10 - (__int64)MmGetPfnDb()) / 48) >> 9) )
{
return 0;
}
v12 = v22;
v24 = v22;
if( (v22 & 1) != 0
|| (_QWORD)v22 && *(&stru_140C4DB30 + 42) && (*(&stru_140C4DB30 + 42) & (unsigned __int64)v22) == 0 )
{
return 0;
}
v13 = ((unsigned __int64)v22 >> 5) & 0x1F;
if( (_DWORD)v13 == 24
|| (_DWORD)v13 == 31
|| (((unsigned __int64)v22 >> 5) & 0x18) == 16
|| (unsigned int)v13 >= 0x1E
|| MiGetPagePrivilege((ULONG_PTR)&antNameA, 0i64, 0i64) )
{
return 0;
}
v14 = (__int64)((Buffer << 25) - (PteBase << 25)) >> 16;
if( v14 >= 0xFFFF800000000000ui64 )
v15 = *((unsigned __int8 *)&stru_140C4DB30 + ((v14 >> 39) & 0x1FF) + 6872);
else
v15 = 0;
if( Buffer > PteBase + 0x3FFFFFFF78i64 )
{
if( v15 == 6 )
{
v16 = MiCombinePagedPool;
}
else
{
if( v15 != 1 || MiIsSessionMetadata((VOID *)v14) )
return 0;
v16 = MiCombineSessionSpace;
}
}
else
{
v16 = MiCombineUser;
}
v17 = BYTE2(v23) & 7;
if( (unsigned __int8)(v17 - 2) > 1u || (_WORD)v23 )
{
if( (_BYTE)v17 != 6
|| (antNameA.Length & 1) == 0
|| (*((_QWORD *)&v23 + 1) & 0xFFFFFFFFFi64) == 0xFFFFFFFFDi64
|| (_WORD)v23 != 1
|| (*((_QWORD *)&v22 + 1) & 0x3FFFFFFFFFFFFFFFi64) != 1 )
{
return 0;
}
if( v16 == MiCombineUser && (v12 & 0x400) == 0 )
{
if( (v12 & 0x800) == 0
&& (((unsigned __int8)v12 >> 2) & (unsigned __int8)v23) == 0
&& (((unsigned __int8)v12 >> 1) & (unsigned __int8)v23) == 0 )
{
v20 = v12;
if( *(&stru_140C4DB30 + 42) && (v12 & 0x10) == 0 )
v20 = v12 & ~*(&stru_140C4DB30 + 42);
if( HIDWORD(v20) == 1 )
return 0;
}
if( (v12 & 0x400) == 0 && ((v12 >> 26) & 1) != 0 )
return 0;
}
}
else if( v16 == MiCombineUser )
{
MI_IS_RESET_PTE();
if( v18 || (unsigned int)MI_IS_SOFTWARE_PTE_SHADOW_STACK(&v24) )
return 0;
}
return v16;
}Referenced by:
MiCapturePfnVm
MiCombineAllPhysicalMemory
MiCombinePte
MiCrcStillIntact
MiMapArbitraryPage
MiRecheckCombineVm
MiSharePages