MiSessionRemoveImage
RTL_BALANCED_NODE *__fastcall MiSessionRemoveImage(UINT64 P2, INT64 a2){
UINT64 v2;
__int64 v5;
__int64 SessionVm;
INT64 *SharedVm;
KIRQL v8;
UINT8 v9;
RTL_BALANCED_NODE *v10;
RTL_BALANCED_NODE *v11;
RTL_BALANCED_NODE *v14;
RTL_BALANCED_NODE *v15;
unsigned __int64 i;
_RTL_BALANCED_NODE *v17;
unsigned __int64 v18;
unsigned __int64 v19;
unsigned __int64 k;
_QWORD *j;
unsigned __int64 v22;
UINT8 OldIrql;
v2 = *(_QWORD *)(P2 + 48);
OldIrql = 0;
*(_OWORD *)a2 = 0i64;
*(_QWORD *)(a2 + 16) = 0i64;
v5 = *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1368i64);
SessionVm = MiGetSessionVm();
SharedVm = MiGetSharedVm(SessionVm);
v8 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)SharedVm);
*((_DWORD *)SharedVm + 1) = 0;
v9 = v8;
MmLockLoadedModuleListExclusive(&OldIrql);
v10 = MiSessionLookupImage(v2);
v11 = v10;
if( !v10 )
KeBugCheckEx(0x1Au, 0x2100ui64, P2, v2, 0i64);
if( HIDWORD(v10[2].Right)-- == 1 )
{
v14 = v10->Children[0];
v15 = v10;
if( v10->Children[0] )
{
for( ; v14->Children[1]; v14 = v14->Children[1] )
;
}
else
{
for( i = v10->ParentValue; ; i = v14->ParentValue )
{
v14 = (RTL_BALANCED_NODE *)(i & 0xFFFFFFFFFFFFFFFCui64);
if( !v14 || v14->Children[1] == v15 )
break;
v15 = v14;
}
}
if( v14 )
v17 = v14[2].Children[0];
else
v17 = 0i64;
v18 = (unsigned __int64)v11->Children[1];
v19 = (unsigned __int64)v11;
*(_QWORD *)a2 = v17;
if( v18 )
{
for( j = *(_QWORD **)v18; j; j = (_QWORD *)*j )
v18 = (unsigned __int64)j;
}
else
{
for( k = v11->ParentValue; ; k = *(_QWORD *)(v18 + 16) )
{
v18 = k & 0xFFFFFFFFFFFFFFFCui64;
if( !v18 || *(_QWORD *)v18 == v19 )
break;
v19 = v18;
}
}
if( v18 )
v22 = *(_QWORD *)(v18 + 40) & 0xFFFFFFFFFFFFFFFCui64;
else
v22 = 0i64;
*(_QWORD *)(a2 + 8) = v22;
RtlAvlRemoveNode((unsigned __int64 *)(v5 + 88), (__int64 *)v11);
*(_QWORD *)(a2 + 16) = v11[3].Children[0];
}
else
{
v11 = 0i64;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)PsLoadedModuleSpinLock);
__writecr8(OldIrql);
MiUnlockWorkingSetExclusive(SessionVm, v9);
if( v11 && *(_BYTE *)&v11[2].0 == 1 )
MiHandleDriverNonPagedSections(P2, 0, 0);
return v11;
}Referenced by:
MiUnloadSystemImage