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