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