MiMakeProtoPrivate
NTSTATUS __stdcall MiMakeProtoPrivate(PFnIoInitializeTimer *a1, CHAR a2, UINT64 a3){
NTSTATUS v4;
__int64 v5;
INT64 v8;
unsigned __int64 v9;
_MMPFN *v10;
_MMCLONE_DESCRIPTOR *CloneAddress;
__int64 v12;
_MMPTE *PteBase;
NTSTATUS v14;
UINT64 v15;
INT64 v17;
v4 = 0;
v5 = 0i64;
LODWORD(v8) = MI_READ_PTE_LOCK_FREE(a3);
v17 = v8;
LODWORD(v9) = MI_READ_PTE_LOCK_FREE((INT64)&v17);
v10 = &MmGetPfnDb()[(v9 >> 12) & 0xFFFFFFFFFi64];
if( (v10->u4._bf_0 & 0x1000000000i64) != 0 || (__int64)v10->ListEntry.Blink <= 0 )
{
CloneAddress = MiLocateCloneAddress(
KeGetCurrentThread()->ApcState.Process,
(VOID *)(v10->PteLong | 0x8000000000000000ui64));
v5 = (unsigned __int64)CloneAddress & -(__int64)(CloneAddress->NestingLevel < *(_QWORD *)(*(_QWORD *)(v12 + 1680)
+ 360i64));
}
PteBase = MmGetPteBase();
v14 = MiCopyOnWrite((__int64)((a3 << 25) - ((_QWORD)PteBase << 25)) >> 16, (INT64 *)a3, 0xFFFFFFFFFFFFFFFFui64, 0i64);
if( v14 >= 0 )
{
LOBYTE(v4) = v5 != 0;
return v4;
}
else
{
MiUnlockPageTableInternal((INT64)a1, (UINT64)PteBase + ((a3 >> 9) & 0x7FFFFFFFF8i64));
LOBYTE(v15) = a2;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a1, v15);
MiCopyOnWriteCheckConditions((INT64)a1, (unsigned int)v14);
return 2;
}
}Referenced by:
MiProtectPrivateMemory