MiDeletePerSessionProtos
NTSTATUS __stdcall MiDeletePerSessionProtos(_MI_PER_SESSION_PROTOS *Protos){
_SUBSECTION *Subsection;
ULONG_PTR v2;
UINT8 v3;
unsigned __int64 SubsectionBase;
_CONTROL_AREA *ControlArea;
_MMPTE *v7;
UINT64 PtesInSubsection;
__int64 v9;
char *v10;
_MI_PARTITION *v11;
_MMPFN *v12;
_MMPFN *v13;
__int64 v14;
__int64 v16;
_MMPTE v17;
_STRING FullName;
UINT8 PageIrql;
unsigned __int64 v20;
Subsection = Protos->Subsection;
v2 = 0;
v3 = 17;
SubsectionBase = (unsigned __int64)Protos->SubsectionBase;
FullName.Buffer = 0i64;
ControlArea = Subsection->ControlArea;
v7 = Subsection->SubsectionBase;
PtesInSubsection = Subsection->PtesInSubsection;
PageIrql = 17;
v9 = ControlArea->u1.Flags._bf_0 & 0x3FF;
v10 = (char *)Protos->SessionProtoNode.Children[0] + 4096 * (((__int64)v7 - *(_QWORD *)ControlArea[1].gap8) >> 3);
*(_QWORD *)&FullName.Length = v10;
v11 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v9);
v20 = SubsectionBase + 8 * PtesInSubsection;
if( SubsectionBase < v20 )
{
do
{
if( (SubsectionBase & 0xFFF) == 0 || v3 == 17 )
{
if( v3 != 17 )
MiUnlockProtoPoolPage(v2, v3);
while( 1 )
{
v12 = MiLockProtoPoolPage((_MMPTE *)SubsectionBase, &PageIrql);
v2 = (unsigned int)v12;
if( v12 )
break;
MmAccessFault(2ui64, (PVOID)SubsectionBase, 0, 0i64);
}
v3 = PageIrql;
}
v13 = MiLockLeafPage((_MMPTE *)SubsectionBase, 0i64);
LODWORD(v14) = MI_READ_PTE_LOCK_FREE(SubsectionBase);
if( v13 )
{
if( (MiFlags & 0x10000) != 0 && (MiFlags & 0x8000) != 0 && (((unsigned __int64)v13->u4._bf_0 >> 60) & 7) == 3 )
{
MiRemoveLockedPageChargeAndDecRef(v13);
KeSetPagePrivilege((_PREFIX_TABLE *)(v13 - MmGetPfnDb()), &FullName, 16);
MiClearPfnImageVerified(v13, 4ui64);
v10 = *(char **)&FullName.Length;
}
if( MiDeleteTransitionPte((_MMPTE *)SubsectionBase, v13, 0x11u, 1ui64) == PageStillReferenced )
--PtesInSubsection;
}
else
{
if( !v14 )
break;
if( (v14 & 0x400) == 0 )
{
v16 = MiSwizzleInvalidPte(768i64);
if( v17.u.Long != v16 )
MiReleasePageFileSpace(v11, v17, 1ui64);
}
}
v10 += 4096;
SubsectionBase += 8i64;
*(_QWORD *)&FullName.Length = v10;
}
while( SubsectionBase < v20 );
if( v3 != 17 )
MiUnlockProtoPoolPage(v2, v3);
}
MiReturnCommit(v11, PtesInSubsection);
MiUpdateSystemProtoPtesTree(&Protos->ProtosNode.Node, 0i64);
ExFreePoolWithTag(Protos->SubsectionBase, 0);
ExFreePoolWithTag(Protos, 0);
return PtesInSubsection;
}Referenced by:
MiDeleteSessionDriverProtos
MiFreeSubsectionProtos