MiInvalidateCollidedIos
NTSTATUS __stdcall MiInvalidateCollidedIos(_MMINPAGE_SUPPORT *InPageSupport){
_MMPFN *PfnDb;
NTSTATUS v2;
_QWORD *v4;
_MMINPAGE_SUPPORT *InitialInPageSupport;
_LIST_ENTRY *v6;
_LIST_ENTRY *v7;
_LIST_ENTRY *v8;
_MMPFN *v9;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
_LIST_ENTRY *ListHead;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
INT64 v16;
__int64 v17;
_MDL *p_Mdl;
_MDL *v19;
unsigned __int64 v20;
__int64 Next;
unsigned __int64 v22;
unsigned __int64 v23;
_MMPFN *v24;
unsigned __int64 v25;
_MMPFN *v26;
INT64 v27;
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;} v28;
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;} v29;
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;} v30;
int v31;
_MMPFN *v32;
PfnDb = MmGetPfnDb();
v2 = 1;
if( (InPageSupport->u1.e1._bf_0 & 0x10) != 0 )
{
ListHead = InPageSupport->ListHead;
Flink = InPageSupport->ListHead[0].Flink;
if( Flink->Blink != ListHead || (Blink = ListHead->Blink, Blink->Flink != ListHead) )
LABEL_29:
__fastfail(3u);
Blink->Flink = Flink;
Flink->Blink = Blink;
v16 = InPageSupport->Page[0];
v17 = v16;
InitialInPageSupport = InPageSupport->FlowThrough.InitialInPageSupport;
v4 = (_QWORD *)(MmGetPfnDb()[v16].PteLong | 0x8000000000000000ui64);
p_Mdl = &InitialInPageSupport->Mdl;
if( InitialInPageSupport->PrefetchMdl )
p_Mdl = InitialInPageSupport->PrefetchMdl;
v19 = p_Mdl + 1;
v20 = (((LODWORD(p_Mdl->StartVa) + p_Mdl->ByteOffset) & 0xFFF) + (unsigned __int64)p_Mdl->ByteCount + 4095) >> 12;
Next = (__int64)p_Mdl[1].Next;
v22 = (unsigned __int64)(&p_Mdl->ByteCount + 2 * v20);
v2 = 0;
v23 = PfnDb[Next].PteLong | 0x8000000000000000ui64;
v24 = MmGetPfnDb();
if( (unsigned __int64)v4 >= v23
&& (v25 = (__int64)((__int64)v4 - v23) >> 3, v25 < v20)
&& (v26 = &v24[*((_QWORD *)&v19->Next + v25)], v4 == (_QWORD *)(v26->PteLong | 0x8000000000000000ui64)) )
{
LABEL_19:
LODWORD(v27) = MI_READ_PTE_LOCK_FREE((INT64)v4);
LODWORD(v28.Long) = MiUpdateTransitionPteFrame(v27, v16);
v29.Long = v28.Long;
v30.Long = v28.Long;
LOBYTE(v31) = MiPteInShadowRange((UINT64)v4);
if( v31 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v29.Long & 1) != 0 )
v30.Long |= 0x8000000000000000ui64;
*v4 = v30.Long;
InPageSupport->PteContents.u = (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;})v29.Long;
v32 = MmGetPfnDb();
v2 = 1;
v32[v17].OriginalPte.u.Long ^= (*((_DWORD *)&v32[v17].3 + 4) ^ *((_DWORD *)&v26->3 + 4)) & 0x3E0;
}
else
{
while( (unsigned __int64)v19 <= v22 )
{
v26 = &v24[(__int64)v19->Next];
if( (_QWORD *)(v26->PteLong | 0x8000000000000000ui64) == v4 )
goto LABEL_19;
v19 = (_MDL *)((char *)v19 + 8);
}
v26 = &v24[v16];
InitialInPageSupport->InjectRetry = 1;
}
MiReleaseInPageRefs(v26);
PfnDb = MmGetPfnDb();
}
else
{
v4 = 0i64;
InitialInPageSupport = InPageSupport;
}
v6 = InitialInPageSupport->ListHead[0].Flink;
while( v6 != InitialInPageSupport->ListHead )
{
v7 = v6[19].Flink;
v8 = v6;
v6 = v6->Flink;
v9 = &PfnDb[(_QWORD)v7];
if( (InPageSupport->u1.e1._bf_0 & 0x10) == 0 || (_QWORD *)(v9->PteLong | 0x8000000000000000ui64) == v4 )
{
MiReleaseInPageRefs(v9);
v10 = v8->Flink;
if( v8->Flink->Blink != v8 )
goto LABEL_29;
v11 = v8->Blink;
if( v11->Flink != v8 )
goto LABEL_29;
v11->Flink = v10;
v10->Blink = v11;
v8->Blink = v8;
v8->Flink = v8;
PfnDb = MmGetPfnDb();
}
}
return v2;
}Referenced by:
MiDeleteTransitionPte
MiFinishHardFault
MiPurgeImageSection