MmSetPageProtection
UINT8 __stdcall MmSetPageProtection(VOID *VirtualAddress, UINT64 NumberOfBytes, UINT64 NewProtect){
unsigned int v3;
unsigned int ProtectionMask;
char v7;
_XSTATE_CONFIGURATION *v8;
UINT64 v9;
__int64 v10;
__int64 v11;
int v12;
unsigned __int64 v13;
__int64 v14;
unsigned __int64 v15;
unsigned __int64 v16;
_MMPFN *v17;
__int64 v19[2];
_MI_TB_FLUSH_LIST TbFlushList[48];
v3 = NewProtect;
memset(TbFlushList, 0i64, 0xB8u);
if( MI_IS_PHYSICAL_ADDRESS(VirtualAddress) )
return 0;
ProtectionMask = MiMakeProtectionMask(v3);
v7 = ProtectionMask;
if( ProtectionMask > 7 || (ProtectionMask & 5) == 5 || (ProtectionMask & 2) != 0 && (MiFlags & 0x10000) != 0 )
return 0;
v8 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + (((unsigned __int64)VirtualAddress >> 9) & 0x7FFFFFFFF8i64));
v9 = (NumberOfBytes >> 12) + ((NumberOfBytes & 0xFFF) != 0);
LODWORD(v10) = MiMakeValidPte(v8, 0i64, ProtectionMask | 0xA0000000);
*(_QWORD *)&TbFlushList[6] = 0i64;
TbFlushList[2] = 20;
v11 = v10;
MiInsertTbFlushEntry(TbFlushList, VirtualAddress, v9, 0i64);
if( v9 )
{
MiPteInShadowRange((UINT64)v19);
v12 = v7 & 4;
do
{
LODWORD(v13) = MI_READ_PTE_LOCK_FREE((INT64)v8);
v19[0] = v13;
v14 = (v13 >> 12) & 0xFFFFFFFFFi64;
v15 = (v14 << 12) | v11 & 0xFFFF000000000FFFui64;
v16 = v15;
v17 = &MmGetPfnDb()[v14];
if( v12 )
{
v15 |= 0x42ui64;
if( (v19[0] & 0x42) == 0 )
v15 = v16;
}
else if( (((unsigned __int64)MmGetPfnDb()[v14].u4._bf_0 >> 50) & 1) != 0 )
{
MiLockPageAndSetDirty(v17, 0i64);
}
v11 = v15 | 0x20;
MiWriteValidPteNewProtection((INT64 *)v8, v11);
v8 = (_XSTATE_CONFIGURATION *)((char *)v8 + 8);
--v9;
}
while( v9 );
}
MiFlushTbList(TbFlushList);
return 1;
}Referenced by:
KeWriteProtectProcessorState
MmAllocateIsrStack
VslpIumPhase0Initialize
sub_1403E91C0