PiDevCfgQueryDriverConfiguration
NTSTATUS __stdcall PiDevCfgQueryDriverConfiguration(PI_DEVCFG_DRIVER_NODE *DriverNode){
PI_DEVCFG_DRIVER_NODE v1;
int ObjectProperties;
_KEXCEPTION_FRAME *v4;
int v5;
WCHAR *v6;
WCHAR *v7;
WCHAR *v8;
PI_DEVCFG_QUERY_PROPERTY_PARAM *v9;
__int64 v10;
char Long;
PI_DEVCFG_DRIVER_NODE v13;
__int64 v14;
__int64 v15;
UINT64 arg28;
_MMPTE EndPxe;
_UNICODE_STRING DestinationString;
UINT64 PropertyCount[56];
v1 = DriverNode[46];
LOWORD(EndPxe.u.Long) = 0;
*(_QWORD *)&DestinationString.Length = 0i64;
DestinationString.Buffer = 0i64;
if( (v1 & 0x20) != 0 )
{
v4 = (_KEXCEPTION_FRAME *)*((_QWORD *)DriverNode + 4);
}
else
{
ObjectProperties = PiDevCfgBuildDriverConfigurationId(DriverNode, (_UNICODE_STRING *)(DriverNode + 98));
if( ObjectProperties < 0 )
goto LABEL_43;
if( !*((_QWORD *)DriverNode + 3) )
goto LABEL_44;
v4 = (_KEXCEPTION_FRAME *)*((_QWORD *)DriverNode + 4);
}
if( !v4 )
goto LABEL_44;
memset(PropertyCount, 0i64, sizeof(PropertyCount));
LODWORD(PropertyCount[4]) = 0x1000000;
LODWORD(PropertyCount[11]) = 117440512;
LODWORD(PropertyCount[1]) = 288;
LODWORD(PropertyCount[18]) = 117440512;
PropertyCount[2] = (UINT64)L"Service";
LODWORD(PropertyCount[25]) = 0x4000000;
LODWORD(PropertyCount[8]) = 304;
PropertyCount[9] = (UINT64)L"LowerFilters";
LODWORD(PropertyCount[15]) = 304;
PropertyCount[16] = (UINT64)L"UpperFilters";
LODWORD(PropertyCount[32]) = 117440512;
PropertyCount[23] = (UINT64)L"ConfigFlags";
LODWORD(PropertyCount[29]) = 304;
PropertyCount[24] = (UINT64)(DriverNode + 96);
LODWORD(PropertyCount[39]) = 117440512;
PropertyCount[30] = (UINT64)L"IncludedInfs";
LODWORD(PropertyCount[36]) = 304;
PropertyCount[37] = (UINT64)L"IncludedConfigs";
LODWORD(PropertyCount[46]) = 0x4000000;
PropertyCount[44] = (UINT64)L"Reboot";
LODWORD(PropertyCount[43]) = 288;
PropertyCount[45] = (UINT64)(DriverNode + 97);
PropertyCount[3] = (UINT64)(DriverNode + 72);
PropertyCount[10] = (UINT64)(DriverNode + 76);
PropertyCount[17] = (UINT64)(DriverNode + 80);
LODWORD(PropertyCount[22]) = 292;
PropertyCount[31] = (UINT64)(DriverNode + 84);
PropertyCount[38] = (UINT64)(DriverNode + 88);
LOBYTE(v5) = RtlpQueryRegistryValues((_KTRAP_FRAME *)0xC0000000i64, v4);
ObjectProperties = v5;
if( v5 == -1073741772 )
goto LABEL_44;
if( v5 < 0 )
goto LABEL_43;
if( *((_WORD *)DriverNode + 152) <= 2u && *((_QWORD *)DriverNode + 39) )
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 19);
if( *((_WORD *)DriverNode + 160) <= 2u && *((_QWORD *)DriverNode + 41) )
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 20);
if( *((_WORD *)DriverNode + 168) <= 2u && *((_QWORD *)DriverNode + 43) )
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 21);
if( *((_WORD *)DriverNode + 176) <= 2u && *((_QWORD *)DriverNode + 45) )
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 22);
if( (DriverNode[46] & 0x20) != 0 )
{
v13 = DriverNode[26];
if( (v13 & 4) == 0 && *((_QWORD *)DriverNode + 37) )
{
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 18);
v13 = DriverNode[26];
}
if( (v13 & 2) == 0 )
{
if( *((_QWORD *)DriverNode + 39) )
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 19);
if( *((_QWORD *)DriverNode + 41) )
RtlFreeAnsiString((_UNICODE_STRING *)DriverNode + 20);
}
}
v6 = (WCHAR *)*((_QWORD *)DriverNode + 37);
if( !v6 || !*((_WORD *)DriverNode + 144) )
goto LABEL_26;
ObjectProperties = PiDevCfgVerifyService(v6, (UINT8 *)&EndPxe.u.Long + 1, (UINT64 *)DriverNode + 51);
if( ObjectProperties < 0 )
{
LABEL_44:
ObjectProperties = -1073740653;
goto LABEL_43;
}
if( BYTE1(EndPxe.u.Long) )
DriverNode[46] |= 0x10u;
LABEL_26:
v7 = (WCHAR *)*((_QWORD *)DriverNode + 39);
if( !v7 )
goto LABEL_77;
while( *v7 )
{
ObjectProperties = PiDevCfgVerifyService(v7, 0i64, 0i64);
if( ObjectProperties < 0 )
{
ObjectProperties = -1073740653;
break;
}
v14 = -1i64;
do
++v14;
while( v7[v14] );
v7 += v14 + 1;
}
if( ObjectProperties >= 0 )
{
LABEL_77:
v8 = (WCHAR *)*((_QWORD *)DriverNode + 41);
if( !v8 )
goto LABEL_28;
while( *v8 )
{
ObjectProperties = PiDevCfgVerifyService(v8, 0i64, 0i64);
if( ObjectProperties < 0 )
{
ObjectProperties = -1073740653;
break;
}
v15 = -1i64;
do
++v15;
while( v8[v15] );
v8 += v15 + 1;
}
if( ObjectProperties >= 0 )
{
LABEL_28:
if( (DriverNode[46] & 0x20) != 0 )
{
LABEL_42:
DriverNode[46] |= 1u;
goto LABEL_43;
}
memset(PropertyCount, 0i64, 0xA0u);
v9 = (PI_DEVCFG_QUERY_PROPERTY_PARAM *)*((_QWORD *)DriverNode + 2);
v10 = *((_QWORD *)DriverNode + 8);
PropertyCount[0] = (UINT64)DEVPKEY_DriverPackage_ClassGuid;
LODWORD(arg28) = 4;
LODWORD(PropertyCount[1]) = 13;
PropertyCount[5] = (UINT64)&DEVPKEY_DriverPackage_ProviderName;
PropertyCount[10] = (UINT64)DEVPKEY_DriverPackage_NeedsReconfig;
PropertyCount[12] = (UINT64)&EndPxe;
PropertyCount[2] = (UINT64)(DriverNode + 60);
PropertyCount[15] = (UINT64)DEVPKEY_DriverPackage_GroupIds;
PropertyCount[17] = (UINT64)&DestinationString;
LODWORD(PropertyCount[3]) = 16;
LODWORD(PropertyCount[6]) = 18;
PropertyCount[7] = (UINT64)(DriverNode + 68);
HIDWORD(PropertyCount[8]) = 6;
LODWORD(PropertyCount[11]) = 17;
LODWORD(PropertyCount[13]) = 1;
LODWORD(PropertyCount[16]) = 8210;
HIDWORD(PropertyCount[18]) = 6;
ObjectProperties = PiDevCfgQueryObjectProperties((WCHAR *)6, v10, (VOID *)8, v9, (UINT64)PropertyCount, arg28);
if( ObjectProperties >= 0 )
{
if( SLODWORD(PropertyCount[4]) < 0 )
{
*((_OWORD *)DriverNode + 15) = 0i64;
}
else
{
ObjectProperties = RtlStringFromGUIDEx((_GUID *)DriverNode + 15, (_UNICODE_STRING *)DriverNode + 16, 1u);
if( ObjectProperties < 0 )
goto LABEL_43;
}
if( SLODWORD(PropertyCount[9]) < 0 )
RtlInitUnicodeString((PUNICODE_STRING)DriverNode + 17, 0i64);
Long = EndPxe.u.Long;
if( SLODWORD(PropertyCount[14]) < 0 )
Long = 0;
LOBYTE(EndPxe.u.Long) = Long;
if( Long == -1 )
DriverNode[46] |= 0x40u;
if( SLODWORD(PropertyCount[19]) < 0 )
RtlInitUnicodeString(&DestinationString, 0i64);
if( DestinationString.Buffer && DestinationString.Length > 2u )
DriverNode[46] |= 0x80u;
ObjectProperties = PiDevCfgQueryIncludedDriverConfigurations(DriverNode);
if( ObjectProperties >= 0 )
goto LABEL_42;
}
}
}
LABEL_43:
RtlFreeAnsiString(&DestinationString);
return ObjectProperties;
}Referenced by:
PiDevCfgCheckDeviceNeedsUpdate
PiDevCfgConfigureDevice
PiDevCfgQueryIncludedDriverConfigurations
PiDevCfgRequestDriverConfigurations
PpDevCfgProcessDeviceExtensions