PnpNotifyHwProfileChange

INT64 __stdcall PnpNotifyHwProfileChange(GUID *EventGuid, PNP_VETO_TYPE *VetoType, UNICODE_STRING *VetoName){
  int v4; 
  PVOID *v7; 
  PVOID *v8; 
  _ETHREAD *CurrentThread; 
  GUID v10; 
  int v11; 
  UNICODE_STRING *v12; 
  PVOID *v13; 
  PVOID *v14; 
  _ETHREAD *v15; 
  int v17; 
  _BYTE v18[20]; 
  v17 = 0;
  memset(v18, 0, sizeof(v18));
  v4 = 0;
  ExAcquireFastMutex(&PnpHwProfileNotifyLock);
  v7 = (PVOID *)PnpProfileNotifyList;
  while( v7 != &PnpProfileNotifyList )
  {
    ++*((_WORD *)v7 + 28);
    v8 = v7;
    KeReleaseGuardedMutex(&PnpHwProfileNotifyLock);
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquireResourceExclusiveLite((ERESOURCE *)v7[9], 1u);
    if( *((_BYTE *)v7 + 58) )
    {
      ExReleaseResourceLite((PERESOURCE)v7[9]);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      v4 = v17;
    }
    else
    {
      v10 = *EventGuid;
      *(_DWORD *)v18 = 1310721;
      *(GUID *)&v18[4] = v10;
      v11 = PnpNotifyDriverCallback((__int64)v7, (__int64)v18, &v17);
      ExReleaseResourceLite((PERESOURCE)v7[9]);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      v4 = v17;
      if( v11 < 0 )
        v4 = 0;
      v17 = v4;
      if( v4 < 0
        && (EventGuid == &GUID_HWPROFILE_QUERY_CHANGE
         || RtlCompareMemory(EventGuid, &GUID_HWPROFILE_QUERY_CHANGE, 0x10ui64) == 16) )
      {
        if( VetoType )
          *VetoType = PNP_VetoDriver;
        if( VetoName )
        {
          VetoName->Length = 0;
          RtlCopyUnicodeString(VetoName, (UNICODE_STRING *)((char *)v7[6] + 56), v12);
        }
        *(_WORD *)&v18[2] = 16;
        v13 = v7;
        *(GUID *)&v18[4] = GUID_HWPROFILE_CHANGE_CANCELLED;
        ExAcquireFastMutex(&PnpHwProfileNotifyLock);
        do
        {
          ++*((_WORD *)v7 + 28);
          v14 = v7;
          KeReleaseGuardedMutex(&PnpHwProfileNotifyLock);
          v15 = (_ETHREAD *)KeGetCurrentThread();
          --*((_WORD *)v15 + 242);
          ExAcquireResourceExclusiveLite((ERESOURCE *)v7[9], 1u);
          if( !*((_BYTE *)v7 + 58) )
            PnpNotifyDriverCallback((__int64)v7, (__int64)v18, 0i64);
          ExReleaseResourceLite((PERESOURCE)v7[9]);
          KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
          ExAcquireFastMutex(&PnpHwProfileNotifyLock);
          v7 = (PVOID *)v7[1];
          PnpDereferenceNotify(v14);
          if( v14 == v13 )
            PnpDereferenceNotify(v14);
        }
        while( v7 != &PnpProfileNotifyList );
        v4 = v17;
        break;
      }
    }
    ExAcquireFastMutex(&PnpHwProfileNotifyLock);
    v7 = (PVOID *)*v7;
    PnpDereferenceNotify(v8);
  }
  KeReleaseGuardedMutex(&PnpHwProfileNotifyLock);
  return(unsigned int)v4;
}

Referenced by:

PnpDeviceEventWorker
PnpRequestHwProfileChangeNotification