PiDqActionDataGetChangedProperties
INT64 __fastcall PiDqActionDataGetChangedProperties(
VOID *a1,
UINT64 a2,
INT64 a3,
CHAR a4,
INT64 a5,
INT64 a6,
UINT64 MaxPropertyCount,
INT64 a8,
INT64 a9,
INT64 a10){
INT64 v10;
int v11;
unsigned int v12;
__int64 v13;
char *v14;
__int64 v15;
unsigned int v16;
INT64 v17;
__int64 v18;
int v19;
unsigned int v20;
NTSTRSAFE_PCWSTR v21;
const wchar_t *LocaleName;
const wchar_t *v23;
const wchar_t *v24;
__int64 v25;
unsigned int v26;
unsigned int v27;
_DEVPROPERTY **v28;
__int128 v29;
_DEVPROPERTY *v30;
__int64 v31;
__int128 v32;
UINT64 v34;
_DEVPROPERTY *v35;
__int64 v36;
__int64 v37;
int v38;
int v39;
INT64 v40;
unsigned int v42;
int v43;
HANDLE Handle;
_DEVPROPERTY **Properties;
INT64 v46;
INT64 v47;
NTSTRSAFE_PCWSTR v48;
PVOID P;
VOID *v50;
DEVPROPERTY Property;
v10 = a8;
v48 = (NTSTRSAFE_PCWSTR)a5;
v50 = a1;
v11 = 0;
Handle = 0i64;
v12 = 0;
P = 0i64;
*(_DWORD *)a10 = 0;
v46 = a3;
v42 = a2;
v47 = a8;
Properties = (_DEVPROPERTY **)a9;
memset(&Property, 0, sizeof(Property));
PiPnpRtlBeginOperation((__int64 **)&P);
v13 = 0i64;
v43 = 0;
if( !*(_DWORD *)(a8 + 76) )
goto LABEL_34;
while( 1 )
{
v14 = 0i64;
v15 = 32 * v13 + v10;
if( a6 )
{
v16 = 0;
if( !(_DWORD)MaxPropertyCount )
goto LABEL_33;
while( 1 )
{
v17 = a6 + 32i64 * v16;
if( *(_DWORD *)(v15 + 96) == *(_DWORD *)(v17 + 16) )
{
v18 = *(_QWORD *)(v15 + 80) - *(_QWORD *)v17;
if( !v18 )
v18 = *(_QWORD *)(v15 + 88) - *(_QWORD *)(v17 + 8);
if( !v18 )
{
v19 = *(_DWORD *)(v15 + 100);
if( v19 == *(_DWORD *)(v17 + 20) && (!*(_QWORD *)(v15 + 104) || a4) )
break;
}
}
if( ++v16 >= (unsigned int)MaxPropertyCount )
goto LABEL_33;
}
}
else
{
v19 = *(_DWORD *)(v15 + 100);
}
if( !v19 )
break;
if( v19 != 1 )
{
v11 = -1073741811;
goto LABEL_34;
}
v20 = 0;
if( !Handle )
{
v11 = PiDqOpenObjectRegKey(1, v46, v42, 1, 0, (__int64)v50, (__int64)&Handle);
if( v11 == -1073741772 )
{
Handle = (HANDLE)-1i64;
v11 = 0;
}
}
v14 = (char *)Handle;
if( Handle != (HANDLE)-1i64 )
goto LABEL_14;
LABEL_33:
v10 = v47;
v13 = (unsigned int)(v43 + 1);
v43 = v13;
if( (unsigned int)v13 >= *(_DWORD *)(v47 + 76) )
goto LABEL_34;
}
v20 = v42;
LABEL_14:
if( v11 < 0 )
goto LABEL_34;
if( !a4 )
{
v34 = *(unsigned int *)a10;
if( v12 <= (unsigned int)v34 )
{
if( (_DWORD)MaxPropertyCount )
{
v12 = MaxPropertyCount;
}
else
{
v39 = 5;
if( *(_DWORD *)(v47 + 76) > 5u )
v39 = *(_DWORD *)(v47 + 76);
v12 += v39;
}
v11 = PiDqGrowPropertyArray((const _DEVPROPERTY **)Properties, v34, v12);
if( v11 < 0 )
goto LABEL_34;
}
v11 = PiDqPnPGetObjectProperty(
v46,
v20,
v14,
v15 + 80,
*(_DWORD *)(v15 + 100),
*(NTSTRSAFE_PCWSTR *)(v15 + 104),
(__int64)&(*Properties)[*(unsigned int *)a10]);
if( v11 < 0 )
goto LABEL_34;
LABEL_32:
++*(_DWORD *)a10;
goto LABEL_33;
}
LODWORD(v40) = *(_DWORD *)(v15 + 100);
v11 = PiDqPnPGetObjectPropertyInBestLocale(v46, v20, v14, v15 + 80, v40, (WCHAR *)v48, &Property);
if( v11 >= 0 )
{
v21 = v48;
LocaleName = Property.CompKey.LocaleName;
while( 1 )
{
v23 = (const wchar_t *)((unsigned __int64)v21 & -(__int64)(*v21 != 0));
v24 = *(const wchar_t **)(v15 + 104);
if( v24 == v23 || v24 && v23 && !wcsicmp(v24, v23) )
break;
if( LocaleName == v23 || LocaleName && (!v23 || !wcsicmp(LocaleName, v23)) || !v23 )
goto LABEL_59;
v25 = -1i64;
do
++v25;
while( v23[v25] );
v21 = &v23[v25 + 1];
}
v26 = *(_DWORD *)a10;
v27 = 0;
v28 = Properties;
if( *(_DWORD *)a10 )
{
v35 = *Properties;
while( 1 )
{
v36 = v27;
if( Property.CompKey.Key.pid == v35[v36].CompKey.Key.pid )
{
v37 = *(_QWORD *)&Property.CompKey.Key.fmtid.Data1 - *(_QWORD *)&v35[v36].CompKey.Key.fmtid.Data1;
if( *(_QWORD *)&Property.CompKey.Key.fmtid.Data1 == *(_QWORD *)&v35[v36].CompKey.Key.fmtid.Data1 )
v37 = *(_QWORD *)Property.CompKey.Key.fmtid.Data4 - *(_QWORD *)v35[v36].CompKey.Key.fmtid.Data4;
if( !v37 && Property.CompKey.Store == v35[v36].CompKey.Store )
break;
}
if( ++v27 >= v26 )
goto LABEL_27;
}
LABEL_59:
PnpFreeDevProperty(&Property, 0x58706E50ui64);
goto LABEL_33;
}
LABEL_27:
if( v12 > v26 )
goto LABEL_31;
if( (_DWORD)MaxPropertyCount )
{
v12 = MaxPropertyCount;
}
else
{
v38 = 5;
if( *(_DWORD *)(v47 + 76) > 5u )
v38 = *(_DWORD *)(v47 + 76);
v12 += v38;
}
v11 = PiDqGrowPropertyArray((const _DEVPROPERTY **)Properties, v26, v12);
if( v11 >= 0 )
{
LABEL_31:
v29 = *(_OWORD *)&Property.CompKey.Key.pid;
v30 = *v28;
v31 = *(unsigned int *)a10;
v30[v31].CompKey.Key.fmtid = Property.CompKey.Key.fmtid;
v32 = *(_OWORD *)&Property.Type;
*(_OWORD *)&v30[v31].CompKey.Key.pid = v29;
*(_OWORD *)&v30[v31].Type = v32;
goto LABEL_32;
}
PnpFreeDevProperty(&Property, 0x58706E50ui64);
}
LABEL_34:
if( (char *)Handle - 1 <= (char *)0xFFFFFFFFFFFFFFFDi64 )
ZwClose(Handle);
if( P )
PiPnpRtlEndOperation(P);
return(unsigned int)v11;
}Referenced by:
PiDqActionDataCreate