PiDmObjectGetAggregatedBooleanPropertyData
NTSTATUS __stdcall PiDmObjectGetAggregatedBooleanPropertyData(
PNP_OBJECT_TYPE ObjectType,
WCHAR *ObjectName,
WCHAR *PropertyLocaleName,
_DEVPROPKEY *PropertyKey,
UINT64 *PropertyType,
UINT8 *PropertyBuffer,
UINT64 BufferSize,
UINT64 *PropertySize){
_PI_DM_OBJECT v8;
_BYTE *v11;
int v13;
int v14;
char *v15;
unsigned int v16;
__int64 v17;
UINT64 v19;
__int64 *v20;
UINT64 v21;
_ETHREAD *CurrentThread;
_PI_DM_OBJECT *v23;
_PI_DM_OBJECT *v24;
_PI_DM_OBJECT v25;
_QWORD **v26;
_QWORD *v27;
char *v28;
NTSTATUS ObjectProperty;
_PI_DM_OBJECT *Object;
_PI_DM_OBJECT *v31;
INT64 v32;
int v33;
int v34;
_DWORD *v35;
v34 = HIDWORD(PropertyLocaleName);
Object = 0i64;
v8 = 0;
v33 = 0;
v11 = (_BYTE *)BufferSize;
LOBYTE(v32) = 0;
v13 = -1073741802;
if( BufferSize )
{
v14 = (int)PropertySize;
v11 = (_BYTE *)(-(__int64)((_DWORD)PropertySize != 0) & BufferSize);
}
else
{
v14 = 0;
}
if( ObjectType < 7 && !PropertyKey )
{
v15 = byte_140001538;
v16 = 0;
while( 1 )
{
v17 = *((_QWORD *)v15 + 1);
if( *(_DWORD *)(v17 + 16) == *((_DWORD *)PropertyType + 4) )
{
v19 = *(_QWORD *)v17 - *PropertyType;
if( *(_QWORD *)v17 == *PropertyType )
v19 = *(_QWORD *)(v17 + 8) - PropertyType[1];
if( !v19 && ObjectType == *(_DWORD *)v15 )
break;
}
++v16;
v15 += 56;
if( v16 >= 3 )
return v13;
}
v20 = &PiDmAggregatedBooleanDefs[7 * v16];
if( v20 )
{
*(_DWORD *)PropertyBuffer = 17;
*v35 = 1;
if( v14 )
{
v13 = PiDmGetObject(ObjectType, ObjectName, &Object);
if( v13 >= 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v23 = Object;
BufferSize = v20[6];
v21 = BufferSize;
v31 = Object;
--CurrentThread->Tcb.KernelApcDisable;
v24 = Object;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Object, 0i64);
v25 = *(_PI_DM_OBJECT *)((char *)v23 + v21);
if( v25 == 0x80000000 )
{
v26 = (_QWORD **)((char *)v24 + PiDmListDefs[5 * *((int *)v20 + 10) + 1]);
v27 = *v26;
if( *v26 != v26 )
{
do
{
v28 = (char *)v27 - PiDmListDefs[5 * *((int *)v20 + 10) + 3];
ObjectProperty = PnpGetObjectProperty(
*(&stru_140CF2E80 + 1214),
*((_QWORD *)v28 + 2),
*((unsigned int *)v28 + 7),
0i64,
0i64,
v20[1],
(INT64)&v33,
(INT64)&v32);
v13 = ObjectProperty;
if( ObjectProperty < 0 )
{
if( ObjectProperty != -1073741275 )
goto LABEL_19;
}
else if( v33 == 17 && (_BYTE)v32 == 0xFF )
{
++v8;
}
v27 = (_QWORD *)*v27;
}
while( v27 != v26 );
v21 = BufferSize;
}
*(_PI_DM_OBJECT *)((char *)v31 + v21) = v8;
v25 = v8;
}
*v11 = (v25 <= 0) - 1;
v13 = 0;
LABEL_19:
ExReleasePushLockEx((ULONG_PTR)v24, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
PiDmObjectRelease(Object);
}
}
else
{
return -1073741789;
}
}
}
return v13;
}Referenced by:
PiPnpRtlObjectActionCallback