MmProtectMdlSystemAddress
NTSTATUS __stdcall MmProtectMdlSystemAddress(_MDL *MemoryDescriptorList, UINT64 NewProtect){
unsigned int v2;
unsigned __int64 MappedSystemVa;
unsigned int ProtectionMask;
unsigned int v7;
__int64 v8;
__int64 ByteCount;
__int16 v10;
VOID *v11;
int v12;
_XSTATE_CONFIGURATION *v13;
VOID *v14;
UINT64 BugCheckParameter4;
unsigned __int64 v16;
int v17;
__int64 v18;
UINT64 v19;
__int64 v20;
int v21;
int v22;
unsigned __int64 v23;
int v24;
__int64 v25;
bool v26;
int v27;
unsigned __int8 CurrentIrql;
_RTL_BALANCED_NODE *v29;
int v30;
_RTL_BALANCED_NODE *v31;
UINT64 v32;
UINT64 v33;
unsigned __int64 v34;
int v35;
NTSTATUS HasIoTracker;
UINT64 v37;
VOID *v38;
unsigned __int64 v39;
PVOID BugCheckParameter2;
_MI_TB_FLUSH_LIST TbFlushList[48];
v2 = NewProtect;
BugCheckParameter2 = MemoryDescriptorList;
memset(TbFlushList, 0i64, 0xB8u);
if( (MemoryDescriptorList->MdlFlags & 1) == 0 )
return -1073741799;
MappedSystemVa = (unsigned __int64)MemoryDescriptorList->MappedSystemVa;
if( MI_IS_PHYSICAL_ADDRESS((VOID *)MappedSystemVa) )
return -1073741637;
ProtectionMask = MiMakeProtectionMask(v2);
v7 = ProtectionMask;
if( ProtectionMask == -1
|| (ProtectionMask >> 3) - 1 <= 1
|| ProtectionMask >> 3 == 3 && (ProtectionMask & 7) != 0
|| (ProtectionMask & 5) == 5 )
{
return -1073741755;
}
v8 = (MappedSystemVa >> 9) & 0x7FFFFFFFF8i64;
ByteCount = MemoryDescriptorList->ByteCount;
v10 = MappedSystemVa;
*(_QWORD *)&TbFlushList[6] = 0i64;
v11 = (VOID *)(MappedSystemVa & 0xFFFFFFFFFFFFF000ui64);
TbFlushList[2] = 20;
v38 = v11;
v12 = 0;
v13 = (_XSTATE_CONFIGURATION *)((char *)MmGetPteBase() + v8);
v39 = ((unsigned __int64)(v10 & 0xFFF) + ByteCount + 4095) >> 12;
v14 = v11;
HasIoTracker = 0;
if( v39 )
{
do
{
LODWORD(BugCheckParameter4) = MI_READ_PTE_LOCK_FREE((INT64)v13);
v37 = BugCheckParameter4;
v16 = BugCheckParameter4;
if( (BugCheckParameter4 & 1) != 0 )
{
v17 = 1;
MiPteInShadowRange((UINT64)&v37);
v18 = (v16 >> 12) & 0xFFFFFFFFFi64;
MiInsertTbFlushEntry(TbFlushList, v14, 1ui64, 0i64);
if( v14 == v11 )
HasIoTracker = MiMappingHasIoTracker(v11);
}
else
{
if( (BugCheckParameter4 & 0x800) == 0 || ((BugCheckParameter4 >> 5) & 0x1F) != 24 )
KeBugCheckEx(0x1Au, (PVOID)0x1235, BugCheckParameter2, v13, (PVOID)BugCheckParameter4);
if( *(&stru_140C4DB30 + 42) )
{
if( (BugCheckParameter4 & 0x10) != 0 )
v16 = BugCheckParameter4 & 0xFFFFFFFFFFFFFFEFui64;
else
v16 = BugCheckParameter4 & ~*(&stru_140C4DB30 + 42);
}
v18 = (v16 >> 12) & 0xFFFFFFFFFi64;
v17 = 0;
if( v14 == v11 )
{
if( (BugCheckParameter4 & 8) != 0 )
v12 = 1;
HasIoTracker = v12;
}
}
if( v7 == 24 )
{
LODWORD(v19) = MiMakeTransitionPte(v18, 24);
v37 = v19;
v20 = v19;
if( v21 == v22 && v14 == v11 )
{
v20 = v19 | 8;
v37 = v19 | 8;
}
v23 = v20;
LOBYTE(v24) = MiPteInShadowRange((UINT64)v13);
if( v24 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v20 & 1) != 0 )
v23 = v20 | 0x8000000000000000ui64;
v13->EnabledFeatures = v23;
v12 = HasIoTracker;
}
else
{
if( (MmGetPfnDb()[v18].u4._bf_0 & 0x4000000000000i64) != 0 )
{
MiMakeProtectionPfnCompatible((_BYTE *)v7, &MmGetPfnDb()[v18]);
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v29 = MiIoSpaceIsConstant(v18, 1i64);
__writecr8(CurrentIrql);
if( v29 )
{
v30 = *(_DWORD *)&v29[1]._bf_0;
}
else
{
v31 = MiLookupIoPageNode(v18);
if( !v31 )
KeBugCheckEx(0x1Au, (PVOID)0x61949, (PVOID)v18, (PVOID)1, 0i64);
v30 = *((unsigned __int16 *)v31[2].Children[0]->Children + v18 - v31[1].ParentValue) >> 14;
}
v27 = v7 & 7;
if( v30 )
{
if( v30 == 2 )
v27 |= 0x18u;
}
else
{
v27 |= 8u;
}
}
LODWORD(v32) = MiMakeValidPte(v13, v18, v27 | 0xA0000000);
v37 = v32;
v33 = v32;
if( v17 == 1 )
{
MiWriteValidPteNewProtection((INT64 *)v13, v32);
}
else
{
v34 = v32;
LOBYTE(v35) = MiPteInShadowRange((UINT64)v13);
if( v35 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v33 & 1) != 0 )
v34 = v33 | 0x8000000000000000ui64;
v13->EnabledFeatures = v34;
}
v12 = HasIoTracker;
if( HasIoTracker == 1 )
{
v25 = (__int64)v38;
if( v38 == v11 )
MiMappingHasIoReferences(v11);
goto LABEL_35;
}
}
v25 = (__int64)v38;
LABEL_35:
v14 = (VOID *)(v25 + 4096);
v13 = (_XSTATE_CONFIGURATION *)((char *)v13 + 8);
v26 = v39-- == 1;
v38 = v14;
}
while( !v26 );
}
MiFlushTbList(TbFlushList);
return 0;
}Referenced by:
No references.