PnpDeviceRaisePropertyChangeEventWorker
char __fastcall PnpDeviceRaisePropertyChangeEventWorker(
HPNPCTX *hPnpCtx,
INT64 a2,
INT64 a3,
__int64 a4,
__int64 a5,
__int64 a6){
int v10;
char v11;
INT64 v12;
__int64 *v13;
__int64 v14;
__int64 v15;
__int64 v16;
DEVPROPKEY ***v17;
unsigned int v18;
unsigned int v19;
__int64 v20;
DEVPROPKEY *v21;
char v22;
const WCHAR *v23;
int v24;
DEVPROPKEY ***v25;
unsigned int v26;
__int64 v27;
DEVPROPKEY *v28;
NTSTATUS MatchingFilteredDeviceInterfaceList;
__int64 v30;
__int64 v31;
__int64 v32;
NTSTATUS ObjectProperty;
UINT64 v34;
__int64 *v35;
__int64 v36;
__int64 v37;
__int64 v38;
__int64 v39;
__int64 v40;
__int64 v41;
UINT64 **p_RequiredLength;
WCHAR *v44;
UINT64 v45;
UINT64 *RequiredLength;
_BYTE v47[24];
INT64 v48;
INT64 v49;
INT64 v50;
HPNPCTX v51[4];
__int128 v52;
_GUID Source2;
WCHAR GuidString[40];
v49 = a2;
v50 = a3;
LODWORD(v48) = 0;
LODWORD(RequiredLength) = 0;
*(_OWORD *)&v47[8] = 0i64;
Source2 = 0i64;
*(_OWORD *)v51 = 0i64;
v52 = 0i64;
if( a4 )
goto LABEL_4;
v10 = *(_DWORD *)(a5 + 16);
if( v10 == 6 )
{
v40 = *(_QWORD *)a5 - *(_QWORD *)&DEVPKEY_Device_SessionId.fmtid.Data1;
if( *(_QWORD *)a5 == *(_QWORD *)&DEVPKEY_Device_SessionId.fmtid.Data1 )
v40 = *(_QWORD *)(a5 + 8) - *(_QWORD *)DEVPKEY_Device_SessionId.fmtid.Data4;
if( !v40 )
goto LABEL_69;
}
if( v10 != 100 )
goto LABEL_4;
v41 = *(_QWORD *)a5 - DEVPKEY_Device_RestrictedSD;
if( *(_QWORD *)a5 == DEVPKEY_Device_RestrictedSD )
v41 = *(_QWORD *)(a5 + 8) - 0x57C1C6A499921E96i64;
if( v41 )
{
LABEL_4:
v11 = 0;
}
else
{
LABEL_69:
*(_QWORD *)v47 = 0i64;
v11 = 1;
((void(__fastcall *)(HPNPCTX *, INT64, __int64))a6)(hPnpCtx, a2, 1i64);
}
*(_QWORD *)v47 = a3;
*(_QWORD *)&v47[8] = a4;
*(_QWORD *)&v47[16] = a5;
((void(__fastcall *)(HPNPCTX *, INT64, __int64))a6)(hPnpCtx, a2, 1i64);
v12 = v49;
v13 = &qword_140001D98;
v14 = 12i64;
do
{
v15 = 0i64;
if( *(_DWORD *)v13 )
{
while( 1 )
{
v16 = *(_QWORD *)(*(v13 - 1) + 8 * v15);
if( *(_DWORD *)(a5 + 16) == *(_DWORD *)(v16 + 16) )
{
v30 = *(_QWORD *)a5 - *(_QWORD *)v16;
if( *(_QWORD *)a5 == *(_QWORD *)v16 )
v30 = *(_QWORD *)(a5 + 8) - *(_QWORD *)(v16 + 8);
if( !v30 )
break;
}
v15 = (unsigned int)(v15 + 1);
if( (unsigned int)v15 >= *(_DWORD *)v13 )
goto LABEL_9;
}
*(_QWORD *)&v47[16] = v13[1];
((void(__fastcall *)(HPNPCTX *, INT64, __int64, __int64, _BYTE *))a6)(hPnpCtx, v12, 1i64, 4i64, v47);
}
LABEL_9:
v13 += 3;
--v14;
}
while( v14 );
v17 = &off_140001D30;
v18 = 0;
while( 1 )
{
v19 = *((_DWORD *)v17 + 2);
v20 = 0i64;
if( v19 )
break;
LABEL_14:
++v18;
v17 += 3;
if( v18 >= 3 )
{
v22 = 0;
goto LABEL_16;
}
}
while( 1 )
{
v21 = (*v17)[v20];
if( *(_DWORD *)(a5 + 16) == v21->pid )
{
v31 = *(_QWORD *)a5 - *(_QWORD *)&v21->fmtid.Data1;
if( *(_QWORD *)a5 == *(_QWORD *)&v21->fmtid.Data1 )
v31 = *(_QWORD *)(a5 + 8) - *(_QWORD *)v21->fmtid.Data4;
if( !v31 )
break;
}
v20 = (unsigned int)(v20 + 1);
if( (unsigned int)v20 >= v19 )
goto LABEL_14;
}
v22 = 1;
LABEL_16:
if( v11 || v22 )
{
LODWORD(v44) = 0;
p_RequiredLength = &RequiredLength;
v23 = (const WCHAR *)v49;
ObjectProperty = PnpGetObjectProperty(
(ULONG)hPnpCtx,
v49,
1i64,
v50,
0i64,
(INT64)&DEVPKEY_Device_ContainerId,
(INT64)&v48,
(INT64)&Source2);
if( ObjectProperty == -1073741275 || ObjectProperty == -1073741772 )
goto LABEL_19;
if( ObjectProperty < 0 )
goto LABEL_70;
if( RtlCompareMemory(qword_14000A920, &Source2, 16) == (_SIZE_T *)16 )
goto LABEL_19;
if( PnpStringFromGuid(&Source2, GuidString, v34) < 0 )
{
LABEL_70:
*(_QWORD *)v47 = 0i64;
((void(__fastcall *)(HPNPCTX *, _QWORD, __int64, __int64, _BYTE *))a6)(hPnpCtx, 0i64, 5i64, 1i64, v47);
goto LABEL_19;
}
if( v11 )
{
*(_QWORD *)v47 = 0i64;
((void(__fastcall *)(HPNPCTX *, WCHAR *, __int64, __int64, _BYTE *))a6)(hPnpCtx, GuidString, 5i64, 5i64, v47);
}
if( v22 )
{
v35 = &qword_140001D38;
*(_OWORD *)v47 = 0i64;
v36 = 3i64;
do
{
v37 = 0i64;
if( *(_DWORD *)v35 )
{
while( 1 )
{
v38 = *(_QWORD *)(*(v35 - 1) + 8 * v37);
if( *(_DWORD *)(a5 + 16) == *(_DWORD *)(v38 + 16) )
{
v39 = *(_QWORD *)a5 - *(_QWORD *)v38;
if( *(_QWORD *)a5 == *(_QWORD *)v38 )
v39 = *(_QWORD *)(a5 + 8) - *(_QWORD *)(v38 + 8);
if( !v39 )
break;
}
v37 = (unsigned int)(v37 + 1);
if( (unsigned int)v37 >= *(_DWORD *)v35 )
goto LABEL_52;
}
*(_QWORD *)&v47[16] = v35[1];
((void(__fastcall *)(HPNPCTX *, WCHAR *, __int64, __int64, _BYTE *))a6)(hPnpCtx, GuidString, 5i64, 4i64, v47);
}
LABEL_52:
v35 += 3;
--v36;
}
while( v36 );
}
}
else
{
v23 = (const WCHAR *)v49;
}
LABEL_19:
v24 = 0;
v25 = &off_140001D78;
while( 1 )
{
v26 = *((_DWORD *)v25 + 2);
v27 = 0i64;
if( v26 )
break;
LABEL_23:
++v24;
v25 += 3;
if( v24 )
{
LOBYTE(MatchingFilteredDeviceInterfaceList) = 0;
goto LABEL_25;
}
}
while( 1 )
{
v28 = (*v25)[v27];
if( *(_DWORD *)(a5 + 16) == v28->pid )
{
v32 = *(_QWORD *)a5 - *(_QWORD *)&v28->fmtid.Data1;
if( *(_QWORD *)a5 == *(_QWORD *)&v28->fmtid.Data1 )
v32 = *(_QWORD *)(a5 + 8) - *(_QWORD *)v28->fmtid.Data4;
if( !v32 )
break;
}
v27 = (unsigned int)(v27 + 1);
if( (unsigned int)v27 >= v26 )
goto LABEL_23;
}
LOBYTE(MatchingFilteredDeviceInterfaceList) = 1;
LABEL_25:
if( v11 || (_BYTE)MatchingFilteredDeviceInterfaceList )
{
*(_QWORD *)v51 = a6;
BYTE12(v52) = v11;
if( (_BYTE)MatchingFilteredDeviceInterfaceList )
{
*(_QWORD *)&v51[2] = a5;
*(_QWORD *)&v52 = &off_140001D78;
DWORD2(v52) = 1;
}
LODWORD(p_RequiredLength) = 0;
MatchingFilteredDeviceInterfaceList = CmGetMatchingFilteredDeviceInterfaceList(
hPnpCtx,
0i64,
v23,
0i64,
(UINT8 *)PnpUpdateInterfacesCallback,
v51,
0i64,
CM_OBJECT_TYPE_NONE,
&RequiredLength,
p_RequiredLength,
v44,
v45,
RequiredLength,
*(UINT64 *)v47);
if( MatchingFilteredDeviceInterfaceList < 0 )
{
*(_QWORD *)v47 = 0i64;
LOBYTE(MatchingFilteredDeviceInterfaceList) = ((__int64(__fastcall *)(HPNPCTX *, _QWORD, __int64, __int64, _BYTE *))a6)(
hPnpCtx,
0i64,
3i64,
1i64,
v47);
}
}
return MatchingFilteredDeviceInterfaceList;
}Referenced by:
PnpObjectRaisePropertyChangeEvent