MiMakeProtoPrivate
INT64 __fastcall MiMakeProtoPrivate(INT64 a1, UINT8 a2, UINT64 a3){
unsigned int v4;
__int64 v5;
char *v8;
unsigned __int64 CloneAddress;
__int64 v10;
_MMPTE *PteBase;
int v12;
INT64 v14;
v4 = 0;
v5 = 0i64;
v14 = MI_READ_PTE_LOCK_FREE(a3);
v8 = (char *)MmGetPfnDb() + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&v14) >> 12) & 0xFFFFFFFFFi64);
if( (*((_QWORD *)v8 + 5) & 0x1000000000i64) != 0 || *((__int64 *)v8 + 1) <= 0 )
{
CloneAddress = (unsigned __int64)MiLocateCloneAddress(
*((_QWORD *)KeGetCurrentThread() + 23),
*((_QWORD *)v8 + 1) | 0x8000000000000000ui64);
v5 = CloneAddress & -(__int64)(*(_QWORD *)(CloneAddress + 96) < *(_QWORD *)(*(_QWORD *)(v10 + 1680) + 360i64));
}
PteBase = MmGetPteBase();
v12 = MiCopyOnWrite((__int64)((a3 << 25) - ((_QWORD)PteBase << 25)) >> 16, (UINT64 *)a3, -1i64, 0i64);
if( v12 >= 0 )
{
LOBYTE(v4) = v5 != 0;
return v4;
}
else
{
MiUnlockPageTableInternal(a1, (UINT64)PteBase + ((a3 >> 9) & 0x7FFFFFFFF8i64));
MiUnlockWorkingSetShared(a1, a2);
MiCopyOnWriteCheckConditions(a1, (unsigned int)v12);
return 2i64;
}
}Referenced by:
MiProtectPrivateMemory