MiDeletePerSessionProtos
UINT64 __stdcall MiDeletePerSessionProtos(_MI_PER_SESSION_PROTOS *Protos){
__int64 *v1;
_MMPFN *v2;
UINT8 v3;
unsigned __int64 v4;
__int64 v6;
__int64 v7;
UINT64 v8;
UINT64 v9;
__int64 v10;
_MI_PARTITION *v11;
_MMPFN *v12;
INT64 v13;
UINT8 *v14;
INT64 v16;
__int128 a2[4];
UINT8 PageIrql;
unsigned __int64 v19;
v1 = (__int64 *)*((_QWORD *)Protos + 8);
v2 = 0i64;
v3 = 17;
v4 = *((_QWORD *)Protos + 9);
v6 = *v1;
v7 = v1[1];
v8 = *((unsigned int *)v1 + 11);
PageIrql = 17;
v9 = *(_WORD *)(v6 + 60) & 0x3FF;
v10 = *(_QWORD *)Protos + ((v7 - *(_QWORD *)(v6 + 136)) >> 3 << 12);
a2[0] = (unsigned __int64)v10;
v11 = *(_MI_PARTITION **)(qword_140C4E388 + 8 * v9);
v19 = v4 + 8 * v8;
if( v4 < v19 )
{
do
{
if( (v4 & 0xFFF) == 0 || v3 == 17 )
{
if( v3 != 17 )
{
LOBYTE(v9) = v3;
MiUnlockProtoPoolPage(v2, v9);
}
while( 1 )
{
v2 = MiLockProtoPoolPage((_MMPTE *)v4, &PageIrql);
if( v2 )
break;
MmAccessFault(2ui64, (PVOID)v4, 0, 0i64);
}
v3 = PageIrql;
}
v12 = MiLockLeafPage((_MMPTE *)v4, 0i64);
v13 = MI_READ_PTE_LOCK_FREE(v4);
v9 = v13;
if( v12 )
{
if( (MiFlags & 0x10000) != 0 && (MiFlags & 0x8000) != 0 && ((*((_QWORD *)v12 + 5) >> 60) & 7) == 3 )
{
MiRemoveLockedPageChargeAndDecRef(v12);
KeSetPagePrivilege((v12 - MmGetPfnDb()) / 48, a2, 16);
MiClearPfnImageVerified((UINT64)v12, 4);
v10 = *(_QWORD *)&a2[0];
}
LOBYTE(v14) = 17;
if( (unsigned int)MiDeleteTransitionPte((_MMPTE *)v4, v12, v14, 1ui64) == 3 )
--v8;
}
else
{
if( !v13 )
break;
if( (v13 & 0x400) == 0 )
{
v16 = MiSwizzleInvalidPte(768i64);
if( v9 != v16 )
MiReleasePageFileSpace(v11, v9, 1i64);
}
}
v10 += 4096i64;
v4 += 8i64;
*(_QWORD *)&a2[0] = v10;
}
while( v4 < v19 );
if( v3 != 17 )
{
LOBYTE(v9) = v3;
MiUnlockProtoPoolPage(v2, v9);
}
}
MiReturnCommit(v11, v8);
MiUpdateSystemProtoPtesTree((RTL_BALANCED_NODE *)Protos + 1, 0i64);
ExFreePoolWithTag(*((PVOID *)Protos + 9), 0);
ExFreePoolWithTag(Protos, 0);
return v8;
}Referenced by:
MiDeleteSessionDriverProtos
MiFreeSubsectionProtos