PiDqActionDataGetChangedProperties
NTSTATUS __stdcall PiDqActionDataGetChangedProperties(
VOID *SecurityContext,
PNP_OBJECT_TYPE ObjectType,
WCHAR *ObjectName,
UINT8 GetInBestLocale,
WCHAR *PreferredLanguages,
_DEVPROPCOMPKEY *RequestedProperties,
UINT64 RequestedPropertyCount,
PI_PNPRTL_OBJECT_EVENT *ObjectEvent,
_DEVPROPERTY **Properties,
UINT64 *PropertyCount){
PI_PNPRTL_OBJECT_EVENT *v10;
int v11;
unsigned int v12;
__int64 v13;
VOID *v14;
PI_PNPRTL_OBJECT_EVENT *v15;
int v16;
_DEVPROPCOMPKEY *v17;
__int64 v18;
PI_PNPRTL_OBJECT_EVENT v19;
PNP_OBJECT_TYPE v20;
WCHAR *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;
UINT64 *v40;
UINT64 v41;
int v44;
VOID *Handle;
_DEVPROPERTY **v46;
WCHAR *ObjectNamea;
PI_PNPRTL_OBJECT_EVENT *v48;
WCHAR *v49;
HPNPOPCTX *hPnpOpCtx;
_SECURITY_SUBJECT_CONTEXT *SecurityContexta;
_DEVPROPERTY Property;
v10 = ObjectEvent;
v49 = PreferredLanguages;
SecurityContexta = (_SECURITY_SUBJECT_CONTEXT *)SecurityContext;
v11 = 0;
Handle = 0i64;
v12 = 0;
hPnpOpCtx = 0i64;
*(_DWORD *)PropertyCount = 0;
ObjectNamea = ObjectName;
v48 = ObjectEvent;
v46 = Properties;
memset(&Property, 0, sizeof(Property));
PiPnpRtlBeginOperation(&hPnpOpCtx);
v13 = 0i64;
v44 = 0;
if( !ObjectEvent[19] )
goto LABEL_34;
while( 1 )
{
v14 = 0i64;
v15 = &v10[8 * v13];
if( RequestedProperties )
{
v16 = 0;
if( !(_DWORD)RequestedPropertyCount )
goto LABEL_33;
while( 1 )
{
v17 = &RequestedProperties[v16];
if( v15[24] == v17->Key.pid )
{
v18 = *((_QWORD *)v15 + 10) - *(_QWORD *)&v17->Key.fmtid.Data1;
if( !v18 )
v18 = *((_QWORD *)v15 + 11) - *(_QWORD *)v17->Key.fmtid.Data4;
if( !v18 )
{
v19 = v15[25];
if( v19 == v17->Store && (!*((_QWORD *)v15 + 13) || GetInBestLocale) )
break;
}
}
if( ++v16 >= (unsigned int)RequestedPropertyCount )
goto LABEL_33;
}
}
else
{
v19 = v15[25];
}
if( !v19 )
break;
if( v19 != 1 )
{
v11 = -1073741811;
goto LABEL_34;
}
v20 = 0;
if( !Handle )
{
v11 = PiDqOpenObjectRegKey(
DEVPROP_STORE_USER,
ObjectNamea,
ObjectType,
1ui64,
0,
SecurityContexta,
&Handle,
v40,
v41);
if( v11 == -1073741772 )
{
Handle = (VOID *)-1i64;
v11 = 0;
}
}
v14 = Handle;
if( Handle != (VOID *)-1i64 )
goto LABEL_14;
LABEL_33:
v10 = v48;
v13 = (unsigned int)(v44 + 1);
v44 = v13;
if( (unsigned int)v13 >= v48[19] )
goto LABEL_34;
}
v20 = ObjectType;
LABEL_14:
if( v11 < 0 )
goto LABEL_34;
if( !GetInBestLocale )
{
v34 = *(unsigned int *)PropertyCount;
if( v12 <= (unsigned int)v34 )
{
if( (_DWORD)RequestedPropertyCount )
{
v12 = RequestedPropertyCount;
}
else
{
v39 = 5;
if( (unsigned int)v48[19] > 5 )
v39 = v48[19];
v12 += v39;
}
v11 = PiDqGrowPropertyArray((const VOID **)v46, v34, v12);
if( v11 < 0 )
goto LABEL_34;
}
v11 = PiDqPnPGetObjectProperty(
ObjectNamea,
v20,
v14,
(_DEVPROPKEY *)v15 + 4,
(_DEVPROPSTORE)v15[25],
*((WCHAR **)v15 + 13),
&(*v46)[*(unsigned int *)PropertyCount]);
if( v11 < 0 )
goto LABEL_34;
LABEL_32:
++*(_DWORD *)PropertyCount;
goto LABEL_33;
}
v11 = PiDqPnPGetObjectPropertyInBestLocale(
ObjectNamea,
v20,
v14,
(_DEVPROPKEY *)v15 + 4,
(_DEVPROPSTORE)v15[25],
v49,
&Property);
if( v11 >= 0 )
{
v21 = v49;
LocaleName = Property.CompKey.LocaleName;
while( 1 )
{
v23 = (const wchar_t *)((unsigned __int64)v21 & -(__int64)(*v21 != 0));
v24 = (const wchar_t *)*((_QWORD *)v15 + 13);
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 = (WCHAR *)&v23[v25 + 1];
}
v26 = *(_DWORD *)PropertyCount;
v27 = 0;
v28 = v46;
if( *(_DWORD *)PropertyCount )
{
v35 = *v46;
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((__int64)&Property, 0x58706E50u);
goto LABEL_33;
}
LABEL_27:
if( v12 > v26 )
goto LABEL_31;
if( (_DWORD)RequestedPropertyCount )
{
v12 = RequestedPropertyCount;
}
else
{
v38 = 5;
if( (unsigned int)v48[19] > 5 )
v38 = v48[19];
v12 += v38;
}
v11 = PiDqGrowPropertyArray((const VOID **)v46, v26, v12);
if( v11 >= 0 )
{
LABEL_31:
v29 = *(_OWORD *)&Property.CompKey.Key.pid;
v30 = *v28;
v31 = *(unsigned int *)PropertyCount;
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((__int64)&Property, 0x58706E50u);
}
LABEL_34:
if( (char *)Handle - 1 <= (char *)0xFFFFFFFFFFFFFFFDi64 )
ZwClose((_HANDLE)Handle);
if( hPnpOpCtx )
PiPnpRtlEndOperation(hPnpOpCtx);
return v11;
}Referenced by:
PiDqActionDataCreate