PiDevCfgQueryObjectProperties
NTSTATUS __stdcall PiDevCfgQueryObjectProperties(
WCHAR *ObjectName,
PNP_OBJECT_TYPE ObjectType,
VOID *ObjectBaseKey,
PI_DEVCFG_QUERY_PROPERTY_PARAM *PropertyParams,
UINT64 PropertyCount,
UINT64 arg28){
INT64 v6;
int ObjectProperty;
VOID **v8;
int v9;
UINT64 v10;
int v11;
INT64 v12;
_UNICODE_STRING *v13;
size_t MaximumLength;
void *v15;
UINT64 v17;
VOID **PoolWithTag;
wchar_t *StringRoutine;
int v20;
int v21;
int v22;
VOID *Handle;
ULONG Tag[2];
INT64 v25;
unsigned int v26;
v26 = (unsigned int)ObjectBaseKey;
v25 = *(_QWORD *)&ObjectType;
v6 = 0i64;
*(_QWORD *)Tag = *(&stru_140CF2E80 + 607);
ObjectProperty = 0;
Handle = 0i64;
v8 = 0i64;
v21 = 1;
v9 = 0;
if( !PropertyParams )
{
v20 = PnpOpenObjectRegKey(
*(&stru_140CF2E80 + 607),
*(__int64 *)&ObjectType,
(unsigned int)ObjectBaseKey,
33554433,
0,
(__int64)&Handle);
v6 = 0i64;
ObjectProperty = v20;
if( v20 < 0 )
goto LABEL_21;
}
v22 = 0;
if( !(_DWORD)arg28 )
goto LABEL_21;
v10 = PropertyCount + 8;
while( 1 )
{
v11 = *(_DWORD *)(v10 + 20);
v12 = *(_QWORD *)(v10 + 8);
if( (v11 & 4) != 0 )
{
v13 = *(_UNICODE_STRING **)(v10 + 8);
v12 = *(_QWORD *)(v12 + 8);
MaximumLength = v13->MaximumLength;
}
else
{
MaximumLength = *(_DWORD *)(v10 + 16);
v13 = (_UNICODE_STRING *)v6;
}
if( (v11 & 2) != 0 )
{
if( !v8 )
{
v9 = 260;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x104ui64, 1667526736i64);
v6 = 0i64;
v8 = PoolWithTag;
if( !PoolWithTag )
{
ObjectProperty = -1073741670;
goto LABEL_21;
}
}
v12 = (INT64)v8;
MaximumLength = v9;
}
v15 = Handle;
if( PropertyParams )
v15 = PropertyParams;
ObjectProperty = PnpGetObjectProperty(Tag[0], v25, v26, (INT64)v15, v6, *(_QWORD *)(v10 - 8), (INT64)&v21, v12);
if( ObjectProperty == -1073741789 )
{
if( (*(_DWORD *)(v10 + 20) & 2) != 0 )
ObjectProperty = -1073741595;
v6 = 0i64;
goto LABEL_14;
}
v6 = 0i64;
if( ObjectProperty == -1073741670 )
goto LABEL_19;
if( ObjectProperty >= 0 )
{
v17 = 0i64;
if( v21 )
{
if( v21 != *(_DWORD *)v10 )
{
ObjectProperty = -1073741823;
goto LABEL_14;
}
if( v21 == 18 || v21 == 20 || v21 == 25 )
{
if( !PnpValidateStringData(v12, 0) )
ObjectProperty = -1073741823;
}
else if( v21 == 8210 && !PnpValidateMultiSzData((_WORD *)v12, 0) )
{
ObjectProperty = -1073741823;
}
}
else
{
*(_DWORD *)v10 = 0;
}
if( ObjectProperty >= 0 )
{
if( v13 && (unsigned int)v17 > 0xFFFE )
ObjectProperty = -2147483643;
if( ObjectProperty >= 0 )
break;
}
}
LABEL_14:
*(_DWORD *)(v10 + 24) = ObjectProperty;
if( ObjectProperty < 0 )
{
if( (*(_DWORD *)(v10 + 20) & 8) == 0 )
{
LABEL_16:
if( (*(_DWORD *)(v10 + 20) & 1) != 0 )
goto LABEL_19;
ObjectProperty = v6;
goto LABEL_18;
}
if( v13 )
{
RtlInitUnicodeString(v13, 0i64);
}
else
{
if( !v12 )
goto LABEL_16;
memset((VOID *)v12, 0i64, MaximumLength);
}
v6 = 0i64;
goto LABEL_16;
}
LABEL_18:
v10 += 40i64;
if( ++v22 >= (unsigned int)arg28 )
goto LABEL_19;
}
if( (*(_DWORD *)(v10 + 20) & 2) == 0 )
goto LABEL_35;
if( v13 )
{
StringRoutine = (wchar_t *)ExpAllocateStringRoutine(v17);
v13->Buffer = StringRoutine;
if( !StringRoutine )
goto LABEL_62;
v13->MaximumLength = 0;
goto LABEL_47;
}
StringRoutine = (wchar_t *)ExAllocatePoolWithTag(1ui64, v17, 1667526736i64);
v12 = (INT64)StringRoutine;
if( StringRoutine )
{
LABEL_47:
memmove(StringRoutine, v8, 0);
LODWORD(v17) = 0;
v6 = 0i64;
LABEL_35:
if( v13 )
{
v13->Length = v17;
}
else
{
if( (*(_DWORD *)(v10 + 20) & 2) != 0 )
{
**(_QWORD **)(v10 + 8) = v12;
LODWORD(v17) = 0;
}
*(_DWORD *)(v10 + 16) = v17;
}
goto LABEL_14;
}
LABEL_62:
ObjectProperty = -1073741670;
LABEL_19:
if( v8 )
ExFreePoolWithTag(v8, 0);
LABEL_21:
if( Handle )
ZwClose((_HANDLE)Handle);
return ObjectProperty;
}Referenced by:
PiDevCfgCheckDeviceNeedsUpdate
PiDevCfgConfigureDevice
PiDevCfgFindDeviceMigrationNode
PiDevCfgGetDriverPackageId
PiDevCfgInitDeviceContext
PiDevCfgLogDeviceConfigured
PiDevCfgLogDeviceStarted
PiDevCfgProcessDevice
PiDevCfgQueryDriverConfiguration
PiDevCfgQueryDriverNode
PpDevCfgInit
PpDevCfgProcessDeviceExtensions
PpDevCfgProcessDeviceReset