MiRememberUnloadedDriver

VOID __stdcall MiRememberUnloadedDriver(const VOID **DriverName, VOID *Address, UINT64 Length){
  __int64 v3; 
  _ETHREAD *CurrentThread; 
  char *v7; 
  __int64 v8; 
  _UNICODE_STRING *v9; 
  wchar_t *Pool; 

  v3 = (unsigned int)Length;
  if( *(_WORD *)DriverName )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquireResourceExclusiveLite((UINT64)&PsLoadedModuleResource, 1, Length);
    v7 = (char *)MmUnloadedDrivers;
    if( MmUnloadedDrivers )
    {
      v8 = (unsigned int)MmLastUnloadedDriver;
      if( (unsigned int)MmLastUnloadedDriver < 0x32 )
        goto LABEL_4;
    }
    else
    {
      MmUnloadedDrivers = MiAllocatePool(64i64, 0x7D0ui64, 0x54446D4Dui64);
      v7 = (char *)MmUnloadedDrivers;
      if( !MmUnloadedDrivers )
      {
LABEL_6:
        MiReleaseResourceLite(&CurrentThread->Tcb);
        return;
      }
    }
    v8 = 0i64;
    MmLastUnloadedDriver = 0;
LABEL_4:
    v9 = (_UNICODE_STRING *)&v7[40 * v8];
    RtlFreeAnsiString(v9);
    Pool = (wchar_t *)MiAllocatePool(64i64, *(unsigned __int16 *)DriverName, 0x54446D4Dui64);
    v9->Buffer = Pool;
    if( Pool )
    {
      memmove(Pool, DriverName[1], *(unsigned __int16 *)DriverName);
      v9->Length = *(_WORD *)DriverName;
      v9->MaximumLength = *((_WORD *)DriverName + 1);
      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:

No references.