MiProcessLoaderEntry
_QWORD *__fastcall MiProcessLoaderEntry(__int64 *a1, int a2){
_ETHREAD *CurrentThread;
__int64 **v5;
bool v6;
_QWORD *v7;
ULONG_PTR v8;
ULONG_PTR v9;
_QWORD *v10;
__int64 v12;
__int64 *v13;
UINT8 OldIrql;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
OldIrql = 0;
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, 1u);
if( a2 != 1 )
{
if( (MiFlags & 0x80000) == 0 )
RtlRemoveInvertedFunctionTable((VOID *)a1[6]);
MmLockLoadedModuleListExclusive(&OldIrql);
v12 = *a1;
v13 = (__int64 *)a1[1];
if( *(__int64 **)(*a1 + 8) == a1 && (__int64 *)*v13 == a1 )
{
*v13 = v12;
*(_QWORD *)(v12 + 8) = v13;
RtlAvlRemoveNode(&qword_140C4CAA0, a1 + 29);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)PsLoadedModuleSpinLock);
__writecr8(OldIrql);
return MiReleaseResourceLite((__int64)CurrentThread);
}
LABEL_20:
__fastfail(3u);
}
MmLockLoadedModuleListExclusive(&OldIrql);
v5 = (__int64 **)*(&PsLoadedModuleList + 1);
if( *(PVOID **)*(&PsLoadedModuleList + 1) != &PsLoadedModuleList )
goto LABEL_20;
*a1 = (__int64)&PsLoadedModuleList;
v6 = 0;
a1[1] = (__int64)v5;
*v5 = a1;
v7 = (_QWORD *)qword_140C4CAA0;
*(&PsLoadedModuleList + 1) = a1;
v8 = a1[6];
if( qword_140C4CAA0 )
{
while( 1 )
{
v9 = *(v7 - 23);
if( v8 <= v9 + (unsigned int)(*((_DWORD *)v7 - 42) - 1) )
{
if( v8 >= v9 )
KeBugCheckEx(0x1Au, 0x2101ui64, v8, (ULONG_PTR)v7, 0i64);
v10 = (_QWORD *)*v7;
if( !*v7 )
{
v6 = 0;
break;
}
}
else
{
v10 = (_QWORD *)v7[1];
if( !v10 )
{
v6 = 1;
break;
}
}
v7 = v10;
}
}
RtlAvlInsertNodeEx(&qword_140C4CAA0, (__int64)v7, v6, a1 + 29);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)PsLoadedModuleSpinLock);
__writecr8(OldIrql);
if( (MiFlags & 0x80000) == 0 )
RtlInsertInvertedFunctionTable((PVOID)a1[6], *((unsigned int *)a1 + 16));
return MiReleaseResourceLite((__int64)CurrentThread);
}Referenced by:
MiConstructLoaderEntry
MiUnloadSystemImage