MiCombinePte
NTSTATUS __stdcall MiCombinePte(INT64 a1, INT64 a2, INT64 a3){
__int64 v4;
int v5;
_ETHREAD *CurrentThread;
_QWORD *v8;
__int64 v9;
_MI_PAGE_COMBINING_SUPPORT *v10;
INT64 v11;
unsigned __int64 v12;
_UNICODE_STRING *v13;
_UNICODE_STRING *v14;
UINT8 v15;
PWCHAR v16;
int v17;
__int64 v18;
_QWORD *v20;
__int64 v21;
unsigned __int64 v22;
unsigned __int64 *v23;
__int64 v24;
int v25;
int v26;
unsigned __int64 Long;
NTSTATUS v28;
unsigned __int64 v29;
INT64 v30;
unsigned __int64 v31;
v4 = *(_QWORD *)(a1 + 24);
v5 = a3;
if( !*(_QWORD *)(v4 + 104) )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = *(_QWORD **)(a1 + 168);
v9 = v8[3];
v10 = *(_MI_PAGE_COMBINING_SUPPORT **)v9;
if( (*(_BYTE *)(v4 + 184) & 7) != 0
|| (*(_DWORD *)(v4 - 1664 + 1124) & 0xC00u) >= 0xC00 && !MiIsStoreProcess((_EPROCESS *)(v4 - 1664)) )
{
if( v5 >= 1 )
return 0;
LODWORD(v11) = MI_READ_PTE_LOCK_FREE(a2);
v30 = v11;
LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)&v30);
v31 = (v12 >> 12) & 0xFFFFFFFFFi64;
v13 = (_UNICODE_STRING *)&MmGetPfnDb()[v31];
LOBYTE(v17) = MI_PFN_IS_PROTO(v13, v14, v15, v16);
if( v17 )
return 0;
v18 = *(_QWORD *)(v9 + 8);
if( v18 && *(_DWORD *)(v18 + 4) || (CurrentThread->CrossThreadFlags & 1) != 0 )
return 4;
if( MiCombineCandidate(v10, 0i64) == MiCombineNone )
return 0;
++*(_QWORD *)(*(_QWORD *)(v9 + 24) + 16i64);
v20 = (_QWORD *)(v8[4] + 40i64 * v8[1]);
if( (v30 & 0x20) != 0 )
{
LODWORD(v21) = MiComputeHash64((UINT64 *)((((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16) & 0xFFFFFFFFFFFFF000ui64));
*v20 = v21;
}
else
{
MiGetUltraMapping((_MI_ZERO_THREAD_CONTEXT *)(v9 + 208), 3i64);
v23 = (unsigned __int64 *)((char *)&MmGetPteBase()->u.Long + ((v22 >> 9) & 0x7FFFFFFFF8i64));
if( !v23 )
return 0;
v24 = *(_QWORD *)(v9 + 16);
*(_QWORD *)(v24 + 72) = v23;
*(_QWORD *)(v24 + 64) = v13;
LOBYTE(v25) = MiPteInShadowRange((UINT64)v23);
v26 = v25;
if( !MiMapArbitraryPage(v10, (_MI_ARBITRARY_PAGE_MAP *)v24, MiCombineNone, 0i64) )
{
Long = ZeroPte.u.Long;
if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*v23 = Long;
return 0;
}
v28 = MiPerformCombineScan((_MI_COMBINE_CONTROL_BLOCK *)v9, (_MI_ARBITRARY_PAGE_MAP *)v24, 0i64);
MiReleaseArbitraryPage((_MI_ARBITRARY_PAGE_MAP *)v24);
v29 = ZeroPte.u.Long;
if( v26 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
v29 = ZeroPte.u.Long | 0x8000000000000000ui64;
*v23 = v29;
if( v28 != 1 )
return 0;
}
v20[1] = v31;
v20[2] = 0i64;
v20[4] = 0i64;
if( ++v8[1] == v8[2] )
return MiCombineWorkingSetTail(a1);
return 0;
}
}
return 3;
}Referenced by:
No references.