PnpNotifyHwProfileChange

__int64 __fastcall PnpNotifyHwProfileChange(VOID *Source1, _DWORD *a2, _UNICODE_STRING *a3){
  int v4; 
  PVOID *v7; 
  PVOID *v8; 
  _ETHREAD *CurrentThread; 
  INT64 v10; 
  __int128 v11; 
  int v12; 
  PVOID *v13; 
  PVOID *v14; 
  _ETHREAD *v15; 
  INT64 v16; 
  int v18; 
  _BYTE v19[20]; 

  v18 = 0;
  memset(v19, 0, sizeof(v19));
  v4 = 0;
  ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C452E0 + 64));
  v7 = (PVOID *)PnpProfileNotifyList;
  while( v7 != &PnpProfileNotifyList )
  {
    ++*((_WORD *)v7 + 28);
    v8 = v7;
    KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C452E0 + 64));
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquireResourceExclusiveLite((UINT64)v7[9], 1, v10);
    if( *((_BYTE *)v7 + 58) )
    {
      ExReleaseResourceLite((PERESOURCE)v7[9]);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      v4 = v18;
    }
    else
    {
      v11 = *(_OWORD *)Source1;
      *(_DWORD *)v19 = 1310721;
      *(_OWORD *)&v19[4] = v11;
      v12 = PnpNotifyDriverCallback((__int64)v7, (__int64)v19, &v18);
      ExReleaseResourceLite((PERESOURCE)v7[9]);
      KeLeaveCriticalRegionThread(KeGetCurrentThread());
      v4 = v18;
      if( v12 < 0 )
        v4 = 0;
      v18 = v4;
      if( v4 < 0
        && (Source1 == &GUID_HWPROFILE_QUERY_CHANGE
         || RtlCompareMemory(Source1, &GUID_HWPROFILE_QUERY_CHANGE, 16) == (_SIZE_T *)16) )
      {
        if( a2 )
          *a2 = 7;
        if( a3 )
        {
          a3->Length = 0;
          RtlCopyUnicodeString(a3, (PCUNICODE_STRING)((char *)v7[6] + 56));
        }
        *(_WORD *)&v19[2] = 16;
        v13 = v7;
        *(GUID *)&v19[4] = GUID_HWPROFILE_CHANGE_CANCELLED;
        ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C452E0 + 64));
        do
        {
          ++*((_WORD *)v7 + 28);
          v14 = v7;
          KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C452E0 + 64));
          v15 = (_ETHREAD *)KeGetCurrentThread();
          --v15->Tcb.KernelApcDisable;
          ExAcquireResourceExclusiveLite((UINT64)v7[9], 1, v16);
          if( !*((_BYTE *)v7 + 58) )
            PnpNotifyDriverCallback((__int64)v7, (__int64)v19, 0i64);
          ExReleaseResourceLite((PERESOURCE)v7[9]);
          KeLeaveCriticalRegionThread(KeGetCurrentThread());
          ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C452E0 + 64));
          v7 = (PVOID *)v7[1];
          PnpDereferenceNotify(v14);
          if( v14 == v13 )
            PnpDereferenceNotify(v14);
        }
        while( v7 != &PnpProfileNotifyList );
        v4 = v18;
        break;
      }
    }
    ExAcquireFastMutex((PFAST_MUTEX)((char *)&stru_140C452E0 + 64));
    v7 = (PVOID *)*v7;
    PnpDereferenceNotify(v8);
  }
  KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&stru_140C452E0 + 64));
  return(unsigned int)v4;
}

Referenced by:

PnpDeviceEventWorker
PnpRequestHwProfileChangeNotification