MiSessionRemoveImage
_RTL_BALANCED_NODE *__fastcall MiSessionRemoveImage(_KLDR_DATA_TABLE_ENTRY *BugCheckParameter2, INT64 a2){
void *DllBase;
_EPROCESS *Process;
_MM_SESSION_SPACE *Session;
_MMSUPPORT_INSTANCE *SessionVm;
_MMSUPPORT_SHARED *SharedVm;
UINT8 v9;
UINT8 v10;
_RTL_BALANCED_NODE *v11;
_RTL_BALANCED_NODE *v12;
_RTL_BALANCED_NODE *v15;
_RTL_BALANCED_NODE *v16;
unsigned __int64 i;
_RTL_BALANCED_NODE *v18;
unsigned __int64 v19;
unsigned __int64 v20;
unsigned __int64 k;
_QWORD *j;
unsigned __int64 v23;
UINT8 OldIrql;
DllBase = BugCheckParameter2->DllBase;
OldIrql = 0;
*(_OWORD *)a2 = 0i64;
*(_QWORD *)(a2 + 16) = 0i64;
Process = KeGetCurrentThread()->ApcState.Process;
Session = Process->Session;
SessionVm = MiGetSessionVm((INT64)BugCheckParameter2, a2, (INT16)Process);
SharedVm = MiGetSharedVm(SessionVm);
v9 = ExAcquireSpinLockExclusive((INT64 *)&SharedVm->WorkingSetLock);
SharedVm->GoodCitizenWaiting = 0;
v10 = v9;
MmLockLoadedModuleListExclusive(&OldIrql);
v11 = MiSessionLookupImage((UINT64)DllBase);
v12 = v11;
if( !v11 )
KeBugCheckEx(0x1Au, (PVOID)0x2100, BugCheckParameter2, DllBase, 0i64);
if( HIDWORD(v11[2].Right)-- == 1 )
{
v15 = v11->Children[0];
v16 = v11;
if( v11->Children[0] )
{
for( ; v15->Children[1]; v15 = v15->Children[1] )
;
}
else
{
for( i = v11->ParentValue; ; i = v15->ParentValue )
{
v15 = (_RTL_BALANCED_NODE *)(i & 0xFFFFFFFFFFFFFFFCui64);
if( !v15 || v15->Children[1] == v16 )
break;
v16 = v15;
}
}
if( v15 )
v18 = v15[2].Children[0];
else
v18 = 0i64;
v19 = (unsigned __int64)v12->Children[1];
v20 = (unsigned __int64)v12;
*(_QWORD *)a2 = v18;
if( v19 )
{
for( j = *(_QWORD **)v19; j; j = (_QWORD *)*j )
v19 = (unsigned __int64)j;
}
else
{
for( k = v12->ParentValue; ; k = *(_QWORD *)(v19 + 16) )
{
v19 = k & 0xFFFFFFFFFFFFFFFCui64;
if( !v19 || *(_QWORD *)v19 == v20 )
break;
v20 = v19;
}
}
if( v19 )
v23 = *(_QWORD *)(v19 + 40) & 0xFFFFFFFFFFFFFFFCui64;
else
v23 = 0i64;
*(_QWORD *)(a2 + 8) = v23;
RtlAvlRemoveNode((UINT64 *)Session + 11, (INT64 *)v12);
*(_QWORD *)(a2 + 16) = v12[3].Children[0];
}
else
{
v12 = 0i64;
}
ExReleaseSpinLockExclusiveFromDpcLevel(&PsLoadedModuleSpinLock);
__writecr8(OldIrql);
MiUnlockWorkingSetExclusive(SessionVm, v10);
if( v12 && v12[2]._bf_0 == 1 )
MiHandleDriverNonPagedSections(BugCheckParameter2, 0i64, 0i64);
return v12;
}Referenced by:
No references.