PiUEventNotifyTargetDeviceChange
INT64 __fastcall PiUEventNotifyTargetDeviceChange(INT64 a1){
_DWORD *v1;
char v2;
int v3;
unsigned int v4;
__int64 v6;
__int64 v7;
__int64 v8;
__int64 v9;
__int64 v10;
int v11;
__int64 v12;
WCHAR *v13;
__int64 *v14;
__int64 *v15;
char v16;
__int64 v17;
__int64 v19;
_DWORD *PoolWithTag;
char v21;
char v22;
v1 = 0i64;
v2 = 0;
v21 = 0;
v3 = 0;
v22 = 0;
v4 = 0;
v6 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_TARGET_DEVICE_QUERY_REMOVE.Data1;
if( !v6 )
v6 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_TARGET_DEVICE_QUERY_REMOVE.Data4;
if( !v6 )
goto LABEL_16;
v7 = *(_QWORD *)(a1 + 72) - *(_QWORD *)GUID_TARGET_DEVICE_REMOVE_CANCELLED;
if( !v7 )
v7 = *(_QWORD *)(a1 + 80) - *((_QWORD *)GUID_TARGET_DEVICE_REMOVE_CANCELLED + 1);
if( !v7 )
goto LABEL_16;
v8 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_DEVICE_REMOVE_PENDING.Data1;
if( !v8 )
v8 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_DEVICE_REMOVE_PENDING.Data4;
if( !v8 )
goto LABEL_16;
v9 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_TARGET_DEVICE_REMOVE_COMPLETE.Data1;
if( !v9 )
v9 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_TARGET_DEVICE_REMOVE_COMPLETE.Data4;
if( !v9 )
goto LABEL_16;
v10 = *(_QWORD *)(a1 + 72) - *(_QWORD *)&GUID_PNP_CUSTOM_NOTIFICATION.Data1;
if( !v10 )
v10 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_PNP_CUSTOM_NOTIFICATION.Data4;
if( !v10 )
{
LABEL_16:
v11 = *(_DWORD *)(a1 + 88) - 1;
if( v11 )
{
if( v11 != 2 )
return(unsigned int)v3;
v21 = 1;
v12 = 128i64;
}
else
{
v12 = 120i64;
}
v13 = (WCHAR *)(v12 + a1);
if( *(_BYTE *)(a1 + 68) )
{
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x1000ui64, 0x59706E50ui64);
v1 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
memset((INT64)PoolWithTag, 0i64);
v4 = 1;
}
ExAcquireFastMutex(&PiUEventClientRegistrationListLock);
v14 = &PiUEventDevHandleClientList[2 * (unsigned int)PiUEventHashStringIntoBucket(v13)];
v15 = (__int64 *)*v14;
if( (__int64 *)*v14 != v14 )
{
v16 = v21;
do
{
v17 = (__int64)v15;
v15 = (__int64 *)*v15;
if( !v16 || !*(_BYTE *)(v17 + 40) )
{
if( wcsicmp(v13, *(const wchar_t **)(*(_QWORD *)(v17 + 24) + 16i64))
|| !PiUEventApplyAdditionalFilters(a1, v17)
|| (v3 = PiUEventNotifyClient(a1, v17), v3 < 0) )
{
v16 = v21;
}
else
{
v16 = v21;
if( v1 )
{
if( v4 >= 0x400 )
{
v2 = 1;
v22 = 1;
continue;
}
v19 = v4++;
v1[v19] = *(_DWORD *)(v17 + 48);
}
}
}
v2 = v22;
}
while( v15 != v14 );
}
if( v1 && v4 > 1 )
{
if( v2 )
{
memset((INT64)(v1 + 1), 0i64);
*v1 = -1;
}
else
{
*v1 = v4 - 1;
}
ZwUpdateWnfStateData();
}
KeReleaseGuardedMutex(&PiUEventClientRegistrationListLock);
if( v1 )
ExFreePoolWithTag(v1, 0x59706E50u);
}
return(unsigned int)v3;
}Referenced by:
No references.