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;
const WCHAR *v13;
unsigned int v14;
_QWORD **v15;
_QWORD *v16;
char v17;
__int64 v18;
__int64 v20;
VOID **PoolWithTag;
UINT64 v22;
UINT64 MatchingChangeStamp;
UINT64 CheckStamp;
char v25;
char v26;
v1 = 0i64;
v2 = 0;
v25 = 0;
v3 = 0;
v26 = 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.Data1;
if( !v7 )
v7 = *(_QWORD *)(a1 + 80) - *(_QWORD *)GUID_TARGET_DEVICE_REMOVE_CANCELLED.Data4;
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;
v25 = 1;
v12 = 128i64;
}
else
{
v12 = 120i64;
}
v13 = (const WCHAR *)(v12 + a1);
if( *(_BYTE *)(a1 + 68) )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x1000ui64, 1500540496i64);
v1 = PoolWithTag;
if( !PoolWithTag )
return(unsigned int)-1073741670;
memset(PoolWithTag, 0i64, 0x1000u);
v4 = 1;
}
ExAcquireFastMutex((PFAST_MUTEX)((char *)&PnpReplaceEvent + 7040));
PiUEventHashStringIntoBucket(v13);
v15 = (_QWORD **)((char *)&PnpReplaceEvent + 16 * v14 + 7328);
v16 = *v15;
if( *v15 != v15 )
{
v17 = v25;
do
{
v18 = (__int64)v16;
v16 = (_QWORD *)*v16;
if( !v17 || !*(_BYTE *)(v18 + 40) )
{
if( wcsicmp(v13, *(const wchar_t **)(*(_QWORD *)(v18 + 24) + 16i64))
|| !PiUEventApplyAdditionalFilters(a1, v18)
|| (v3 = PiUEventNotifyClient(a1, v18), v3 < 0) )
{
v17 = v25;
}
else
{
v17 = v25;
if( v1 )
{
if( v4 >= 0x400 )
{
v2 = 1;
v26 = 1;
continue;
}
v20 = v4++;
v1[v20] = *(_DWORD *)(v18 + 48);
}
}
}
v2 = v26;
}
while( v16 != v15 );
}
if( v1 && v4 > 1 )
{
if( v2 )
{
memset(v1 + 1, 0i64, 0xFFCu);
*v1 = -1;
v22 = 4i64;
}
else
{
v22 = 4096i64;
*v1 = v4 - 1;
}
LODWORD(CheckStamp) = 0;
LODWORD(MatchingChangeStamp) = 0;
ZwUpdateWnfStateData(&WNF_PNPB_AWAITING_RESPONSE, v1, v22, 0i64, 0i64, MatchingChangeStamp, CheckStamp);
}
KeReleaseGuardedMutex((PKGUARDED_MUTEX)((char *)&PnpReplaceEvent + 7040));
if( v1 )
ExFreePoolWithTag(v1, 0x59706E50u);
}
return(unsigned int)v3;
}Referenced by:
No references.