MiWriteSharedDemandZeroPte
VOID __stdcall MiWriteSharedDemandZeroPte(
_MMCLONE_DESCRIPTOR *ZeroCloneDescriptor,
_MMCLONE_BLOCK *CloneBlock,
_MMPTE *PointerNewPte,
_MI_CLONE_CHARGES *CommitBlock){
union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v4;
__int64 v8;
int v9;
unsigned __int64 v10;
__int64 NumberOfPtes_high;
__int64 v12;
int v13;
_QWORD *v14;
v4.Long = (unsigned __int64)PointerNewPte[3].u;
if( v4.Long )
{
++PointerNewPte[2].u.Long;
PointerNewPte[3].u.Long = v4.Long + 1;
++*v14;
}
else
{
v8 = MiSwizzleInvalidPte((PointerNewPte[2].u.Long >> 54) & 0x3E0);
LOBYTE(v9) = MiPteInShadowRange((UINT64)PointerNewPte);
if( v9 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
v8 |= 0x8000000000000000ui64;
PointerNewPte->u.Long = v8;
v10 = PointerNewPte[2].u.Long & 0xF800000000000001ui64;
PointerNewPte[3].u.Long = 1i64;
PointerNewPte[2].u.Long = v10 | 1;
NumberOfPtes_high = HIWORD(ZeroCloneDescriptor[16].NumberOfPtes);
++v14[1];
_InterlockedExchangeAdd64(
(volatile signed __int64 *)(*(_QWORD *)(*(&stru_140C4DB30 + 267) + 8 * NumberOfPtes_high) + 7624i64),
1ui64);
}
v12 = MiSwizzleInvalidPte(((_QWORD)PointerNewPte << 16) | 0x400i64) | 8;
LOBYTE(v13) = MiPteInShadowRange((UINT64)CommitBlock);
if( v13 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v12 & 1) != 0 )
v12 |= 0x8000000000000000ui64;
*CommitBlock = (_MI_CLONE_CHARGES)v12;
}Referenced by:
MiBuildForkPte