PnpNotifyDeviceClassChange

__int64 __fastcall PnpNotifyDeviceClassChange(__int128 *a1, __int128 *a2, _UNICODE_STRING *a3){
  __int128 v3; 
  __int128 v4; 
  int SessionIdFromSymbolicName; 
  __int64 *v8; 
  __int64 v9; 
  void *v10; 
  _EJOB *CurrentServerSilo; 
  _ETHREAD *CurrentThread; 
  INT64 v13; 
  int v15; 
  int v16; 
  __int128 v17; 
  __int128 v18; 
  int v19; 
  _UNICODE_STRING *v20; 

  v3 = *a1;
  v19 = 0;
  v4 = *a2;
  v15 = 0;
  v17 = v3;
  SessionIdFromSymbolicName = -1;
  v18 = v4;
  v16 = 3145729;
  v20 = a3;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C452E0 + 192));
  v8 = (__int64 *)((char *)&PnpDeviceClassNotifyList
                 + 16 * ((*(_DWORD *)a2 + *((_DWORD *)a2 + 1) + *((_DWORD *)a2 + 2) + *((_DWORD *)a2 + 3)) % 0xDu));
  v9 = *v8;
  while( (__int64 *)v9 != v8 )
  {
    v10 = (void *)v9;
    CurrentServerSilo = PsGetCurrentServerSilo();
    if( *(_DWORD *)(v9 + 20) != PsGetServerSiloServiceSessionId((INT64)CurrentServerSilo) )
      SessionIdFromSymbolicName = IopGetSessionIdFromSymbolicName(a3);
    ++*(_WORD *)(v9 + 56);
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C452E0 + 192));
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquireResourceExclusiveLite(*(_QWORD *)(v9 + 72), 1, v13);
    if( (SessionIdFromSymbolicName == -1 || *(_DWORD *)(v9 + 20) == SessionIdFromSymbolicName)
      && !*(_BYTE *)(v9 + 58)
      && ((__int128 *)(v9 + 80) == a2 || RtlCompareMemory((const VOID *)(v9 + 80), a2, 16) == (_SIZE_T *)16) )
    {
      PnpNotifyDriverCallback(v9, (__int64)&v16, &v15);
    }
    ExReleaseResourceLite(*(PERESOURCE *)(v9 + 72));
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C452E0 + 192));
    v9 = *(_QWORD *)v9;
    PnpDereferenceNotify(v10);
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C452E0 + 192));
  return 0i64;
}

Referenced by:

PnpDeviceEventWorker