MiMakeImageReadOnly
VOID __stdcall MiMakeImageReadOnly(_CONTROL_AREA *ControlArea){
_CONTROL_AREA *v1;
ULONG_PTR v2;
UINT64 v3;
__int64 NumberOfMappedViews_high;
UINT64 v5;
_MMPFN *v6;
__int64 v7;
unsigned __int64 v8;
int v9;
unsigned __int64 v10;
int v11;
_MMPFN *v12;
UINT8 PageIrql;
_CONTROL_AREA *v14;
v1 = ControlArea + 1;
PageIrql = 17;
v2 = 0;
v14 = ControlArea + 1;
if( ControlArea != (_CONTROL_AREA *)-128i64 )
{
do
{
if( (v1->NumberOfPfnReferences & 0x3E) != 2 )
{
v3 = *(_QWORD *)v1->gap8;
NumberOfMappedViews_high = HIDWORD(v1->NumberOfMappedViews);
LOWORD(v1->NumberOfPfnReferences) = v1->NumberOfPfnReferences & 0xFFC1 | 2;
v5 = v3 + 8 * NumberOfMappedViews_high;
if( v3 < v5 )
{
do
{
if( (v3 & 0xFFF) == 0 || PageIrql == 17 )
{
if( PageIrql != 17 )
MiUnlockProtoPoolPage(v2, PageIrql);
while( 1 )
{
v12 = MiLockProtoPoolPage((_MMPTE *)v3, &PageIrql);
v2 = (unsigned int)v12;
if( v12 )
break;
MmAccessFault(2ui64, (PVOID)v3, 0, 0i64);
}
}
v6 = MiLockLeafPage((_MMPTE *)v3, 0i64);
LODWORD(v7) = MI_READ_PTE_LOCK_FREE(v3);
if( v6 )
{
if( (v7 & 1) == 0 )
{
v10 = v7 & 0xFFFFFFFFFFFFFC1Fui64 | 0x20;
LOBYTE(v11) = MiPteInShadowRange(v3);
if( v11 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v10 & 1) != 0 )
v10 |= 0x8000000000000000ui64;
*(_QWORD *)v3 = v10;
v6->OriginalPte.u.Long = v6->OriginalPte.u.Long & 0xFFFFFFFFFFFFFC1Fui64 | 0x20;
}
_InterlockedAnd64(&v6->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
else if( (v7 & 0x400) != 0 || v7 )
{
v8 = v7 & 0xFFFFFFFFFFFFFC1Fui64 | 0x20;
LOBYTE(v9) = MiPteInShadowRange(v3);
if( v9 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v8 & 1) != 0 )
v8 |= 0x8000000000000000ui64;
*(_QWORD *)v3 = v8;
}
v3 += 8i64;
}
while( v3 < v5 );
v1 = v14;
}
if( PageIrql != 17 )
{
MiUnlockProtoPoolPage(v2, PageIrql);
PageIrql = 17;
}
}
v1 = *(_CONTROL_AREA **)&v1->gap8[8];
v14 = v1;
}
while( v1 );
}
}Referenced by:
No references.