MiRememberUnloadedDriver
VOID __stdcall MiRememberUnloadedDriver(UNICODE_STRING *DriverName, PVOID Address, UINT64 a3){
__int64 v3;
_ETHREAD *CurrentThread;
char *v7;
__int64 v8;
_UNICODE_STRING *v9;
UINT8 *v10;
char *v11;
v3 = (unsigned int)a3;
if( DriverName->Length )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, 1u);
v7 = (char *)MmUnloadedDrivers;
if( MmUnloadedDrivers )
{
v8 = (unsigned int)MmLastUnloadedDriver;
if( (unsigned int)MmLastUnloadedDriver < 0x32 )
goto LABEL_4;
}
else
{
LODWORD(v11) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
MmUnloadedDrivers = v11;
v7 = v11;
if( !v11 )
{
LABEL_6:
MiReleaseResourceLite((__int64)CurrentThread);
return;
}
}
v8 = 0i64;
MmLastUnloadedDriver = 0;
LABEL_4:
v9 = (_UNICODE_STRING *)&v7[40 * v8];
RtlFreeAnsiString(v9);
LODWORD(v10) = MiAllocatePool((struct _SLIST_ENTRY *)0x40);
v9->Buffer = (wchar_t *)v10;
if( v10 )
{
memmove(v10, (UINT8 *)DriverName->Buffer, DriverName->Length);
v9->Length = DriverName->Length;
v9->MaximumLength = DriverName->MaximumLength;
v9[1].Buffer = (wchar_t *)((char *)Address + v3);
*(_QWORD *)&v9[1].Length = Address;
*(_QWORD *)&v9[2].Length = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
++MmLastUnloadedDriver;
}
else
{
*(_DWORD *)&v9->Length = 0;
}
goto LABEL_6;
}
}Referenced by:
MiUnloadSystemImage