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